diff --git a/.cargo/config.toml b/.cargo/config.toml index 135bcaf9..eabc8fdc 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,3 +1,3 @@ [alias] tests-relay = "test" -tests-with-db = "test --features cloud_db_tests -- --test-threads=1" \ No newline at end of file +test-integration = "test --features cloud_integration_tests -- --test-threads=1" \ No newline at end of file diff --git a/.env b/.env index 8173cb33..c8e3ba99 100644 --- a/.env +++ b/.env @@ -1,74 +1,16 @@ -ENV=DEV # PROD or DEV -ONLY_RELAY_SERVICE=TRUE # TRUE - This will start only nightly relay service without cloud service +ENV=PROD # PROD or DEV +ONLY_RELAY_SERVICE=FALSE # TRUE - This will start only nightly relay service without cloud service NONCE=VERY_SECRET_NONCE -# Generated so it can work with grafana -# ssh-keygen -t rsa -b 4096 -m PEM -f grafana.key -N "" -# openssl rsa -in grafana.key -pubout -outform PEM -out grafana.key.pub -# TEST KEY DO NO USE IN PRODUCTION -JWT_SECRET="-----BEGIN RSA PRIVATE KEY----- -MIIJKQIBAAKCAgEAzlUYIpqSUAyLJaf8ZUef06YBh5DcmaTrwGcVwC57VtywY7bH -XQUtGooULQjiYgnyOPxHDt2W+gQW1axiMxOQew0MF0kXYQhg0+WA1dcWOsxCDpyL -c4z+E7EmdV7MTuvsDR2TLhZ6DFmVbN4ca64Wvftz//3Ptc/I1/VpfGsHWb0Vpmph -kbE9vWGHzzJVp/Lvtk7ybcpfxiiNWEi7unr7/TIEsqy93lCRfpLKIvO06ITH1GZz -7+VPL/8q8lrH5kSwxqo5szq1mEa0pNN6hTpocz00x5oBfL9K/TNLQNgdb5uOOfjQ -9pYtZ49UDyMLs5lCsZ6ue+SIbWrJXDEPMIEgLzx9nnvytL9wbiwo5GQdIaDAZXMw -VVdKQGyqx+UhaHmrb1u0RVRcFzO/QPWzNCWvoxJGfg9dVTxfjaa1HzQ0irPs86zC -QUnt0OyTuq0SmUgTCNXLSQaN8MigN++zwT4cIRDB0WMgmu8sxtnmA3Zq+2GYT97j -mbdVMB34DVbXI4UigD3UieVe4rO95cEssoUTAFG0pthv64BRKIIRNch+eiBBjkGp -nWKRybzsmqnEqpMf9v7KQU9hmpBJDbi6KA6w3fg3KSroJZwosbAwdBuylCfQgq1j -Z6UfR/ss9kYGhaWbCB3ARmY9XHFc+OZuFW0pohgfBfs9RDMDVkTa4tzBAGsCAwEA -AQKCAgB/cQHCRdS/SrAbZyG28MFgObXSJQCMidfvc/x0QoF+CjuMq1WCN/M+5DBI -DKe/RENvPSsqnGVnMWVlPt88iwX/avSf4U5maYVc+/FSo1IgqQ7X9YsQqPI5+X42 -moH48TFQfIbuvYVO4XowzxOg0ttLJufkIsHLm3aDJRqtdXIJ1IdtzWFMWrw2n+oB -aSaM4Ll80lBczdXQEDYVZH9HVDUWk3FhZt6zVPI4yrO9WOfRgknnAAz2DJ2XmLTP -EpFLwfuqCXQwJsAJOQrUj6aqaYQgQZq6+n2WrpTDxY3ilFnCGMOFPRDcba/HujiC -TPQqTyxphwhgj6xQYNfUcJzgKbFVPkcp2Y72feu4dPwRn9v/9zflsezPg33mjNLD -ls2XrA1S+UKQpiLbF5Mv6U0MxuFRoZIVhSflA/FGHgIE+IGiMDWPLQVpTBJYDjWG -9giRRBOm4qf9CPPJVnJVEkibDbsKnRTMOPSRBgNBYvpiMO06hWsNktntJ/iqvgf0 -2L//kQEPUTx5+RdSjarQNw0tU7nQid0mf1e3rEXfitr77E6dp+T+2POXQzr2lTFA -QzaWkIRNNJqCBI/aUhEkAnx2kVlzgLBGYVtAwlCZVF9r0VphmAIQdSeaiI/4N3zh -jPl0jVYQCKUPe7FslC6f/hks6Y+uMJIeph9XHdYBvcDWZcZCCQKCAQEA/vhsO+vR -vFRu4q6cvruFoEqODjZnwYUdYKnSa7O2ZTn3VkUE197pL5tSc2At9txZ6AFZ28ye -ZDUsx+IOvt2PUfJAo7cAL6Vx9TTEMlDcSs0LFRKIrE5lI9hMHOu1evJxN9s3jivZ -rp0PLEGrllcKIOg5+Zh/yXQue0R2b3H3/f7BdvMS4gjZq8NF0SDLe/WL2PQ0baSL -MLC8048CDM3BVzjxx2u6ghFambJ0fJIID6DAvkdrNZ/loie71sEVJdJiY3jra/Mq -JCOZJlRBTevVSfI0uqtybv1QYaU+Mqth8fZxWvhC14Rf30VLEWp9GV0u7Q9p0baj -nXay/kwXE7uvJQKCAQEAzypkQ6BodHU2FRPpU4wytsowTVbcQs5DNr9ayrTyuPGa -ydGRzJ0/qHzAv/rWjImny7r8uuvDfNXAxRI5kbAJMImrbG6zjmLHwYKCrB1GFsx1 -QRRuDiMFbblVitA1XHs/sSM0VdO18nLYPY71uIEaTKZTxd1rYuxam3SwZ7prTUGH -zfI8S4G5vnAn2nWUHmbSNKdtBPqMf65pPGPkKmzBUd++1mvmdsVroGxi37n5vL66 -cUKlvQ5u+l1cqV/EWC6wIoJhrsgkfAO7aFSZQIXIdUeh2C57oFoVdCWULhN09quB -XIRularP7IC/0e7dMAf5tyQ7Z90/zyMqEpMyX6XkTwKCAQEA5JbMUpyFmRcJoulx -Vf7BOogc+9kDBJjXUcZvBGhGalKh0RJn2THcVfYm4ZGlI+FCKaKscUbt6mFSGJIv -LidtSsap9R0oaY8mr/PywjmEhvt1qBrJtdFDE/PjqToZpnSd1LoRAMGHk+jzpXXq -5Ap85ivNblyulGo5EgK7PActkuZHhOFAWK4emMOlYGzKggQOsR+fsX0H3UtWv0VD -TT9ay1weR+/pcpskYw9/J/+0gm5Y3z8gex8zvUFqQosw7ovD8fKC/nEvot7Xe2mm -crmwq28enwz+t0scOa7wKHVGhquvzSMuqhHf8kgpmR+jsI2+eIKNGJtp7M5yg1Ks -jeCCkQKCAQAP3/G69OnMMscoKlRw4IdqVmgJJSTPwbqI0XUFn4QSBAGWgYaopUwh -fx3OGEykjE/dXsDLGhHq2P5im5jpvxGVNJd8Qadku9EO1Q9qXPvn91bs28HrN2fN -FqylbHsKUS96RXZXNVf18jL71J6jutDnGr/Eo8j81ZvD2ddCu5hJXUIo1+0i5Bf1 -reZ/6Q6mnb5x5nqGLSTjC9xokkcDsT3HJlwbVj1c0JgEvQl+l2O5wOvMjgzhRd/f -M5RMLlh/YWSB4HfXyuJw1mBgCEuOFDJeOlT+meFDUmPeeJq4RSlrVY0eJ8/JjENO -njcUwTcV3SaXkCE1PlELcGhi8ACmL7IlAoIBAQDRR/cQe7/6jIfEXbCemkWQ5Drs -CF6jk7gUREbNiTpfWUYSa4DcsyB5phvn2MTM/rsunWtKBrRl7FwDPZcIHrNnsp1U -w/OPG9nl9ScULy34hwksYShrFZPGeWM8dg+zB1LpwgzsirQiXqmu5FDUrzmCqLM6 -8GYuZHYXowAU0LDUtn/z8Mqv05HR/NwTZxDlxyJMIdVdoUYyWtYUAHb5p839N1Qx -tj4b9QGK2SBDcOQwq8eCnK/DUjIBUTL+4DNSDeQCr8gc82SwkoZGBCwIWQH+ZwDz -noL/o/3a5OnNQI0eB7/0g6ElR8BmkeZy1sZXaxZ3caatctEUuUgVFYuVkf9m ------END RSA PRIVATE KEY----- -" -JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzlUYIpqSUAyLJaf8ZUef -06YBh5DcmaTrwGcVwC57VtywY7bHXQUtGooULQjiYgnyOPxHDt2W+gQW1axiMxOQ -ew0MF0kXYQhg0+WA1dcWOsxCDpyLc4z+E7EmdV7MTuvsDR2TLhZ6DFmVbN4ca64W -vftz//3Ptc/I1/VpfGsHWb0VpmphkbE9vWGHzzJVp/Lvtk7ybcpfxiiNWEi7unr7 -/TIEsqy93lCRfpLKIvO06ITH1GZz7+VPL/8q8lrH5kSwxqo5szq1mEa0pNN6hTpo -cz00x5oBfL9K/TNLQNgdb5uOOfjQ9pYtZ49UDyMLs5lCsZ6ue+SIbWrJXDEPMIEg -Lzx9nnvytL9wbiwo5GQdIaDAZXMwVVdKQGyqx+UhaHmrb1u0RVRcFzO/QPWzNCWv -oxJGfg9dVTxfjaa1HzQ0irPs86zCQUnt0OyTuq0SmUgTCNXLSQaN8MigN++zwT4c -IRDB0WMgmu8sxtnmA3Zq+2GYT97jmbdVMB34DVbXI4UigD3UieVe4rO95cEssoUT -AFG0pthv64BRKIIRNch+eiBBjkGpnWKRybzsmqnEqpMf9v7KQU9hmpBJDbi6KA6w -3fg3KSroJZwosbAwdBuylCfQgq1jZ6UfR/ss9kYGhaWbCB3ARmY9XHFc+OZuFW0p -ohgfBfs9RDMDVkTa4tzBAGsCAwEAAQ== ------END PUBLIC KEY----- -" \ No newline at end of file +MAILER_ADDRESS=do_not_reply@nightly.app +# Different than db address specified in infra/.env due to docker shenanigans, used in setting up datasource in grafana +# This is a address of the whole docker interface not just container with database +# Can be found by looking for docker0 entry by sing command ifconfig/ip -a +DATABASE_ADDRESS=172.17.0.1 +GRAFANA_BASE_PATH=http://localhost:3005/api +# TEST LOGIN DO NO USE IN PRODUCTION +GF_SECURITY_ADMIN_USER=admin +# TEST PASSWORD DO NO USE IN PRODUCTION +GF_SECURITY_ADMIN_PASSWORD=admin +# TEST PASSWORD DO NO USE IN PRODUCTION +MAILER_PASSWORD=ZtA5gFKMsXzHmEm +MAILER_ACTIVE=TRUE \ No newline at end of file diff --git a/.github/workflows/connect-test-local.yml b/.github/workflows/connect-test-local.yml index 43816626..0669cab0 100644 --- a/.github/workflows/connect-test-local.yml +++ b/.github/workflows/connect-test-local.yml @@ -13,6 +13,8 @@ jobs: timeout-minutes: 10 runs-on: [testing] steps: + - name: Set CI Environment Variable + run: echo "CI_ENVIRONMENT=true" >> $GITHUB_ENV - name: Fix permissions continue-on-error: true run: | @@ -31,9 +33,24 @@ jobs: - name: Setup Infra working-directory: ./infra run: | - docker-compose down + docker-compose --profile full down rm -rf .infra/target + rm -rf .infra/backups + rm -rf .infra/config + rm -rf .infra/logs + rm -rf .infra/ofelia_logs + echo ${{secrets.TESTING_LAPTOP_PASSWORD}} | sudo -S ./scripts/clean_start.sh + - name: Setup Grafana + working-directory: ./grafana + run: | + echo "GRAFANA_USER_ID=$(id -u):$(id -g)" >> $GITHUB_ENV + rm -rf ./grafana-data + mkdir -p ./grafana-data + echo ${{secrets.TESTING_LAPTOP_PASSWORD}} | sudo -S chmod 777 -R ${{ env.GRAFANA_USER_ID }} ./grafana-data + docker-compose down docker-compose up -d --no-deps --force-recreate --remove-orphans + env: + GRAFANA_USER_ID: ${{ env.GRAFANA_USER_ID }} - uses: actions-rs/toolchain@v1 with: toolchain: stable @@ -50,13 +67,25 @@ jobs: working-directory: ./infra run: | ( docker-compose logs --follow & ) | grep -q "database system is ready to accept connections" + + if [[ "$FAILURE" -eq 1 ]]; then + echo "Database init failed. Printing last 20 log entries:" + docker-compose logs | tail -n 20 + fi + - name: Wait for Grafana + continue-on-error: true + timeout-minutes: 2 + working-directory: ./grafana + run: | + ( docker-compose logs --follow & ) | grep -q "Update check succeeded" - name: Prepare db tables run: | cargo run --bin tables_migration - name: run cargo test run: | - cargo tests-with-db + cargo test-integration cargo run --bin nightly-connect-server & + sleep 50 - name: test base local run: | pnpm test:ci @@ -69,8 +98,29 @@ jobs: run: | pnpm test:ci working-directory: ./sdk/packages/sui + - name: kill-nightly-connect + run: | + kill $(pgrep -f 'nightly-connect-server') + - name: run connect with db + run: | + cargo run --bin nightly-connect-server & + sleep 5 + env: + ONLY_RELAY_SERVICE: FALSE + - name: test cloud local + run: | + pnpm test:ci + working-directory: ./sdk/packages/cloud + - name: test analytics local + run: | + pnpm test:ci + working-directory: ./sdk/packages/analytics - name: Clean target working-directory: ./infra run: | - docker-compose down + docker-compose --profile down rm -rf .infra/target + rm -rf .infra/backups + rm -rf .infra/config + rm -rf .infra/logs + rm -rf .infra/ofelia_logs diff --git a/.gitignore b/.gitignore index 1b899350..7ca4ec9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,9 @@ /target /Cargo.lock -/.vscode \ No newline at end of file +/.vscode +/grafana-client-gen/build +/infra/target +/infra/config +/infra/logs +/infra/backups +/infra/ofelia_logs diff --git a/Cargo.toml b/Cargo.toml index 951aa19a..da1d4f66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["server", "database"] +members = ["server", "database", "openapi"] [workspace.dependencies] ctrlc = "3.4.2" @@ -27,9 +27,17 @@ tower = { version = "0.4.13", features = [ "limit", ] } tower-http = { version = "0.5.2", features = ["cors", "trace"] } -reqwest = {version = "0.11.24", features = ["json"]} +reqwest = { version = "0.11.24", features = ["json"] } tokio = { version = "1.35.1", features = ["full"] } async-trait = "0.1.77" +r-cache = "0.5.0" +lettre = "0.11.6" +addr = "0.15.6" +hickory-resolver = "0.24.0" +webauthn-rs = { version = "0.4.8", features = [ + "danger-allow-state-serialisation", +] } +sha256 = "1.5.0" # If you're updating sqlx, make sure that chrono version below is the same as the one in sqlx sqlx = { version = "0.7.3", features = [ @@ -39,4 +47,9 @@ sqlx = { version = "0.7.3", features = [ "postgres", "chrono", ] } -chrono = { version = "0.4.22", features = ["serde"] } \ No newline at end of file +chrono = { version = "0.4.22", features = ["serde"] } +configparser = "3.1.0" + +[profile.dev] +debug = 0 +strip = "debuginfo" diff --git a/database/Cargo.toml b/database/Cargo.toml index ecbfd1ef..a8641a1b 100644 --- a/database/Cargo.toml +++ b/database/Cargo.toml @@ -16,6 +16,12 @@ log = { workspace = true } strum = { workspace = true } anyhow = { workspace = true } chrono = { workspace = true } +webauthn-rs = { workspace = true } +uuid7 = { workspace = true } + +[dev-dependencies] +rand = { workspace = true } +futures = { workspace = true } [features] -cloud_db_tests = [] \ No newline at end of file +cloud_integration_tests = [] \ No newline at end of file diff --git a/server/bindings/Device.ts b/database/bindings/Device.ts similarity index 100% rename from server/bindings/Device.ts rename to database/bindings/Device.ts diff --git a/server/bindings/DeviceMetadata.ts b/database/bindings/DeviceMetadata.ts similarity index 91% rename from server/bindings/DeviceMetadata.ts rename to database/bindings/DeviceMetadata.ts index e6b76554..29d829b7 100644 --- a/server/bindings/DeviceMetadata.ts +++ b/database/bindings/DeviceMetadata.ts @@ -2,4 +2,4 @@ import type { MobileMetadata } from "./MobileMetadata"; import type { WebMetadata } from "./WebMetadata"; -export type DeviceMetadata = { mobile: MobileMetadata } | { web: WebMetadata }; \ No newline at end of file +export type DeviceMetadata = { mobile: MobileMetadata } | { web: WebMetadata } | "unknown"; \ No newline at end of file diff --git a/server/bindings/TransactionToSign.ts b/database/bindings/DomainVerificationStatus.ts similarity index 58% rename from server/bindings/TransactionToSign.ts rename to database/bindings/DomainVerificationStatus.ts index c031c34d..d8437c5f 100644 --- a/server/bindings/TransactionToSign.ts +++ b/database/bindings/DomainVerificationStatus.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface TransactionToSign { transaction: string, metadata?: string, } \ No newline at end of file +export type DomainVerificationStatus = "Pending" | "Verified" | "Cancelled"; \ No newline at end of file diff --git a/server/bindings/MobileMetadata.ts b/database/bindings/MobileMetadata.ts similarity index 100% rename from server/bindings/MobileMetadata.ts rename to database/bindings/MobileMetadata.ts diff --git a/server/bindings/HttpAddUserToTeamResponse.ts b/database/bindings/PaginationCursor.ts similarity index 70% rename from server/bindings/HttpAddUserToTeamResponse.ts rename to database/bindings/PaginationCursor.ts index f642bfce..d580da1f 100644 --- a/server/bindings/HttpAddUserToTeamResponse.ts +++ b/database/bindings/PaginationCursor.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export type HttpAddUserToTeamResponse = null; \ No newline at end of file +export type PaginationCursor = string; \ No newline at end of file diff --git a/server/bindings/WebMetadata.ts b/database/bindings/WebMetadata.ts similarity index 51% rename from server/bindings/WebMetadata.ts rename to database/bindings/WebMetadata.ts index f8593fdc..821d4462 100644 --- a/server/bindings/WebMetadata.ts +++ b/database/bindings/WebMetadata.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface WebMetadata { browser: string, version: string, os: string, osVersion: string, } \ No newline at end of file +export interface WebMetadata { browser: string, browserVersion: string, os: string, osVersion: string, } \ No newline at end of file diff --git a/database/bindings/WhitelistedDomain.ts b/database/bindings/WhitelistedDomain.ts new file mode 100644 index 00000000..401700b1 --- /dev/null +++ b/database/bindings/WhitelistedDomain.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { DomainVerificationStatus } from "./DomainVerificationStatus"; + +export interface WhitelistedDomain { domain: string, status: DomainVerificationStatus, } \ No newline at end of file diff --git a/database/migrations/0000_extensions.sql b/database/migrations/0000_extensions.sql new file mode 100644 index 00000000..467262cc --- /dev/null +++ b/database/migrations/0000_extensions.sql @@ -0,0 +1 @@ +CREATE EXTENSION postgis; \ No newline at end of file diff --git a/database/migrations/0001_types.sql b/database/migrations/0001_types.sql index c4e61961..e1a0df40 100644 --- a/database/migrations/0001_types.sql +++ b/database/migrations/0001_types.sql @@ -35,12 +35,13 @@ CREATE TYPE geo_location AS ( CREATE TYPE event_type_enum AS ENUM ( 'AppConnect', 'AppDisconnect', - 'ClientConnectInit', - 'ClientConnectResolve' + 'ClientConnect', 'ClientDisconnect', - 'SingMessage', + 'SignMessage', 'SignTransaction', 'SignAndSendTransaction', 'ChangeWallet', 'ChangeNetwork' -); \ No newline at end of file +); + +CREATE TYPE device_medium_type_enum AS ENUM ('Browser', 'Mobile', 'Unknown'); \ No newline at end of file diff --git a/database/migrations/0002_team.sql b/database/migrations/0002_team.sql index 17139d1b..ed4fd046 100644 --- a/database/migrations/0002_team.sql +++ b/database/migrations/0002_team.sql @@ -1,9 +1,14 @@ CREATE TABLE team( team_id TEXT NOT NULL UNIQUE, + grafana_id TEXT UNIQUE, team_name TEXT NOT NULL, personal BOOLEAN NOT NULL, subscription subscription, team_admin_id TEXT NOT NULL, registration_timestamp TIMESTAMPTZ NOT NULL, - PRIMARY KEY (team_name, team_admin_id) -); \ No newline at end of file + deactivated_at TIMESTAMPTZ +); + +CREATE UNIQUE INDEX unique_active_team_name +ON team (team_admin_id, team_name) +WHERE deactivated_at IS NULL; \ No newline at end of file diff --git a/database/migrations/0003_grafana_users.sql b/database/migrations/0003_grafana_users.sql deleted file mode 100644 index a137b653..00000000 --- a/database/migrations/0003_grafana_users.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE grafana_users( - user_id TEXT NOT NULL UNIQUE, - email TEXT NOT NULL UNIQUE, - password_hash TEXT, - creation_timestamp TIMESTAMPTZ NOT NULL -); - -CREATE INDEX grafana_users_name_idx ON grafana_users(user_id); -CREATE INDEX grafana_users_email_idx ON grafana_users(email); \ No newline at end of file diff --git a/database/migrations/0003_users.sql b/database/migrations/0003_users.sql new file mode 100644 index 00000000..da39a956 --- /dev/null +++ b/database/migrations/0003_users.sql @@ -0,0 +1,11 @@ +CREATE TABLE users( + user_id TEXT NOT NULL UNIQUE, + email TEXT NOT NULL UNIQUE, + password_hash TEXT, + passkeys TEXT, + creation_timestamp TIMESTAMPTZ NOT NULL, + deactivated_at TIMESTAMPTZ +); + +CREATE INDEX users_name_idx ON users(user_id); +CREATE INDEX users_email_idx ON users(email); \ No newline at end of file diff --git a/database/migrations/0004_registered_apps.sql b/database/migrations/0004_registered_apps.sql index dd741ac7..ef66a156 100644 --- a/database/migrations/0004_registered_apps.sql +++ b/database/migrations/0004_registered_apps.sql @@ -4,7 +4,10 @@ CREATE TABLE registered_apps( app_name TEXT NOT NULL, whitelisted_domains TEXT [] NOT NULL, ack_public_keys TEXT [] NOT NULL, - registration_timestamp TIMESTAMPTZ NOT NULL + registration_timestamp TIMESTAMPTZ NOT NULL, + deactivated_at TIMESTAMPTZ ); -CREATE UNIQUE INDEX app_id_idx ON registered_apps(app_id); \ No newline at end of file +CREATE UNIQUE INDEX unique_active_app_name +ON registered_apps (team_id, app_name) +WHERE deactivated_at IS NULL; \ No newline at end of file diff --git a/database/migrations/0005_user_app_privilages.sql b/database/migrations/0005_user_app_privilages.sql index 8856530e..240384bd 100644 --- a/database/migrations/0005_user_app_privilages.sql +++ b/database/migrations/0005_user_app_privilages.sql @@ -4,6 +4,6 @@ CREATE TABLE user_app_privileges ( creation_timestamp TIMESTAMPTZ NOT NULL, privilege_level privilege_level_enum NOT NULL, PRIMARY KEY (user_id, app_id), - FOREIGN KEY (user_id) REFERENCES grafana_users (user_id) ON DELETE CASCADE, + FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE CASCADE, FOREIGN KEY (app_id) REFERENCES registered_apps (app_id) ON DELETE CASCADE ); diff --git a/database/migrations/0007_sessions.sql b/database/migrations/0007_sessions.sql index 70ae78a8..b83e3313 100644 --- a/database/migrations/0007_sessions.sql +++ b/database/migrations/0007_sessions.sql @@ -1,3 +1,7 @@ +CREATE TABLE networks ( + network TEXT PRIMARY KEY +); + CREATE TABLE sessions ( session_id TEXT NOT NULL, app_id TEXT NOT NULL, diff --git a/database/migrations/0009_connection_events.sql b/database/migrations/0009_connection_events.sql index 6b5c5e56..a6cbef8f 100644 --- a/database/migrations/0009_connection_events.sql +++ b/database/migrations/0009_connection_events.sql @@ -1,6 +1,7 @@ CREATE TABLE connection_events ( event_id BIGSERIAL NOT NULL, app_id TEXT NOT NULL, -- Always references the related app, whether an app or client connection + network TEXT NOT NULL, session_id TEXT NOT NULL, entity_id TEXT NOT NULL, -- The ID of the connecting entity (could be the same app_id or client_profile_id or client_id) entity_type entity_type_enum NOT NULL, -- Distinguishes between 'client' and 'app' diff --git a/database/migrations/0011_events_index.sql b/database/migrations/0011_events_index.sql index 6723b794..84233dc6 100644 --- a/database/migrations/0011_events_index.sql +++ b/database/migrations/0011_events_index.sql @@ -1,6 +1,21 @@ CREATE TABLE events( event_id BIGSERIAL, app_id TEXT NOT NULL, + network TEXT NOT NULL, event_type event_type_enum NOT NULL, - creation_timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW() + creation_timestamp TIMESTAMPTZ NOT NULL +); + +CREATE TABLE web_metadata( + uuid TEXT UNIQUE NOT NULL, + browser TEXT NOT NULL, + browser_version TEXT NOT NULL, + os TEXT NOT NULL, + os_version TEXT NOT NULL +); + +CREATE TABLE mobile_metadata( + uuid TEXT UNIQUE NOT NULL, + system_type TEXT NOT NULL, + system_version TEXT NOT NULL ); \ No newline at end of file diff --git a/database/migrations/0012_events_tables.sql b/database/migrations/0012_events_tables.sql index c4afd317..9e12a25b 100644 --- a/database/migrations/0012_events_tables.sql +++ b/database/migrations/0012_events_tables.sql @@ -1,10 +1,14 @@ CREATE TABLE event_app_connect( - event_id BIGINT PRIMARY KEY, + event_id BIGINT NOT NULL, + app_id TEXT NOT NULL, + network TEXT NOT NULL, session_id TEXT NOT NULL, - device_metadata TEXT NOT NULL, + device_medium_type device_medium_type_enum, + device_metadata_uuid TEXT, lang TEXT NOT NULL, timezone TEXT NOT NULL, - new_session BOOLEAN NOT NULL + new_session BOOLEAN NOT NULL, + creation_timestamp TIMESTAMPTZ NOT NULL ); CREATE TABLE event_app_disconnect( diff --git a/database/migrations/0014_domain_verifications.sql b/database/migrations/0014_domain_verifications.sql new file mode 100644 index 00000000..435b35f3 --- /dev/null +++ b/database/migrations/0014_domain_verifications.sql @@ -0,0 +1,20 @@ +CREATE TABLE domain_verifications( + domain_name TEXT NOT NULL, + app_id TEXT NOT NULL, + code TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + finished_at TIMESTAMPTZ, + cancelled_at TIMESTAMPTZ, + deleted_at TIMESTAMPTZ +); + +-- Safety measure to prevent verification blockade in case of malicious intent +CREATE UNIQUE INDEX idx_unique_verified_domains ON domain_verifications (domain_name) +WHERE finished_at IS NOT NULL AND deleted_at IS NULL; + +CREATE INDEX domain_verifications_app_id_idx ON domain_verifications(app_id); + +-- Safety measure to prevent multiple verification requests for the same domain for the same app +CREATE UNIQUE INDEX idx_unique_active_domain_verifications +ON domain_verifications (domain_name, app_id) +WHERE finished_at IS NULL AND cancelled_at IS NULL AND deleted_at IS NULL; \ No newline at end of file diff --git a/database/migrations/0014_create_hypertables.sql b/database/migrations/0015_create_hypertables.sql similarity index 50% rename from database/migrations/0014_create_hypertables.sql rename to database/migrations/0015_create_hypertables.sql index 3c39653e..5e087f0f 100644 --- a/database/migrations/0014_create_hypertables.sql +++ b/database/migrations/0015_create_hypertables.sql @@ -1,9 +1,11 @@ SELECT create_hypertable('connection_events', 'connected_at'); --- SELECT --- create_hypertable('requests', 'creation_timestamp'); - SELECT create_hypertable('sessions', 'session_open_timestamp'); +SELECT + create_hypertable('events', 'creation_timestamp'); + +SELECT + create_hypertable('event_app_connect', 'creation_timestamp'); \ No newline at end of file diff --git a/database/migrations/0015_requests_stats.sql b/database/migrations/0015_requests_stats.sql deleted file mode 100644 index 974a33bd..00000000 --- a/database/migrations/0015_requests_stats.sql +++ /dev/null @@ -1,96 +0,0 @@ --- ----------------- Hourly requests stats per app ----------------- --- --- View --- CREATE MATERIALIZED VIEW hourly_requests_stats_per_app WITH (timescaledb.continuous) AS --- SELECT --- app_id, --- time_bucket('1 hour' :: interval, creation_timestamp) AS hourly_bucket, --- COUNT(*) AS hourly_request_count, --- COUNT(*) FILTER ( --- WHERE --- request_status = 'Completed' --- ) :: FLOAT / NULLIF( --- COUNT(*) FILTER ( --- WHERE --- request_status IN ('Completed', 'Rejected', 'TimedOut') --- ), --- 0 --- ) AS hourly_success_rate --- FROM --- requests --- GROUP BY --- app_id, --- hourly_bucket WITH NO DATA; - --- --- Refresh policy --- SELECT --- add_continuous_aggregate_policy( --- 'hourly_requests_stats_per_app', --- start_offset => INTERVAL '3 h', --- end_offset => INTERVAL '1 h', --- schedule_interval => INTERVAL '1 h' --- ); - --- --- Real time aggregation --- ALTER MATERIALIZED VIEW hourly_requests_stats_per_app --- set --- (timescaledb.materialized_only = false); - - - --- ----------------- Daily requests stats per app ----------------- --- --- View --- CREATE MATERIALIZED VIEW daily_requests_stats_per_app WITH (timescaledb.continuous) AS --- SELECT --- app_id, --- time_bucket('1 day' :: interval, hourly_bucket) AS daily_bucket, --- SUM(hourly_request_count) :: BIGINT AS daily_request_count, --- SUM(hourly_request_count * hourly_success_rate) :: FLOAT / SUM(hourly_request_count) AS daily_success_rate --- FROM --- hourly_requests_stats_per_app --- GROUP BY --- app_id, --- daily_bucket WITH NO DATA; - --- --- Refresh policy --- SELECT --- add_continuous_aggregate_policy( --- 'daily_requests_stats_per_app', --- start_offset => INTERVAL '3 d', --- end_offset => INTERVAL '1 h', --- schedule_interval => INTERVAL '12 h' --- ); - --- --- Real time aggregation --- ALTER MATERIALIZED VIEW daily_requests_stats_per_app --- set --- (timescaledb.materialized_only = false); - - - --- ----------------- Monthly requests per app ----------------- --- --- View --- CREATE MATERIALIZED VIEW monthly_requests_stats_per_app WITH (timescaledb.continuous) AS --- SELECT --- app_id, --- time_bucket('1 month' :: interval, daily_bucket) AS monthly_bucket, --- SUM(daily_request_count) :: BIGINT AS monthly_request_count, --- SUM(daily_request_count * daily_success_rate) :: FLOAT / SUM(daily_request_count) AS monthly_success_rate --- FROM --- daily_requests_stats_per_app --- GROUP BY --- app_id, --- monthly_bucket WITH NO DATA; - --- --- Refresh policy --- SELECT --- add_continuous_aggregate_policy( --- 'monthly_requests_stats_per_app', --- start_offset => INTERVAL '3 month', --- end_offset => INTERVAL '1 h', --- schedule_interval => INTERVAL '1 month' --- ); - --- --- Real time aggregation --- ALTER MATERIALIZED VIEW monthly_requests_stats_per_app --- set --- (timescaledb.materialized_only = false); \ No newline at end of file diff --git a/database/migrations/0016_connection_stats.sql b/database/migrations/0016_connection_stats.sql deleted file mode 100644 index c1b38193..00000000 --- a/database/migrations/0016_connection_stats.sql +++ /dev/null @@ -1,84 +0,0 @@ ------------------ Hourly connection stats per app ----------------- ---- View -CREATE MATERIALIZED VIEW hourly_connection_stats_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 hour', connected_at) AS hourly_bucket, - COUNT(*) FILTER (WHERE entity_type = 'App') :: BIGINT AS hourly_app_connection_count, - COUNT(*) FILTER (WHERE entity_type = 'Client') :: BIGINT AS hourly_clients_connection_count -FROM - connection_events -GROUP BY - app_id, - hourly_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy('hourly_connection_stats_per_app', - start_offset => INTERVAL '2 day', - end_offset => INTERVAL '1 hour', - schedule_interval => INTERVAL '1 hour' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW hourly_connection_stats_per_app -set - (timescaledb.materialized_only = false); - - - ------------------ Daily connection stats per app ----------------- ---- View -CREATE MATERIALIZED VIEW daily_connection_stats_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 day', hourly_bucket) AS daily_bucket, - SUM(hourly_app_connection_count) :: BIGINT AS daily_app_connection_count, - SUM(hourly_clients_connection_count) :: BIGINT AS daily_clients_connection_count -FROM - hourly_connection_stats_per_app -GROUP BY - app_id, - daily_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy('daily_connection_stats_per_app', - start_offset => INTERVAL '1 month', - end_offset => INTERVAL '1 day', - schedule_interval => INTERVAL '1 day' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW daily_connection_stats_per_app -set - (timescaledb.materialized_only = false); - - - ------------------ Monthly connection per app ----------------- ---- View -CREATE MATERIALIZED VIEW monthly_connection_stats_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 month', daily_bucket) AS monthly_bucket, - SUM(daily_app_connection_count) :: BIGINT AS monthly_app_connection_count, - SUM(daily_clients_connection_count) :: BIGINT AS monthly_clients_connection_count -FROM - daily_connection_stats_per_app -GROUP BY - app_id, - monthly_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy('monthly_connection_stats_per_app', - start_offset => INTERVAL '1 year', - end_offset => INTERVAL '1 month', - schedule_interval => INTERVAL '1 month' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW monthly_connection_stats_per_app -set - (timescaledb.materialized_only = false); \ No newline at end of file diff --git a/database/migrations/0016_events_requests_stats.sql b/database/migrations/0016_events_requests_stats.sql new file mode 100644 index 00000000..3aa981e7 --- /dev/null +++ b/database/migrations/0016_events_requests_stats.sql @@ -0,0 +1,254 @@ +---------------------------------------------------------------- SIGN MESSAGE EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_sign_message_stats_per_app WITH (timescaledb.continuous) AS +SELECT + e.app_id, + e.network, + time_bucket('15 minutes'::interval, e.creation_timestamp) AS quarter_bucket, + e.event_type, + COUNT(*) FILTER (WHERE esm.request_status = 'Completed') AS quarter_successful_requests, + COUNT(*) FILTER (WHERE esm.request_status != 'Completed') AS quarter_unsuccessful_requests +FROM + events e +JOIN + event_sign_message esm ON e.event_id = esm.event_id +GROUP BY e.app_id, e.network, quarter_bucket, e.event_type WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_sign_message_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_sign_message_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Hourly events stats per app ----------------- +-- Hourly aggregates +CREATE MATERIALIZED VIEW hour_events_sign_message_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + event_type, + SUM(quarter_successful_requests) AS hour_successful_requests, + SUM(quarter_unsuccessful_requests) AS hour_unsuccessful_requests +FROM + quarter_events_sign_message_stats_per_app +GROUP BY app_id, network, hour_bucket, event_type WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_sign_message_stats_per_app', + start_offset => INTERVAL '3 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_sign_message_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_sign_message_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + event_type, + SUM(hour_successful_requests) AS daily_successful_requests, + SUM(hour_unsuccessful_requests) AS daily_unsuccessful_requests +FROM + hour_events_sign_message_stats_per_app +GROUP BY app_id, network, daily_bucket, event_type WITH NO DATA; + +-- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_sign_message_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +-- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_sign_message_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- SIGN TRANSACTION EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_sign_transaction_stats_per_app WITH (timescaledb.continuous) AS +SELECT + e.app_id, + e.network, + time_bucket('15 minutes'::interval, e.creation_timestamp) AS quarter_bucket, + e.event_type, + COUNT(*) FILTER (WHERE esm.request_status = 'Completed') AS quarter_successful_requests, + COUNT(*) FILTER (WHERE esm.request_status != 'Completed') AS quarter_unsuccessful_requests +FROM + events e +JOIN + event_sign_transaction esm +ON e.event_id = esm.event_id +GROUP BY e.app_id, e.network, quarter_bucket, e.event_type WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_sign_transaction_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_sign_transaction_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Hourly events stats per app ----------------- +-- Hourly aggregates +CREATE MATERIALIZED VIEW hour_events_sign_transaction_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + event_type, + SUM(quarter_successful_requests) AS hour_successful_requests, + SUM(quarter_unsuccessful_requests) AS hour_unsuccessful_requests +FROM + quarter_events_sign_transaction_stats_per_app +GROUP BY app_id, network, hour_bucket, event_type WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_sign_transaction_stats_per_app', + start_offset => INTERVAL '3 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_sign_transaction_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_sign_transaction_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + event_type, + SUM(hour_successful_requests) AS daily_successful_requests, + SUM(hour_unsuccessful_requests) AS daily_unsuccessful_requests +FROM + hour_events_sign_transaction_stats_per_app +GROUP BY app_id, network, daily_bucket, event_type WITH NO DATA; + +-- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_sign_transaction_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +-- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_sign_transaction_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- SIGN AND SEND TRANSACTION EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_sign_and_send_transaction_stats_per_app WITH (timescaledb.continuous) AS +SELECT + e.app_id, + e.network, + time_bucket('15 minutes'::interval, e.creation_timestamp) AS quarter_bucket, + e.event_type, + COUNT(*) FILTER (WHERE esm.request_status = 'Completed') AS quarter_successful_requests, + COUNT(*) FILTER (WHERE esm.request_status != 'Completed') AS quarter_unsuccessful_requests +FROM + events e +JOIN + event_sign_and_send_transaction esm +ON e.event_id = esm.event_id +GROUP BY e.app_id, e.network, quarter_bucket, e.event_type WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_sign_and_send_transaction_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_sign_and_send_transaction_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Hourly events stats per app ----------------- +-- Hourly aggregates +CREATE MATERIALIZED VIEW hour_events_sign_and_send_transaction_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + event_type, + SUM(quarter_successful_requests) AS hour_successful_requests, + SUM(quarter_unsuccessful_requests) AS hour_unsuccessful_requests +FROM + quarter_events_sign_and_send_transaction_stats_per_app +GROUP BY app_id, network, hour_bucket, event_type WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_sign_and_send_transaction_stats_per_app', + start_offset => INTERVAL '3 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_sign_and_send_transaction_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_sign_and_send_transaction_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + event_type, + SUM(hour_successful_requests) AS daily_successful_requests, + SUM(hour_unsuccessful_requests) AS daily_unsuccessful_requests +FROM + hour_events_sign_and_send_transaction_stats_per_app +GROUP BY app_id, network, daily_bucket, event_type WITH NO DATA; + +-- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_sign_and_send_transaction_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +-- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_sign_and_send_transaction_stats_per_app +SET (timescaledb.materialized_only = false); \ No newline at end of file diff --git a/database/migrations/0017_events_change_requests_stats.sql b/database/migrations/0017_events_change_requests_stats.sql new file mode 100644 index 00000000..f58ebb0c --- /dev/null +++ b/database/migrations/0017_events_change_requests_stats.sql @@ -0,0 +1,175 @@ +---------------------------------------------------------------- CHANGE WALLET EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_change_wallet_stats_per_app WITH (timescaledb.continuous) AS +SELECT + e.app_id, + e.network, + time_bucket('15 minutes'::interval, e.creation_timestamp) AS quarter_bucket, + ecw.wallet_name, + COUNT(*) FILTER (WHERE ecw.request_status = 'Completed') AS quarter_successful_requests, + COUNT(*) FILTER (WHERE ecw.request_status != 'Completed') AS quarter_unsuccessful_requests +FROM + events e +JOIN + event_change_wallet ecw ON e.event_id = ecw.event_id +GROUP BY e.app_id, e.network, quarter_bucket, ecw.wallet_name +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_change_wallet_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_change_wallet_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_change_wallet_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + wallet_name, + SUM(quarter_successful_requests) AS hour_successful_requests, + SUM(quarter_unsuccessful_requests) AS hour_unsuccessful_requests +FROM + quarter_events_change_wallet_stats_per_app +GROUP BY app_id, network, hour_bucket, wallet_name +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_change_wallet_stats_per_app', + start_offset => INTERVAL '3 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_change_wallet_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_change_wallet_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + wallet_name, + SUM(hour_successful_requests) AS daily_successful_requests, + SUM(hour_unsuccessful_requests) AS daily_unsuccessful_requests +FROM + hour_events_change_wallet_stats_per_app +GROUP BY app_id, network, daily_bucket, wallet_name +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_change_wallet_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_change_wallet_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- CHANGE NETWORK EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_change_network_stats_per_app WITH (timescaledb.continuous) AS +SELECT + e.app_id, + e.network, + time_bucket('15 minutes'::interval, e.creation_timestamp) AS quarter_bucket, + ecn.old_network, + COUNT(*) FILTER (WHERE ecn.request_status = 'Completed') AS quarter_successful_requests, + COUNT(*) FILTER (WHERE ecn.request_status != 'Completed') AS quarter_unsuccessful_requests +FROM + events e +JOIN + event_change_network ecn ON e.event_id = ecn.event_id +GROUP BY e.app_id, e.network, quarter_bucket, ecn.old_network +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_change_network_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_change_network_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW hour_events_change_network_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + old_network, + SUM(quarter_successful_requests) AS hour_successful_requests, + SUM(quarter_unsuccessful_requests) AS hour_unsuccessful_requests +FROM + quarter_events_change_network_stats_per_app +GROUP BY app_id, network, hour_bucket, old_network +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_change_network_stats_per_app', + start_offset => INTERVAL '3 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_change_network_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_change_network_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + old_network, + SUM(hour_successful_requests) AS daily_successful_requests, + SUM(hour_unsuccessful_requests) AS daily_unsuccessful_requests +FROM + hour_events_change_network_stats_per_app +GROUP BY app_id, network, daily_bucket, old_network +WITH NO DATA; + +-- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_change_network_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +-- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_change_network_stats_per_app +SET (timescaledb.materialized_only = false); \ No newline at end of file diff --git a/database/migrations/0017_session_stats.sql b/database/migrations/0017_session_stats.sql deleted file mode 100644 index dd668bb3..00000000 --- a/database/migrations/0017_session_stats.sql +++ /dev/null @@ -1,154 +0,0 @@ ------------------ Hourly Sessions Stats ----------------- ---- View -CREATE MATERIALIZED VIEW hourly_sessions_stats_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 hour' :: interval, session_open_timestamp) AS hourly_bucket, - COUNT(*) :: BIGINT AS hourly_sessions_opened, - COUNT(DISTINCT (client_data).client_profile_id) :: BIGINT AS hourly_active_users -FROM - sessions -GROUP BY - app_id, - hourly_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy( - 'hourly_sessions_stats_per_app', - start_offset => INTERVAL '14 days', - end_offset => INTERVAL '1 hour', - schedule_interval => INTERVAL '1 hour' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW hourly_sessions_stats_per_app -SET - (timescaledb.materialized_only = false); - - - ------------------ Daily Sessions Stats ----------------- ---- View -CREATE MATERIALIZED VIEW daily_sessions_stats_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 day' :: interval, hourly_bucket) AS daily_bucket, - SUM(hourly_sessions_opened) :: BIGINT AS daily_sessions_opened, - SUM(hourly_active_users) :: BIGINT AS daily_active_users -FROM - hourly_sessions_stats_per_app -GROUP BY - app_id, - daily_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy( - 'daily_sessions_stats_per_app', - start_offset => INTERVAL '14 days', - end_offset => INTERVAL '1 hour', - schedule_interval => INTERVAL '1 hour' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW daily_sessions_stats_per_app -SET - (timescaledb.materialized_only = false); - - - ------------------ Monthly session stats ----------------- ---- View -CREATE MATERIALIZED VIEW monthly_sessions_stats_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 month' :: interval, daily_bucket) AS monthly_bucket, - SUM(daily_sessions_opened) :: BIGINT AS monthly_sessions_opened, - SUM(daily_active_users) :: BIGINT AS monthly_active_users -FROM - daily_sessions_stats_per_app -GROUP BY - app_id, - monthly_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy( - 'monthly_sessions_stats_per_app', - start_offset => INTERVAL '3 months', - end_offset => INTERVAL '1 day', - schedule_interval => INTERVAL '1 day' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW monthly_sessions_stats_per_app -SET - (timescaledb.materialized_only = false); - - - ------------------------------------------------------------------- ------------------ Daily Average session duration ----------------- ---- View -CREATE MATERIALIZED VIEW daily_sessions_avg_time_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 day' :: interval, session_open_timestamp) AS daily_bucket, - stats_agg( - EXTRACT( - EPOCH - FROM - (session_close_timestamp - session_open_timestamp) - ) - ) AS daily_avg_session_duration_seconds -FROM - sessions -WHERE - session_close_timestamp IS NOT NULL -GROUP BY - app_id, - daily_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy( - 'daily_sessions_avg_time_per_app', - start_offset => INTERVAL '14 days', - end_offset => INTERVAL '1 hour', - schedule_interval => INTERVAL '1 hour' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW daily_sessions_avg_time_per_app -SET - (timescaledb.materialized_only = false); - - - ------------------ Monthly Average session duration ----------------- ---- View -CREATE MATERIALIZED VIEW monthly_sessions_avg_time_per_app WITH (timescaledb.continuous) AS -SELECT - app_id, - time_bucket('1 month' :: interval, daily_bucket) AS monthly_bucket, - average(rollup(daily_avg_session_duration_seconds)) AS monthly_avg_session_duration_seconds -FROM - daily_sessions_avg_time_per_app -GROUP BY - app_id, - monthly_bucket WITH NO DATA; - ---- Refresh policy -SELECT - add_continuous_aggregate_policy( - 'monthly_sessions_avg_time_per_app', - start_offset => INTERVAL '3 months', - end_offset => INTERVAL '1 day', - schedule_interval => INTERVAL '1 day' - ); - ---- Real time aggregation -ALTER MATERIALIZED VIEW monthly_sessions_avg_time_per_app -SET - (timescaledb.materialized_only = false); diff --git a/database/migrations/0018_events_app_connect_stats.sql b/database/migrations/0018_events_app_connect_stats.sql new file mode 100644 index 00000000..325432ee --- /dev/null +++ b/database/migrations/0018_events_app_connect_stats.sql @@ -0,0 +1,428 @@ +---------------------------------------------------------------- APP CONNECT(LANGUAGE) EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_app_connect_language_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('15 minutes'::interval, creation_timestamp) AS quarter_bucket, + lang, + COUNT(*) AS quarter_language +FROM + event_app_connect +GROUP BY app_id, network, quarter_bucket, lang +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_app_connect_language_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_app_connect_language_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_app_connect_language_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + lang, + SUM(quarter_language) AS hour_language +FROM + quarter_events_app_connect_language_stats_per_app +GROUP BY app_id, network, hour_bucket, lang +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_app_connect_language_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_app_connect_language_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_app_connect_language_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + lang, + SUM(hour_language) AS daily_language +FROM + hour_events_app_connect_language_stats_per_app +GROUP BY app_id, network, daily_bucket, lang +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_app_connect_language_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_app_connect_language_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- APP CONNECT(WEB SESSION BROWSER) EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_app_connect_browser_stats_per_app WITH (timescaledb.continuous) AS +SELECT + eac.app_id, + eac.network, + time_bucket('15 minutes'::interval, eac.creation_timestamp) AS quarter_bucket, + wm.browser, + COUNT(*) AS quarter_browser +FROM + event_app_connect eac +JOIN + web_metadata wm ON eac.device_metadata_uuid = wm.uuid +GROUP BY eac.app_id, eac.network, quarter_bucket, wm.browser +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_app_connect_browser_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_app_connect_browser_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_app_connect_browser_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + browser, + SUM(quarter_browser) AS hour_browser +FROM + quarter_events_app_connect_browser_stats_per_app +GROUP BY app_id, network, hour_bucket, browser +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_app_connect_browser_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_app_connect_browser_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_app_connect_browser_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + browser, + SUM(hour_browser) AS daily_browser +FROM + hour_events_app_connect_browser_stats_per_app +GROUP BY app_id, network, daily_bucket, browser +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_app_connect_browser_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_app_connect_browser_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- APP CONNECT(WEB SESSION SYSTEM OS) EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_app_connect_os_stats_per_app WITH (timescaledb.continuous) AS +SELECT + eac.app_id, + eac.network, + time_bucket('15 minutes'::interval, eac.creation_timestamp) AS quarter_bucket, + wm.os, + COUNT(*) AS quarter_os +FROM + event_app_connect eac +JOIN + web_metadata wm ON eac.device_metadata_uuid = wm.uuid +GROUP BY eac.app_id, eac.network, quarter_bucket, wm.os +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_app_connect_os_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_app_connect_os_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_app_connect_os_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + os, + SUM(quarter_os) AS hour_os +FROM + quarter_events_app_connect_os_stats_per_app +GROUP BY app_id, network, hour_bucket, os +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_app_connect_os_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_app_connect_os_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_app_connect_os_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + os, + SUM(hour_os) AS daily_os +FROM + hour_events_app_connect_os_stats_per_app +GROUP BY app_id, network, daily_bucket, os +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_app_connect_os_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_app_connect_os_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- APP CONNECT(MOBILE SESSION SYSTEM) EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_app_connect_system_stats_per_app WITH (timescaledb.continuous) AS +SELECT + eac.app_id, + eac.network, + time_bucket('15 minutes'::interval, eac.creation_timestamp) AS quarter_bucket, + mm.system_type, + COUNT(*) AS quarter_system +FROM + event_app_connect eac +JOIN + mobile_metadata mm ON eac.device_metadata_uuid = mm.uuid +GROUP BY eac.app_id, eac.network, quarter_bucket, mm.system_type +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_app_connect_system_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_app_connect_system_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_app_connect_system_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + system_type, + SUM(quarter_system) AS hour_system +FROM + quarter_events_app_connect_system_stats_per_app +GROUP BY app_id, network, hour_bucket, system_type +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_app_connect_system_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_app_connect_system_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_app_connect_system_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + system_type, + SUM(hour_system) AS daily_system +FROM + hour_events_app_connect_system_stats_per_app +GROUP BY app_id, network, daily_bucket, system_type +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_app_connect_system_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_app_connect_system_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- APP CONNECT(SESSION TYPE(MOBILE vs WEB)) EVENT STATS ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_app_connect_session_type_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('15 minutes'::interval, creation_timestamp) AS quarter_bucket, + COUNT(*) FILTER (WHERE device_medium_type = 'Browser') AS quarter_mobile_sessions, + COUNT(*) FILTER (WHERE device_medium_type = 'Mobile') AS quarter_web_sessions, + COUNT(*) FILTER (WHERE device_medium_type = 'Unknown') AS quarter_unknown_sessions +FROM + event_app_connect +GROUP BY app_id, network, quarter_bucket +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_app_connect_session_type_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_app_connect_session_type_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_app_connect_session_type_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + SUM(quarter_web_sessions) AS hour_web_sessions, + SUM(quarter_mobile_sessions) AS hour_mobile_sessions, + SUM(quarter_unknown_sessions) AS hour_unknown_sessions +FROM + quarter_events_app_connect_session_type_stats_per_app +GROUP BY app_id, network, hour_bucket +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_app_connect_session_type_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_app_connect_session_type_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_app_connect_session_type_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + SUM(hour_web_sessions) AS daily_web_sessions, + SUM(hour_mobile_sessions) AS daily_mobile_sessions, + SUM(hour_unknown_sessions) AS daily_unknown_sessions +FROM + hour_events_app_connect_session_type_stats_per_app +GROUP BY app_id, network, daily_bucket +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_app_connect_session_type_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_app_connect_session_type_stats_per_app +SET (timescaledb.materialized_only = false); + + diff --git a/database/migrations/0019_connection_stats.sql b/database/migrations/0019_connection_stats.sql new file mode 100644 index 00000000..f357a2d6 --- /dev/null +++ b/database/migrations/0019_connection_stats.sql @@ -0,0 +1,298 @@ +----------------- Quarter connection stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_connection_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('15 minutes' :: interval, connected_at) AS quarter_bucket, + COUNT(*) FILTER (WHERE entity_type = 'App') :: BIGINT AS quarter_app_connection_count, + COUNT(*) FILTER (WHERE entity_type = 'Client') :: BIGINT AS quarter_clients_connection_count +FROM + connection_events +GROUP BY + app_id, + network, + quarter_bucket WITH NO DATA; + +--- Refresh policy +SELECT + add_continuous_aggregate_policy('quarter_connection_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 m', + schedule_interval => INTERVAL '30 m' + ); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_connection_stats_per_app +set + (timescaledb.materialized_only = false); + + + +----------------- Hourly connection stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW hourly_connection_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour' :: interval, quarter_bucket) AS hourly_bucket, + SUM(quarter_app_connection_count) :: BIGINT AS hourly_app_connection_count, + SUM(quarter_clients_connection_count) :: BIGINT AS hourly_clients_connection_count +FROM + quarter_connection_stats_per_app +GROUP BY + app_id, + network, + hourly_bucket WITH NO DATA; + +--- Refresh policy +SELECT + add_continuous_aggregate_policy('hourly_connection_stats_per_app', + start_offset => INTERVAL '2 day', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' + ); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hourly_connection_stats_per_app +set + (timescaledb.materialized_only = false); + + + +----------------- Daily connection stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW daily_connection_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day' :: interval, hourly_bucket) AS daily_bucket, + SUM(hourly_app_connection_count) :: BIGINT AS daily_app_connection_count, + SUM(hourly_clients_connection_count) :: BIGINT AS daily_clients_connection_count +FROM + hourly_connection_stats_per_app +GROUP BY + app_id, + network, + daily_bucket WITH NO DATA; + +--- Refresh policy +SELECT + add_continuous_aggregate_policy('daily_connection_stats_per_app', + start_offset => INTERVAL '1 month', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' + ); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_connection_stats_per_app +set + (timescaledb.materialized_only = false); + + + +----------------- Monthly connection per app ----------------- +--- View +CREATE MATERIALIZED VIEW monthly_connection_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 month' :: interval, daily_bucket) AS monthly_bucket, + SUM(daily_app_connection_count) :: BIGINT AS monthly_app_connection_count, + SUM(daily_clients_connection_count) :: BIGINT AS monthly_clients_connection_count +FROM + daily_connection_stats_per_app +GROUP BY + app_id, + network, + monthly_bucket WITH NO DATA; + +--- Refresh policy +SELECT + add_continuous_aggregate_policy('monthly_connection_stats_per_app', + start_offset => INTERVAL '1 year', + end_offset => INTERVAL '1 month', + schedule_interval => INTERVAL '1 month' + ); + +--- Real time aggregation +ALTER MATERIALIZED VIEW monthly_connection_stats_per_app +set + (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- CONNECTION STATS(WALLET NAME) BASED ON EVENT ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_client_connect_wallet_stats_per_app WITH (timescaledb.continuous) AS +SELECT + e.app_id, + e.network, + time_bucket('15 minutes'::interval, e.creation_timestamp) AS quarter_bucket, + ecw.wallet_name, + COUNT(*) FILTER (WHERE ecw.success = TRUE) AS quarter_successful_requests, + COUNT(*) FILTER (WHERE ecw.success = FALSE) AS quarter_unsuccessful_requests +FROM + events e +JOIN + event_client_connect ecw ON e.event_id = ecw.event_id +GROUP BY e.app_id, e.network, quarter_bucket, ecw.wallet_name +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_client_connect_wallet_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_client_connect_wallet_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_client_connect_wallet_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + wallet_name, + SUM(quarter_successful_requests) AS hour_successful_requests, + SUM(quarter_unsuccessful_requests) AS hour_unsuccessful_requests +FROM + quarter_events_client_connect_wallet_stats_per_app +GROUP BY app_id, network, hour_bucket, wallet_name +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_client_connect_wallet_stats_per_app', + start_offset => INTERVAL '3 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_client_connect_wallet_stats_per_app +SET (timescaledb.materialized_only = false); + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_client_connect_wallet_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + wallet_name, + SUM(hour_successful_requests) AS daily_successful_requests, + SUM(hour_unsuccessful_requests) AS daily_unsuccessful_requests +FROM + hour_events_client_connect_wallet_stats_per_app +GROUP BY app_id, network, daily_bucket, wallet_name +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_client_connect_wallet_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_client_connect_wallet_stats_per_app +SET (timescaledb.materialized_only = false); + + + +---------------------------------------------------------------- CONNECTION STATS(SESSION TYPE) BASED ON EVENT ---------------------------------------------------------------- +------------------- 15-minutes events stats per app ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_events_client_connect_session_type_stats_per_app WITH (timescaledb.continuous) AS +SELECT + e.app_id, + e.network, + time_bucket('15 minutes'::interval, e.creation_timestamp) AS quarter_bucket, + ecw.session_type, + COUNT(*) FILTER (WHERE ecw.success = TRUE) AS quarter_successful_requests, + COUNT(*) FILTER (WHERE ecw.success = FALSE) AS quarter_unsuccessful_requests +FROM + events e +JOIN + event_client_connect ecw ON e.event_id = ecw.event_id +GROUP BY e.app_id, e.network, quarter_bucket, ecw.session_type +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_events_client_connect_session_type_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 minutes', + schedule_interval => INTERVAL '30 minutes' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW quarter_events_client_connect_session_type_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Hourly events stats per app ----------------- +CREATE MATERIALIZED VIEW hour_events_client_connect_session_type_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour'::interval, quarter_bucket) AS hour_bucket, + session_type, + SUM(quarter_successful_requests) AS hour_successful_requests, + SUM(quarter_unsuccessful_requests) AS hour_unsuccessful_requests +FROM + quarter_events_client_connect_session_type_stats_per_app +GROUP BY app_id, network, hour_bucket, session_type +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hour_events_client_connect_session_type_stats_per_app', + start_offset => INTERVAL '3 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW hour_events_client_connect_session_type_stats_per_app +SET (timescaledb.materialized_only = false); + + + +------------------- Daily events stats per app ----------------- +-- View +CREATE MATERIALIZED VIEW daily_events_client_connect_session_type_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day'::interval, hour_bucket) AS daily_bucket, + session_type, + SUM(hour_successful_requests) AS daily_successful_requests, + SUM(hour_unsuccessful_requests) AS daily_unsuccessful_requests +FROM + hour_events_client_connect_session_type_stats_per_app +GROUP BY app_id, network, daily_bucket, session_type +WITH NO DATA; + +--- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_events_client_connect_session_type_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 day', + schedule_interval => INTERVAL '1 day' +); + +--- Real time aggregation +ALTER MATERIALIZED VIEW daily_events_client_connect_session_type_stats_per_app +SET (timescaledb.materialized_only = false); \ No newline at end of file diff --git a/database/migrations/0020_session_stats.sql b/database/migrations/0020_session_stats.sql new file mode 100644 index 00000000..ee08767a --- /dev/null +++ b/database/migrations/0020_session_stats.sql @@ -0,0 +1,185 @@ +----------------- 15-minutes Sessions Stats ----------------- +--- View +CREATE MATERIALIZED VIEW quarter_sessions_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('15 minutes' :: interval, session_open_timestamp) AS quarter_bucket, + COUNT(*) :: BIGINT AS quarter_sessions_opened, + approx_count_distinct((client_data).client_profile_id) AS quarter_active_users +FROM + sessions +GROUP BY + app_id, + network, + quarter_bucket WITH NO DATA; + +-- Refresh policy +SELECT add_continuous_aggregate_policy( + 'quarter_sessions_stats_per_app', + start_offset => INTERVAL '1 day', + end_offset => INTERVAL '15 m', + schedule_interval => INTERVAL '30 m' +); + +-- Real time aggregation +ALTER MATERIALIZED VIEW quarter_sessions_stats_per_app +SET (timescaledb.materialized_only = false); + + + +----------------- Hourly Sessions Stats ----------------- +--- View +CREATE MATERIALIZED VIEW hourly_sessions_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 hour' :: interval, quarter_bucket) AS hourly_bucket, + SUM(quarter_sessions_opened) AS hourly_sessions_opened, + rollup(quarter_active_users) AS hourly_active_users +FROM + quarter_sessions_stats_per_app +GROUP BY + app_id, + network, + hourly_bucket WITH NO DATA; + +-- Refresh policy +SELECT add_continuous_aggregate_policy( + 'hourly_sessions_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +-- Real time aggregation +ALTER MATERIALIZED VIEW hourly_sessions_stats_per_app +SET (timescaledb.materialized_only = false); + + + +----------------- Daily Sessions Stats ----------------- +--- View +CREATE MATERIALIZED VIEW daily_sessions_stats_per_app WITH (timescaledb.continuous) AS +SELECT + app_id, + network, + time_bucket('1 day' :: interval, hourly_bucket) AS daily_bucket, + SUM(hourly_sessions_opened) AS daily_sessions_opened, + -- SUM(hourly_distinct_users) AS daily_active_users + distinct_count(rollup(hourly_active_users)) AS daily_active_users +FROM + hourly_sessions_stats_per_app +GROUP BY + app_id, + network, + daily_bucket WITH NO DATA; + +-- Refresh policy +SELECT add_continuous_aggregate_policy( + 'daily_sessions_stats_per_app', + start_offset => INTERVAL '14 days', + end_offset => INTERVAL '1 hour', + schedule_interval => INTERVAL '1 hour' +); + +-- Real time aggregation +ALTER MATERIALIZED VIEW daily_sessions_stats_per_app +SET (timescaledb.materialized_only = false); + + + +-- ----------------- Monthly session stats ----------------- +-- --- View +-- CREATE MATERIALIZED VIEW monthly_sessions_stats_per_app WITH (timescaledb.continuous) AS +-- SELECT +-- app_id, +-- time_bucket('1 month' :: interval, daily_bucket) AS monthly_bucket, +-- SUM(daily_sessions_opened) :: BIGINT AS monthly_sessions_opened, +-- SUM(daily_active_users) :: BIGINT AS monthly_active_users +-- FROM +-- daily_sessions_stats_per_app +-- GROUP BY +-- app_id, +-- monthly_bucket WITH NO DATA; + +-- --- Refresh policy +-- SELECT +-- add_continuous_aggregate_policy( +-- 'monthly_sessions_stats_per_app', +-- start_offset => INTERVAL '3 months', +-- end_offset => INTERVAL '1 day', +-- schedule_interval => INTERVAL '1 day' +-- ); + +-- --- Real time aggregation +-- ALTER MATERIALIZED VIEW monthly_sessions_stats_per_app +-- SET +-- (timescaledb.materialized_only = false); + + + +-- ------------------------------------------------------------------ +-- ----------------- Daily Average session duration ----------------- +-- --- View +-- CREATE MATERIALIZED VIEW daily_sessions_avg_time_per_app WITH (timescaledb.continuous) AS +-- SELECT +-- app_id, +-- time_bucket('1 day' :: interval, session_open_timestamp) AS daily_bucket, +-- stats_agg( +-- EXTRACT( +-- EPOCH +-- FROM +-- (session_close_timestamp - session_open_timestamp) +-- ) +-- ) AS daily_avg_session_duration_seconds +-- FROM +-- sessions +-- WHERE +-- session_close_timestamp IS NOT NULL +-- GROUP BY +-- app_id, +-- daily_bucket WITH NO DATA; + +-- --- Refresh policy +-- SELECT +-- add_continuous_aggregate_policy( +-- 'daily_sessions_avg_time_per_app', +-- start_offset => INTERVAL '14 days', +-- end_offset => INTERVAL '1 hour', +-- schedule_interval => INTERVAL '1 hour' +-- ); + +-- --- Real time aggregation +-- ALTER MATERIALIZED VIEW daily_sessions_avg_time_per_app +-- SET +-- (timescaledb.materialized_only = false); + + + +-- ----------------- Monthly Average session duration ----------------- +-- --- View +-- CREATE MATERIALIZED VIEW monthly_sessions_avg_time_per_app WITH (timescaledb.continuous) AS +-- SELECT +-- app_id, +-- time_bucket('1 month' :: interval, daily_bucket) AS monthly_bucket, +-- average(rollup(daily_avg_session_duration_seconds)) AS monthly_avg_session_duration_seconds +-- FROM +-- daily_sessions_avg_time_per_app +-- GROUP BY +-- app_id, +-- monthly_bucket WITH NO DATA; + +-- --- Refresh policy +-- SELECT +-- add_continuous_aggregate_policy( +-- 'monthly_sessions_avg_time_per_app', +-- start_offset => INTERVAL '3 months', +-- end_offset => INTERVAL '1 day', +-- schedule_interval => INTERVAL '1 day' +-- ); + +-- --- Real time aggregation +-- ALTER MATERIALIZED VIEW monthly_sessions_avg_time_per_app +-- SET +-- (timescaledb.materialized_only = false); diff --git a/database/src/aggregated_views_queries/connections_stats.rs b/database/src/aggregated_views_queries/connections_stats.rs deleted file mode 100644 index 281a56b7..00000000 --- a/database/src/aggregated_views_queries/connections_stats.rs +++ /dev/null @@ -1,160 +0,0 @@ -use crate::{ - db::Db, - structs::{db_error::DbError, filter_requests::ConnectionStats, time_filters::TimeFilter}, - tables::utils::{format_view_keys, format_view_name}, -}; - -pub const CONNECTIONS_STATS_BASE_VIEW_NAME: &str = "connection_stats_per_app"; -pub const CONNECTIONS_STATS_BASE_KEYS: [(&'static str, bool); 4] = [ - ("app_id", false), - ("bucket", true), - ("app_connection_count", true), - ("clients_connection_count", true), -]; - -impl Db { - pub async fn get_connections_stats_by_app_id( - &self, - app_id: &str, - filter: TimeFilter, - ) -> Result, DbError> { - let start_date = filter.to_date(); - let bucket_size = filter.bucket_size(); - - // Correctly selecting the view based on the bucket_size - let prefix = match bucket_size { - "1 hour" => "hourly", - "1 day" => "daily", - "1 month" => "monthly", - _ => return Err(DbError::DatabaseError("Invalid bucket size".to_string())), - }; - - let formatted_keys = format_view_keys(prefix, &CONNECTIONS_STATS_BASE_KEYS); - let formatted_view_name = format_view_name(prefix, CONNECTIONS_STATS_BASE_VIEW_NAME); - let date_filter_key = CONNECTIONS_STATS_BASE_KEYS[1].0; - let filter = format!("{prefix}_{date_filter_key}"); - - let query = format!( - "SELECT {formatted_keys} - FROM {formatted_view_name} - WHERE app_id = $1 AND {filter} >= $2 - ORDER BY {filter} DESC", - ); - - sqlx::query_as::<_, ConnectionStats>(&query) - .bind(app_id) - .bind(start_date) - .fetch_all(&self.connection_pool) - .await - .map_err(|e| e.into()) - } -} - -#[cfg(feature = "cloud_db_tests")] -#[cfg(test)] -mod tests { - - use crate::{ - structs::{session_type::SessionType, time_filters::TimeFilter}, - tables::sessions::table_struct::DbNcSession, - }; - use sqlx::types::chrono::Utc; - - #[tokio::test] - async fn test_connections() { - let db = super::Db::connect_to_the_pool().await; - db.truncate_all_tables().await.unwrap(); - - // Create test team instance - let team_id = "test_team_id".to_string(); - let app_id = "test_app_id".to_string(); - - db.setup_test_team(&team_id, &app_id, Utc::now()) - .await - .unwrap(); - - let networks = vec![ - "test_network_1", - "test_network_2", - "test_network_3", - "test_network_4", - "test_network_5", - ]; - // Create persistent a session for each odd number of network, for each session connect via app 3 times and for client connect number of network times - for (i, network) in networks.iter().enumerate() { - let session_id = format!("session_{app_id}_{i}"); - - let session = DbNcSession { - session_id: session_id.clone(), - app_id: app_id.clone(), - app_metadata: "test_metadata".to_string(), - persistent: true, - network: network.to_string(), - client_data: None, - session_open_timestamp: Utc::now(), - session_close_timestamp: None, - }; - - db.handle_new_session(&session, None, &"127.0.0.1".to_string()) - .await - .unwrap(); - - // Each time a session is created, means that app has been connected, create 2 more connections - let mut tx = db.connection_pool.begin().await.unwrap(); - db.create_new_connection_event_by_app( - &mut tx, - &session_id, - &app_id, - &network.to_string(), - None, - ) - .await - .unwrap(); - - db.create_new_connection_event_by_app( - &mut tx, - &session_id, - &app_id, - &network.to_string(), - None, - ) - .await - .unwrap(); - - for _j in 0..i { - db.create_new_connection_event_by_client( - &mut tx, - &app_id, - &session_id, - &SessionType::Relay, - &network.to_string(), - None, - ) - .await - .unwrap(); - } - - tx.commit().await.unwrap(); - } - - // Manually refresh the continuous aggregates - db.refresh_continuous_aggregates(vec![ - "hourly_connection_stats_per_app".to_string(), - "daily_connection_stats_per_app".to_string(), - "monthly_connection_stats_per_app".to_string(), - ]) - .await - .unwrap(); - - // Get stats for each network - let stats = db - .get_connections_stats_by_app_id(&app_id, TimeFilter::LastMonth) - .await - .unwrap(); - - assert_eq!(stats.len(), 1); - assert_eq!(stats[0].app_id, app_id); - assert_eq!(stats[0].app_connection_count, 15); - assert_eq!(stats[0].clients_connection_count, 10); - } -} diff --git a/database/src/aggregated_views_queries/mod.rs b/database/src/aggregated_views_queries/mod.rs index c60174f9..6d15df19 100644 --- a/database/src/aggregated_views_queries/mod.rs +++ b/database/src/aggregated_views_queries/mod.rs @@ -1,4 +1,7 @@ -pub mod connections_stats; -pub mod requests_stats; -pub mod session_average_time; -pub mod sessions_stats; +// Files unnecessary for now. Check commit history + +// pub mod connections_stats; +// pub mod session_average_time; +// Used for data generation in tests +// pub mod events_stats; +// pub mod sessions_stats; diff --git a/database/src/aggregated_views_queries/requests_stats.rs b/database/src/aggregated_views_queries/requests_stats.rs deleted file mode 100644 index 5cbf2313..00000000 --- a/database/src/aggregated_views_queries/requests_stats.rs +++ /dev/null @@ -1,409 +0,0 @@ -// use crate::{ -// db::Db, -// structs::{db_error::DbError, filter_requests::RequestsStats, time_filters::TimeFilter}, -// tables::utils::{format_view_keys, format_view_name}, -// }; - -// pub const REQUESTS_STATS_BASE_VIEW_NAME: &str = "requests_stats_per_app"; -// pub const REQUESTS_STATS_BASE_KEYS: [(&'static str, bool); 4] = [ -// ("app_id", false), -// ("bucket", true), -// ("request_count", true), -// ("success_rate", true), -// ]; - -// impl Db { -// pub async fn get_requests_stats_by_app_id( -// &self, -// app_id: &str, -// filter: TimeFilter, -// ) -> Result, DbError> { -// let start_date = filter.to_date(); -// let bucket_size = filter.bucket_size(); - -// // Correctly selecting the view based on the bucket_size -// let prefix = match bucket_size { -// "1 hour" => "hourly", -// "1 day" => "daily", -// "1 month" => "monthly", -// _ => return Err(DbError::DatabaseError("Invalid bucket size".to_string())), -// }; - -// let formatted_keys = format_view_keys(prefix, &REQUESTS_STATS_BASE_KEYS); -// let formatted_view_name = format_view_name(prefix, REQUESTS_STATS_BASE_VIEW_NAME); -// let filter_key = REQUESTS_STATS_BASE_KEYS[1].0; -// let filter = format!("{prefix}_{filter_key}"); - -// let query = format!( -// "SELECT {formatted_keys} -// FROM {formatted_view_name} -// WHERE app_id = $1 AND {filter} >= $2 -// ORDER BY {filter} DESC", -// ); - -// sqlx::query_as::<_, RequestsStats>(&query) -// .bind(app_id) -// .bind(start_date) -// .fetch_all(&self.connection_pool) -// .await -// .map_err(|e| e.into()) -// } -// } - -// #[cfg(feature = "cloud_db_tests")] -// #[cfg(test)] -// mod test { - -// use super::*; -// use crate::{ -// structs::{ -// consts::DAY_IN_SECONDS, request_status::RequestStatus, request_type::RequestType, -// }, -// tables::{ -// registered_app::table_struct::DbRegisteredApp, requests::table_struct::Request, -// sessions::table_struct::DbNcSession, utils::to_microsecond_precision, -// }, -// }; -// use sqlx::types::chrono::{DateTime, Utc}; -// use std::{sync::Arc, time::Duration}; -// use tokio::task; - -// #[tokio::test] -// async fn test_requests_count() { -// let db = super::Db::connect_to_the_pool().await; -// db.truncate_all_tables().await.unwrap(); - -// // Create test team instance -// let team_id = "test_team_id".to_string(); -// let app_id = "test_app_id".to_string(); - -// db.setup_test_team(&team_id, &app_id, Utc::now()) -// .await -// .unwrap(); - -// // Create session -// let session = DbNcSession { -// session_id: "test_session_id".to_string(), -// app_id: app_id.to_string(), -// app_metadata: "test_app_metadata".to_string(), -// persistent: false, -// network: "test_network".to_string(), -// client_data: None, -// session_open_timestamp: DateTime::from(Utc::now()), -// session_close_timestamp: None, -// }; - -// db.handle_new_session(&session, None, &"127.0.0.1".to_string()) -// .await -// .unwrap(); - -// let result = db.get_sessions_by_app_id(&app_id).await.unwrap(); -// assert_eq!(result.len(), 1); - -// let db_arc = Arc::new(db); -// let mut tasks = Vec::new(); - -// for i in 0..33 { -// let db_clone = db_arc.clone(); // Clone the db connection or pool if needed -// let app_id = app_id.clone(); -// tasks.push(task::spawn(async move { -// for j in 0..100 - i { -// let creation_time: DateTime = Utc::now() -// - Duration::from_secs(i as u64 * DAY_IN_SECONDS as u64) -// - Duration::from_millis((j + 1) as u64 * 100); - -// let request = Request { -// request_id: format!("test_request_id_{}_{}", i, j), -// app_id: app_id.to_string(), -// session_id: "test_session_id".to_string(), -// network: "test_network".to_string(), -// creation_timestamp: creation_time, -// request_status: RequestStatus::Pending, -// request_type: RequestType::SignAndSendTransaction, -// }; - -// if let Err(e) = db_clone.save_request(&request).await { -// eprintln!("Failed to save request: {}", e); -// } -// } -// })); -// } - -// // Await all tasks to complete -// for task in tasks { -// task.await.unwrap(); -// } - -// // We need to refresh manually the views -// db_arc -// .refresh_continuous_aggregates(vec![ -// "hourly_requests_stats_per_app".to_string(), -// "daily_requests_stats_per_app".to_string(), -// "monthly_requests_stats_per_app".to_string(), -// ]) -// .await -// .unwrap(); - -// let result = db_arc -// .get_requests_stats_by_app_id(&app_id, TimeFilter::Last24Hours) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 2); -// assert_eq!(result[0].request_count, 100); -// assert_eq!(result[1].request_count, 99); - -// let result = db_arc -// .get_requests_stats_by_app_id(&app_id, TimeFilter::Last7Days) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 8); -// assert_eq!(result[0].request_count, 100); -// assert_eq!(result[7].request_count, 93); - -// let result = db_arc -// .get_requests_stats_by_app_id(&app_id, TimeFilter::Last30Days) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 31); -// assert_eq!(result[0].request_count, 100); -// assert_eq!(result[30].request_count, 70); -// } - -// #[tokio::test] -// async fn test_requests_success_rate() { -// let db = super::Db::connect_to_the_pool().await; -// db.truncate_all_tables().await.unwrap(); - -// // Create test team instance -// let team_id = "test_team_id".to_string(); -// let app_id = "test_app_id".to_string(); - -// db.setup_test_team(&team_id, &app_id, Utc::now()) -// .await -// .unwrap(); - -// // Create session -// let session = DbNcSession { -// session_id: "test_session_id".to_string(), -// app_id: "test_app_id".to_string(), -// app_metadata: "test_app_metadata".to_string(), -// persistent: false, -// network: "test_network".to_string(), -// client_data: None, -// session_open_timestamp: to_microsecond_precision(&Utc::now()), -// session_close_timestamp: None, -// }; - -// db.handle_new_session(&session, None, &"127.0.0.1".to_string()) -// .await -// .unwrap(); - -// let result = db.get_sessions_by_app_id(&app_id).await.unwrap(); -// assert_eq!(result.len(), 1); -// // assert_eq!(session, result[0]); - -// let db_arc = Arc::new(db); -// let mut tasks = Vec::new(); - -// for i in 0..33 { -// let db_clone = db_arc.clone(); // Clone the db connection or pool if needed -// let app_id = app_id.clone(); -// tasks.push(task::spawn(async move { -// for j in 0..100 - i { -// let creation_time: DateTime = Utc::now() -// - Duration::from_secs(i as u64 * DAY_IN_SECONDS as u64) -// - Duration::from_millis((j + 1) as u64 * 100); - -// let status = if j % 3 == 0 { -// RequestStatus::Completed -// } else if j % 3 == 1 { -// RequestStatus::Completed -// } else { -// RequestStatus::Rejected -// }; - -// let request = Request { -// request_id: format!("test_request_id_{}_{}", i, j), -// app_id: app_id.to_string(), -// session_id: "test_session_id".to_string(), -// network: "test_network".to_string(), -// creation_timestamp: to_microsecond_precision(&creation_time), -// request_status: status, -// request_type: RequestType::SignAndSendTransaction, -// }; -// if let Err(e) = db_clone.save_request(&request).await { -// eprintln!("Failed to save request: {}", e); -// } -// } -// })); -// } - -// // Await all tasks to complete -// for task in tasks { -// task.await.unwrap(); -// } - -// // We need to refresh manually the views -// db_arc -// .refresh_continuous_aggregates(vec![ -// "hourly_requests_stats_per_app".to_string(), -// "daily_requests_stats_per_app".to_string(), -// "monthly_requests_stats_per_app".to_string(), -// ]) -// .await -// .unwrap(); - -// // Check the success rate on every time filter -// let result = db_arc -// .get_requests_stats_by_app_id(&app_id, TimeFilter::Last24Hours) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 2); -// assert_eq!( -// (result[0].success_rate.unwrap() * 100.0).ceil() / 100.0, -// 0.67 as f64 -// ); -// assert_eq!( -// (result[1].success_rate.unwrap() * 100.0).ceil() / 100.0, -// 0.67 as f64 -// ); - -// let result = db_arc -// .get_requests_stats_by_app_id(&app_id, TimeFilter::Last7Days) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 8); -// assert_eq!( -// (result[0].success_rate.unwrap() * 100.0).ceil() / 100.0, -// 0.67 as f64 -// ); -// assert_eq!( -// (result[7].success_rate.unwrap() * 100.0).ceil() / 100.0, -// 0.67 as f64 -// ); - -// let result = db_arc -// .get_requests_stats_by_app_id(&app_id, TimeFilter::Last30Days) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 31); -// assert_eq!( -// (result[0].success_rate.unwrap() * 100.0).ceil() / 100.0, -// 0.67 as f64 -// ); -// assert_eq!( -// (result[30].success_rate.unwrap() * 100.0).ceil() / 100.0, -// 0.68 as f64 -// ); - -// // Test missing success due to all requests having pending status -// // Add new app to have a "clean" state -// let second_app_id = "test_app_id2".to_string(); -// let app = DbRegisteredApp { -// team_id: team_id.clone(), -// app_id: second_app_id.to_string(), -// app_name: "test_app_name".to_string(), -// whitelisted_domains: vec!["test_domain".to_string()], -// ack_public_keys: vec!["test_key".to_string()], -// registration_timestamp: to_microsecond_precision(&Utc::now()), -// }; -// db_arc.register_new_app(&app).await.unwrap(); - -// let result = db_arc -// .get_registered_app_by_app_id(&second_app_id) -// .await -// .unwrap(); -// assert_eq!(app, result.unwrap()); - -// // Create session -// let session = DbNcSession { -// session_id: "test_session_id".to_string(), -// app_id: second_app_id.to_string(), -// app_metadata: "test_app_metadata".to_string(), -// persistent: false, -// network: "test_network".to_string(), -// client_data: None, -// session_open_timestamp: to_microsecond_precision(&Utc::now()), -// session_close_timestamp: None, -// }; - -// db_arc -// .handle_new_session(&session, None, &"127.0.0.1".to_string()) -// .await -// .unwrap(); - -// let mut tasks = Vec::new(); -// for i in 0..10 { -// let db_clone = db_arc.clone(); // Clone the db connection or pool if needed -// let app_id = second_app_id.clone(); -// tasks.push(task::spawn(async move { -// for j in 0..11 - i { -// let creation_time: DateTime = Utc::now() -// - Duration::from_secs(i as u64 * DAY_IN_SECONDS as u64) -// - Duration::from_millis((j + 1) as u64 * 100); - -// let request = Request { -// request_id: format!("test_request_id_{}_{}", i, j), -// app_id: app_id.to_string(), -// session_id: "test_session_id".to_string(), -// network: "test_network".to_string(), -// creation_timestamp: to_microsecond_precision(&creation_time), -// request_status: RequestStatus::Pending, -// request_type: RequestType::SignAndSendTransaction, -// }; -// if let Err(e) = db_clone.save_request(&request).await { -// eprintln!("Failed to save request: {}", e); -// } -// } -// })); -// } - -// // Await all tasks to complete -// for task in tasks { -// task.await.unwrap(); -// } - -// // We need to refresh manually the views -// db_arc -// .refresh_continuous_aggregates(vec![ -// "hourly_requests_stats_per_app".to_string(), -// "daily_requests_stats_per_app".to_string(), -// "monthly_requests_stats_per_app".to_string(), -// ]) -// .await -// .unwrap(); - -// let result = db_arc -// .get_requests_stats_by_app_id(&second_app_id, TimeFilter::Last24Hours) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 2); -// assert!(result[0].success_rate.is_none()); -// assert!(result[1].success_rate.is_none()); - -// let result = db_arc -// .get_requests_stats_by_app_id(&second_app_id, TimeFilter::Last7Days) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 8); -// assert!(result[0].success_rate.is_none()); -// assert!(result[7].success_rate.is_none()); - -// let result = db_arc -// .get_requests_stats_by_app_id(&second_app_id, TimeFilter::Last30Days) -// .await -// .unwrap(); - -// assert_eq!(result.len(), 10); -// assert!(result[0].success_rate.is_none()); -// assert!(result[9].success_rate.is_none()); -// } -// } diff --git a/database/src/aggregated_views_queries/session_average_time.rs b/database/src/aggregated_views_queries/session_average_time.rs deleted file mode 100644 index 2af91eca..00000000 --- a/database/src/aggregated_views_queries/session_average_time.rs +++ /dev/null @@ -1,108 +0,0 @@ -use crate::{db::Db, structs::filter_requests::SessionAvgTime}; -use sqlx::Error; - -pub const MONTHLY_SESSIONS_AVG_TIME_PER_APP_VIEW_NAME: &str = "monthly_sessions_avg_time_per_app"; -pub const MONTHLY_SESSIONS_AVG_TIME_PER_APP_KEYS: &str = - "app_id, monthly_bucket as bucket, monthly_avg_session_duration_seconds as average_duration_seconds"; - -impl Db { - pub async fn get_monthly_avg_session_duration_per_app( - &self, - app_id: &str, - ) -> Result, Error> { - let query = format!( - "SELECT {MONTHLY_SESSIONS_AVG_TIME_PER_APP_KEYS} - FROM {MONTHLY_SESSIONS_AVG_TIME_PER_APP_VIEW_NAME} - WHERE app_id = $1" - ); - - sqlx::query_as::<_, SessionAvgTime>(&query) - .bind(app_id) - .fetch_all(&self.connection_pool) - .await - } -} - -#[cfg(feature = "cloud_db_tests")] -#[cfg(test)] -mod test { - - use crate::tables::sessions::table_struct::DbNcSession; - use sqlx::types::chrono::Utc; - use std::time::Duration; - - #[tokio::test] - async fn test_average_session_duration() { - let db = super::Db::connect_to_the_pool().await; - db.truncate_all_tables().await.unwrap(); - - // Create test team instance - let team_id = "test_team_id".to_string(); - let app_id = "test_app_id".to_string(); - - db.setup_test_team(&team_id, &app_id, Utc::now()) - .await - .unwrap(); - - // Create sessions - let now = Utc::now(); - let sessions = vec![ - ( - now - Duration::from_secs(4 * 60 * 60), - now - Duration::from_secs((4 * 60 - 85) * 60), - ), // 1 hour 25 minutes session, 4 hours ago - ( - now - Duration::from_secs((2 * 60 + 35) * 60), - now - Duration::from_secs((2 * 60 + 10) * 60), - ), // 25 minutes session, 2 hours and 35 minutes ago - ( - now - Duration::from_secs((1 * 60 + 50) * 60), - now - Duration::from_secs((1 * 60 + 40) * 60), - ), // 10 minutes session, 1 hour and 50 minutes ago - ]; - - for (start, end) in sessions.iter() { - let session = DbNcSession { - session_id: format!("session_id_{}", start.timestamp()), - app_id: "test_app_id".to_string(), - app_metadata: "test_app_metadata".to_string(), - persistent: false, - network: "test_network".to_string(), - client_data: None, - session_open_timestamp: *start, - session_close_timestamp: None, - }; - - db.handle_new_session(&session, None, &"127.0.0.1".to_string()) - .await - .unwrap(); - db.close_session(&session.session_id, *end).await.unwrap(); - } - - // We need to refresh manually the views - db.refresh_continuous_aggregates(vec![ - "daily_sessions_avg_time_per_app".to_string(), - "monthly_sessions_avg_time_per_app".to_string(), - ]) - .await - .unwrap(); - - let result = db - .get_monthly_avg_session_duration_per_app(&app_id) - .await - .unwrap(); - - assert_eq!(result.len(), 1); - - let expected_avg_duration_seconds: f64 = sessions - .iter() - .map(|(start, end)| (end.timestamp() - start.timestamp()) as f64) - .sum::() - / sessions.len() as f64; - - assert_eq!( - result[0].average_duration_seconds, - expected_avg_duration_seconds - ); - } -} diff --git a/database/src/aggregated_views_queries/sessions_stats.rs b/database/src/aggregated_views_queries/sessions_stats.rs deleted file mode 100644 index 8baa9577..00000000 --- a/database/src/aggregated_views_queries/sessions_stats.rs +++ /dev/null @@ -1,207 +0,0 @@ -use crate::{ - db::Db, - structs::{db_error::DbError, filter_requests::SessionsStats, time_filters::TimeFilter}, - tables::utils::{format_view_keys, format_view_name}, -}; - -pub const SESSIONS_STATS_BASE_VIEW_NAME: &str = "sessions_stats_per_app"; -pub const SESSIONS_STATS_BASE_KEYS: [(&'static str, bool); 4] = [ - ("app_id", false), - ("bucket", true), - ("sessions_opened", true), - ("active_users", true), -]; - -impl Db { - pub async fn get_sessions_stats_by_app_id( - &self, - app_id: &str, - filter: TimeFilter, - ) -> Result, DbError> { - let start_date = filter.to_date(); - let bucket_size = filter.bucket_size(); - - // Correctly selecting the view based on the bucket_size - let prefix = match bucket_size { - "1 hour" => "hourly", - "1 day" => "daily", - "1 month" => "monthly", - _ => return Err(DbError::DatabaseError("Invalid bucket size".to_string())), - }; - - let formatted_keys = format_view_keys(prefix, &SESSIONS_STATS_BASE_KEYS); - let formatted_view_name = format_view_name(prefix, SESSIONS_STATS_BASE_VIEW_NAME); - let filter_key = SESSIONS_STATS_BASE_KEYS[1].0; - let filter = format!("{prefix}_{filter_key}"); - - let query = format!( - "SELECT {formatted_keys} - FROM {formatted_view_name} - WHERE app_id = $1 AND {filter} >= $2 - ORDER BY {filter} DESC", - ); - - sqlx::query_as::<_, SessionsStats>(&query) - .bind(app_id) - .bind(start_date) - .fetch_all(&self.connection_pool) - .await - .map_err(|e| e.into()) - } -} - -#[cfg(feature = "cloud_db_tests")] -#[cfg(test)] -mod tests { - use crate::{structs::time_filters::TimeFilter, tables::sessions::table_struct::DbNcSession}; - use sqlx::types::chrono::Utc; - use std::time::Duration; - - #[tokio::test] - async fn test_sessions_count() { - let db = super::Db::connect_to_the_pool().await; - db.truncate_all_tables().await.unwrap(); - - // Create test team instance - let now = Utc::now(); - let start_of_period = now; - let team_id = "test_team_id".to_string(); - let app_id = "test_app_id".to_string(); - - db.setup_test_team(&team_id, &app_id, start_of_period) - .await - .unwrap(); - - // Number of sessions to create - let num_sessions: u64 = 100; - - // Generate and save sessions - for i in 0..num_sessions { - // spread sessions evenly across the day - let session_start = - start_of_period + Duration::from_secs(i * 3600 / num_sessions as u64); - let session_end = session_start + Duration::from_secs(60 * 10); // duration of 10 minutes for each session - - let session = DbNcSession { - session_id: format!("session_{}_{}", app_id, i), - app_id: app_id.clone(), - app_metadata: "test_metadata".to_string(), - persistent: false, - network: "test_network".to_string(), - client_data: None, - session_open_timestamp: session_start, - session_close_timestamp: None, - }; - - db.handle_new_session(&session, None, &"127.0.0.1".to_string()) - .await - .unwrap(); - db.close_session(&session.session_id, session_end) - .await - .unwrap(); - } - - // Manually refresh the continuous aggregates - db.refresh_continuous_aggregates(vec![ - "hourly_sessions_stats_per_app".to_string(), - "daily_sessions_stats_per_app".to_string(), - "monthly_sessions_stats_per_app".to_string(), - ]) - .await - .unwrap(); - - let stats = db - .get_sessions_stats_by_app_id(&app_id, TimeFilter::LastMonth) - .await - .unwrap(); - - assert_eq!(stats.len(), 1); - assert_eq!(stats[0].sessions_opened, num_sessions as i64); - } - - #[tokio::test] - async fn test_sessions_average_daily_sessions_opened() { - let db = super::Db::connect_to_the_pool().await; - db.truncate_all_tables().await.unwrap(); - - // Create test team instance - let team_id = "test_team_id".to_string(); - let app_id = "test_app_id".to_string(); - - db.setup_test_team(&team_id, &app_id, Utc::now()) - .await - .unwrap(); - - let now = Utc::now(); - let start_of_first_period = now - Duration::from_secs(60 * 60 * 24 * 60); // Start of first period, 60 days ago - let start_of_second_period = now - Duration::from_secs(60 * 60 * 24 * 30); // Start of second period, 30 days ago - let num_sessions_first_period: u64 = 40; - let num_sessions_second_period: u64 = 28; - - // Generate and save sessions for the first period - for i in 0..num_sessions_first_period { - let session_start = start_of_first_period - + Duration::from_secs(i * 86400 / num_sessions_first_period as u64); - let session_end = session_start + Duration::from_secs(60 * 30); // Duration of 30 minutes for each session - - let session = DbNcSession { - session_id: format!("session_{}_{}", app_id, i), - app_id: app_id.clone(), - app_metadata: "test_metadata".to_string(), - persistent: false, - network: "test_network".to_string(), - client_data: None, - session_open_timestamp: session_start, - session_close_timestamp: Some(session_end), - }; - - db.handle_new_session(&session, None, &"127.0.0.1".to_string()) - .await - .unwrap(); - db.close_session(&session.session_id, session_end) - .await - .unwrap(); - } - - // Generate and save sessions for the second period - for i in 0..num_sessions_second_period { - let session_start = start_of_second_period - + Duration::from_secs(i * 86400 / num_sessions_second_period as u64); - let session_end = session_start + Duration::from_secs(60 * 30); // Duration of 30 minutes for each session - - let session = DbNcSession { - session_id: format!("session_{}_{}_2nd", app_id, i), // Ensure unique session IDs for the second period - app_id: app_id.clone(), - app_metadata: "test_metadata".to_string(), - persistent: false, - network: "test_network".to_string(), - client_data: None, - session_open_timestamp: session_start, - session_close_timestamp: Some(session_end), - }; - - db.handle_new_session(&session, None, &"127.0.0.1".to_string()) - .await - .unwrap(); - db.close_session(&session.session_id, session_end) - .await - .unwrap(); - } - - // Manually refresh the continuous aggregates - db.refresh_continuous_aggregates(vec![ - "hourly_sessions_stats_per_app".to_string(), - "daily_sessions_stats_per_app".to_string(), - "monthly_sessions_stats_per_app".to_string(), - ]) - .await - .unwrap(); - - let stats = db - .get_sessions_stats_by_app_id(&app_id, TimeFilter::Last30Days) - .await - .unwrap(); - - assert_eq!(stats.len(), 2); - } -} diff --git a/database/src/db.rs b/database/src/db.rs index 329efa14..787a8eac 100644 --- a/database/src/db.rs +++ b/database/src/db.rs @@ -7,20 +7,25 @@ pub struct Db { impl Db { pub async fn connect_to_the_pool() -> Db { dotenvy::from_filename("infra/.env").unwrap(); + + let db_address = std::env::var("DATABASE_ADDRESS").expect("POSTGRES_ADDRESS must be set"); + let db_port = std::env::var("DATABASE_PORT").expect("POSTGRES_PORT must be set"); + let db_name = std::env::var("POSTGRES_DB").expect("POSTGRES_DB must be set"); let db_user = std::env::var("POSTGRES_USER").expect("POSTGRES_USER must be set"); let db_password = std::env::var("POSTGRES_PASSWORD").expect("POSTGRES_PASSWORD must be set"); + let connection_string = format!( + "postgres://{}:{}@{}:{}/{}", + db_user, db_password, db_address, db_port, db_name + ); + + println!("Connecting to the database... {:?}", connection_string); + let pool = PoolOptions::new() .max_connections(50) - .connect( - format!( - "postgres://{}:{}@localhost:5432/{}", - db_user, db_password, db_name - ) - .as_str(), - ) + .connect(connection_string.as_str()) .await .unwrap(); diff --git a/database/src/structs/consts.rs b/database/src/structs/consts.rs index 7b104483..41df0079 100644 --- a/database/src/structs/consts.rs +++ b/database/src/structs/consts.rs @@ -1,2 +1,3 @@ pub const DAY_IN_SECONDS: u64 = 60 * 60 * 24; // 86400 +pub const HOUR_IN_SECONDS: u64 = 60 * 60; // 3600 pub const PAGINATION_PAGE_SIZE: i64 = 1000; diff --git a/server/src/structs/cloud/device_metadata.rs b/database/src/structs/device_metadata.rs similarity index 80% rename from server/src/structs/cloud/device_metadata.rs rename to database/src/structs/device_metadata.rs index a1b447da..e7114210 100644 --- a/server/src/structs/cloud/device_metadata.rs +++ b/database/src/structs/device_metadata.rs @@ -1,13 +1,22 @@ -use crate::structs::common::Device; use serde::{Deserialize, Serialize}; +use strum::Display; use ts_rs::TS; +#[derive(Debug, Display, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[ts(export)] +pub enum Device { + Apple, + Android, + Unknown, +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] #[ts(export)] #[serde(rename_all = "camelCase")] pub enum DeviceMetadata { Mobile(MobileMetadata), Web(WebMetadata), + Unknown, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] @@ -23,7 +32,7 @@ pub struct MobileMetadata { #[serde(rename_all = "camelCase")] pub struct WebMetadata { pub browser: String, - pub version: String, + pub browser_version: String, pub os: String, pub os_version: String, } diff --git a/database/src/structs/domain_verification_status.rs b/database/src/structs/domain_verification_status.rs new file mode 100644 index 00000000..084abd03 --- /dev/null +++ b/database/src/structs/domain_verification_status.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; +use sqlx::Type; +use ts_rs::TS; + +#[derive(Debug, Clone, Eq, PartialEq, Type, Serialize, Deserialize, TS)] +#[ts(export)] +pub enum DomainVerificationStatus { + Pending, + Verified, + Cancelled, +} diff --git a/database/src/structs/medium_type.rs b/database/src/structs/medium_type.rs new file mode 100644 index 00000000..0f63d98f --- /dev/null +++ b/database/src/structs/medium_type.rs @@ -0,0 +1,9 @@ +use sqlx::Type; + +#[derive(Clone, Debug, Eq, PartialEq, Type)] +#[sqlx(type_name = "device_medium_type_enum")] +pub enum DeviceMediumType { + Browser, + Mobile, + Unknown, +} diff --git a/database/src/structs/mod.rs b/database/src/structs/mod.rs index 35c01ed0..785a99a1 100644 --- a/database/src/structs/mod.rs +++ b/database/src/structs/mod.rs @@ -1,10 +1,13 @@ pub mod client_data; pub mod consts; pub mod db_error; +pub mod device_metadata; +pub mod domain_verification_status; pub mod entity_type; pub mod event_type; pub mod filter_requests; pub mod geo_location; +pub mod medium_type; pub mod pagination_cursor; pub mod privilege_level; pub mod request_status; @@ -12,3 +15,4 @@ pub mod request_type; pub mod session_type; pub mod subscription; pub mod time_filters; +pub mod whitelisted_domain; diff --git a/database/src/structs/pagination_cursor.rs b/database/src/structs/pagination_cursor.rs index 2632d250..10c4cde8 100644 --- a/database/src/structs/pagination_cursor.rs +++ b/database/src/structs/pagination_cursor.rs @@ -5,6 +5,7 @@ use ts_rs::TS; use super::{consts::PAGINATION_PAGE_SIZE, db_error::DbError}; #[derive(Serialize, Clone, Deserialize, Debug, TS)] +#[ts(export)] pub struct PaginationCursor(pub String); impl PaginationCursor { diff --git a/database/src/structs/whitelisted_domain.rs b/database/src/structs/whitelisted_domain.rs new file mode 100644 index 00000000..0b9a8cb0 --- /dev/null +++ b/database/src/structs/whitelisted_domain.rs @@ -0,0 +1,24 @@ +use super::domain_verification_status::DomainVerificationStatus; +use crate::tables::registered_app::table_struct::DbRegisteredApp; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct WhitelistedDomain { + pub domain: String, + pub status: DomainVerificationStatus, +} + +impl DbRegisteredApp { + pub fn get_whitelisted_domains(&self) -> Vec { + self.whitelisted_domains + .iter() + .map(|domain| WhitelistedDomain { + domain: domain.clone(), + status: DomainVerificationStatus::Verified, + }) + .collect() + } +} diff --git a/database/src/tables/client_profiles/update.rs b/database/src/tables/client_profiles/update.rs index 12962a58..abc4ea9a 100644 --- a/database/src/tables/client_profiles/update.rs +++ b/database/src/tables/client_profiles/update.rs @@ -24,25 +24,24 @@ impl Db { } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { - use crate::tables::utils::to_microsecond_precision; use sqlx::types::chrono::Utc; #[tokio::test] async fn test_add_client_profile() { let db = super::Db::connect_to_the_pool().await; - db.truncate_all_tables().await.unwrap(); + // db.truncate_all_tables().await.unwrap(); - let now = to_microsecond_precision(&Utc::now()); - let created_profile = db.create_new_profile(None).await.unwrap(); + // let now = to_microsecond_precision(&Utc::now()); + // let created_profile = db.create_new_profile(None).await.unwrap(); - let expected_id = 1; - let profile_result = db.get_profile_by_profile_id(expected_id).await.unwrap(); + // // let expected_id = 1; + // // let profile_result = db.get_profile_by_profile_id(expected_id).await.unwrap(); - assert_eq!(profile_result, created_profile); - assert!(profile_result.client_profile_id == expected_id); - assert!(profile_result.created_at >= now); + // // assert_eq!(profile_result, created_profile); + // // assert!(profile_result.client_profile_id == expected_id); + // // assert!(profile_result.created_at >= now); } } diff --git a/database/src/tables/connection_events/select.rs b/database/src/tables/connection_events/select.rs index 90ded5ad..842245f9 100644 --- a/database/src/tables/connection_events/select.rs +++ b/database/src/tables/connection_events/select.rs @@ -2,91 +2,10 @@ use super::table_struct::ConnectionEvent; use crate::db::Db; use crate::structs::db_error::DbError; use crate::structs::entity_type::EntityType; -use crate::structs::filter_requests::DistinctConnectedClient; use crate::tables::connection_events::table_struct::CONNECTION_EVENTS_TABLE_NAME; use sqlx::query_as; impl Db { - pub async fn get_connection_events_by_session_id( - &self, - session_id: &String, - ) -> Result, DbError> { - let query = format!("SELECT * FROM {CONNECTION_EVENTS_TABLE_NAME} WHERE session_id = $1"); - let typed_query = query_as::<_, ConnectionEvent>(&query); - - return typed_query - .bind(&session_id) - .fetch_all(&self.connection_pool) - .await - .map_err(|e| e.into()); - } - - pub async fn get_connection_events_by_client_profile_id( - &self, - client_profile_id: &String, - ) -> Result, DbError> { - let query = format!( - "SELECT * FROM {CONNECTION_EVENTS_TABLE_NAME} WHERE entity_id = $1 AND entity_type = $2" - ); - let typed_query = query_as::<_, ConnectionEvent>(&query); - - return typed_query - .bind(&client_profile_id) - .bind(&EntityType::Client) - .fetch_all(&self.connection_pool) - .await - .map_err(|e| e.into()); - } - - pub async fn get_connection_events_by_app_id( - &self, - app_id: &String, - ) -> Result, DbError> { - let query = format!("SELECT * FROM {CONNECTION_EVENTS_TABLE_NAME} WHERE app_id = $1"); - let typed_query = query_as::<_, ConnectionEvent>(&query); - - return typed_query - .bind(&app_id) - .fetch_all(&self.connection_pool) - .await - .map_err(|e| e.into()); - } - - pub async fn get_connection_events_by_app( - &self, - app_id: &String, - ) -> Result, DbError> { - let query = format!("SELECT * FROM {CONNECTION_EVENTS_TABLE_NAME} WHERE entity_id = $1 AND entity_type = $2"); - let typed_query = query_as::<_, ConnectionEvent>(&query); - - return typed_query - .bind(&app_id) - .bind(&EntityType::App) - .fetch_all(&self.connection_pool) - .await - .map_err(|e| e.into()); - } - - pub async fn get_all_app_distinct_users( - &self, - app_id: &String, - ) -> Result, DbError> { - let query = format!( - "SELECT pk.public_key, MIN(ce.connected_at) AS first_connection, MAX(ce.connected_at) AS last_connection - FROM {CONNECTION_EVENTS_TABLE_NAME} ce - JOIN public_keys pk ON ce.entity_id = CAST(pk.client_profile_id AS TEXT) - WHERE ce.app_id = $1 AND ce.entity_type = $2 - GROUP BY pk.public_key" - ); - - return query_as::<_, DistinctConnectedClient>(&query) - .bind(app_id) - .bind(EntityType::Client) - .fetch_all(&self.connection_pool) - .await - .map_err(|e| e.into()); - } - pub async fn get_last_connection_attempt_by_client( &self, app_id: &String, @@ -95,7 +14,7 @@ impl Db { let query_body = format!( "SELECT * FROM {CONNECTION_EVENTS_TABLE_NAME} WHERE app_id = $1 AND session_id = $2 AND entity_type = $3 AND success = false - ORDER BY created_at DESC LIMIT 1" + ORDER BY connected_at DESC LIMIT 1" ); let query_result = query_as::<_, ConnectionEvent>(&query_body) diff --git a/database/src/tables/connection_events/table_struct.rs b/database/src/tables/connection_events/table_struct.rs index a9a78d6a..6f3f3cfe 100644 --- a/database/src/tables/connection_events/table_struct.rs +++ b/database/src/tables/connection_events/table_struct.rs @@ -9,12 +9,13 @@ use sqlx::{ pub const CONNECTION_EVENTS_TABLE_NAME: &str = "connection_events"; pub const CONNECTION_EVENTS_KEYS_KEYS: &str = - "event_id, app_id, session_id, entity_id, entity_type, ip_address, session_type, geo_location, success, connected_at, disconnected_at"; + "event_id, app_id, network, session_id, entity_id, entity_type, ip_address, session_type, geo_location, success, connected_at, disconnected_at"; #[derive(Clone, Debug, PartialEq)] pub struct ConnectionEvent { pub event_id: i64, pub app_id: String, + pub network: String, pub session_id: String, pub entity_id: String, pub entity_type: EntityType, @@ -31,6 +32,7 @@ impl FromRow<'_, PgRow> for ConnectionEvent { Ok(ConnectionEvent { event_id: row.get("event_id"), app_id: row.get("app_id"), + network: row.get("network"), session_id: row.get("session_id"), entity_id: row.get("entity_id"), entity_type: row.get("entity_type"), diff --git a/database/src/tables/connection_events/update.rs b/database/src/tables/connection_events/update.rs index 20fb8e6a..6407553f 100644 --- a/database/src/tables/connection_events/update.rs +++ b/database/src/tables/connection_events/update.rs @@ -16,15 +16,18 @@ impl Db { tx: &mut Transaction<'_, Postgres>, session_id: &String, app_id: &String, + network: &String, ip: &String, geo_location: Option, + current_time: &DateTime, ) -> Result<(), DbError> { let query_body = format!( - "INSERT INTO {CONNECTION_EVENTS_TABLE_NAME} ({CONNECTION_EVENTS_KEYS_KEYS}) VALUES (DEFAULT, $1, $2, $3, $4, $5, $6, $7, $8, NOW(), NULL)" + "INSERT INTO {CONNECTION_EVENTS_TABLE_NAME} ({CONNECTION_EVENTS_KEYS_KEYS}) VALUES (DEFAULT, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, NULL)" ); let query_result = query(&query_body) .bind(&app_id) + .bind(&network) .bind(&session_id) .bind(&app_id) .bind(&EntityType::App) @@ -33,6 +36,7 @@ impl Db { .bind(geo_location) // initialize connect event with true success flag .bind(true) + .bind(¤t_time) .execute(&mut **tx) .await; @@ -46,13 +50,15 @@ impl Db { &self, tx: &mut Transaction<'_, Postgres>, app_id: &String, + network: &String, session_id: &String, session_type: &SessionType, ip: &String, geo_location: Option, + current_time: &DateTime, ) -> Result<(), DbError> { let query_body = format!( - "INSERT INTO {CONNECTION_EVENTS_TABLE_NAME} ({CONNECTION_EVENTS_KEYS_KEYS}) VALUES (DEFAULT, $1, $2, $3, $4, $5, $6, $7, $8, NOW(), NULL)" + "INSERT INTO {CONNECTION_EVENTS_TABLE_NAME} ({CONNECTION_EVENTS_KEYS_KEYS}) VALUES (DEFAULT, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, NULL)" ); // If user gets connected, the "client_id" will get replaced with proper client_profile_id derived from user's public key @@ -60,6 +66,7 @@ impl Db { let query_result = query(&query_body) .bind(&app_id) + .bind(&network) .bind(&session_id) .bind(&client_id) .bind(&EntityType::Client) @@ -68,6 +75,7 @@ impl Db { .bind(geo_location) // initialize connect event with false success flag, only update to true if we receive a successful connection event .bind(false) + .bind(¤t_time) .execute(&mut **tx) .await; @@ -176,7 +184,7 @@ impl Db { // TODO fix those tests -// #[cfg(feature = "cloud_db_tests")] +// #[cfg(feature = "cloud_integration_tests")] // #[cfg(test)] // mod tests { diff --git a/database/src/tables/grafana_users/mod.rs b/database/src/tables/domain_verifications/mod.rs similarity index 100% rename from database/src/tables/grafana_users/mod.rs rename to database/src/tables/domain_verifications/mod.rs diff --git a/database/src/tables/domain_verifications/select.rs b/database/src/tables/domain_verifications/select.rs new file mode 100644 index 00000000..77b43723 --- /dev/null +++ b/database/src/tables/domain_verifications/select.rs @@ -0,0 +1,92 @@ +use crate::{ + db::Db, + structs::{ + db_error::DbError, domain_verification_status::DomainVerificationStatus, + whitelisted_domain::WhitelistedDomain, + }, + tables::domain_verifications::table_struct::{ + DomainVerification, DOMAIN_VERIFICATIONS_TABLE_NAME, + }, +}; +use sqlx::query_as; +use std::collections::HashMap; + +impl Db { + pub async fn get_domain_verifications_by_app_id( + &self, + app_id: &String, + ) -> Result, DbError> { + let query = format!("SELECT * FROM {DOMAIN_VERIFICATIONS_TABLE_NAME} WHERE app_id = $1 ORDER BY created_at DESC"); + let typed_query = query_as::<_, DomainVerification>(&query); + + return typed_query + .bind(&app_id) + .fetch_all(&self.connection_pool) + .await + .map_err(|e| e.into()); + } + + pub async fn get_finished_domain_verification_by_domain_name( + &self, + domain_name: &String, + ) -> Result, DbError> { + let query = + format!("SELECT * FROM {DOMAIN_VERIFICATIONS_TABLE_NAME} WHERE domain_name = $1 AND finished_at IS NOT NULL AND cancelled_at IS NULL AND deleted_at IS NULL"); + let typed_query = query_as::<_, DomainVerification>(&query); + + return typed_query + .bind(&domain_name) + .fetch_optional(&self.connection_pool) + .await + .map_err(|e| e.into()); + } + + pub async fn get_pending_domain_verification_by_domain_name_and_app_id( + &self, + domain_name: &String, + app_id: &String, + ) -> Result, DbError> { + let query = + format!("SELECT * FROM {DOMAIN_VERIFICATIONS_TABLE_NAME} WHERE domain_name = $1 AND app_id = $2 AND finished_at IS NULL AND cancelled_at IS NULL AND deleted_at IS NULL"); + let typed_query = query_as::<_, DomainVerification>(&query); + + return typed_query + .bind(&domain_name) + .bind(&app_id) + .fetch_optional(&self.connection_pool) + .await + .map_err(|e| e.into()); + } + + pub async fn get_pending_domain_verifications_by_app_ids( + &self, + app_ids: &Vec, + ) -> Result>, DbError> { + let query = format!( + "SELECT app_id, domain_name FROM {DOMAIN_VERIFICATIONS_TABLE_NAME} WHERE app_id = ANY($1) AND finished_at IS NULL AND cancelled_at IS NULL AND deleted_at IS NULL" + ); + let typed_query = query_as::<_, (String, String)>(&query); + + let mut app_id_to_domain_names: HashMap> = HashMap::new(); + + let rows = typed_query + .bind(app_ids) + .fetch_all(&self.connection_pool) + .await + .map_err(|e| DbError::from(e))?; + + for row in rows { + let (app_id, domain_name) = row; + + app_id_to_domain_names + .entry(app_id) + .or_insert_with(Vec::new) + .push(WhitelistedDomain { + domain: domain_name, + status: DomainVerificationStatus::Pending, + }); + } + + return Ok(app_id_to_domain_names); + } +} diff --git a/database/src/tables/domain_verifications/table_struct.rs b/database/src/tables/domain_verifications/table_struct.rs new file mode 100644 index 00000000..188e1ba3 --- /dev/null +++ b/database/src/tables/domain_verifications/table_struct.rs @@ -0,0 +1,34 @@ +use sqlx::{ + postgres::PgRow, + types::chrono::{DateTime, Utc}, + FromRow, Row, +}; + +pub const DOMAIN_VERIFICATIONS_TABLE_NAME: &str = "domain_verifications"; +pub const DOMAIN_VERIFICATIONS_KEYS: &str = + "domain_name, app_id, code, created_at, finished_at, cancelled_at, deleted_at"; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct DomainVerification { + pub domain_name: String, + pub app_id: String, + pub code: String, + pub created_at: DateTime, + pub finished_at: Option>, + pub cancelled_at: Option>, + pub deleted_at: Option>, +} + +impl FromRow<'_, PgRow> for DomainVerification { + fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { + Ok(DomainVerification { + domain_name: row.get("domain_name"), + app_id: row.get("app_id"), + code: row.get("code"), + created_at: row.get("created_at"), + finished_at: row.get("finished_at"), + cancelled_at: row.get("cancelled_at"), + deleted_at: row.get("deleted_at"), + }) + } +} diff --git a/database/src/tables/domain_verifications/update.rs b/database/src/tables/domain_verifications/update.rs new file mode 100644 index 00000000..bbe33b85 --- /dev/null +++ b/database/src/tables/domain_verifications/update.rs @@ -0,0 +1,331 @@ +use super::table_struct::{DOMAIN_VERIFICATIONS_KEYS, DOMAIN_VERIFICATIONS_TABLE_NAME}; +use crate::db::Db; +use crate::structs::db_error::DbError; +use crate::tables::utils::get_current_datetime; +use sqlx::query; + +impl Db { + pub async fn create_new_domain_verification_entry( + &self, + domain_name: &String, + app_id: &String, + code: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "INSERT INTO {DOMAIN_VERIFICATIONS_TABLE_NAME} ({DOMAIN_VERIFICATIONS_KEYS}) VALUES ($1, $2, $3, $4, NULL, NULL, NULL)" + ); + + let query_result = query(&query_body) + .bind(&domain_name) + .bind(&app_id) + .bind(&code) + .bind(&get_current_datetime()) + .execute(&self.connection_pool) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn finish_domain_verification( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + domain_name: &String, + app_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {DOMAIN_VERIFICATIONS_TABLE_NAME} SET finished_at = $1 WHERE domain_name = $2 AND app_id = $3 AND finished_at IS NULL AND cancelled_at IS NULL AND deleted_at IS NULL" + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(&domain_name) + .bind(&app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn cancel_domain_verification( + &self, + domain_name: &String, + app_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {DOMAIN_VERIFICATIONS_TABLE_NAME} SET cancelled_at = $1 WHERE domain_name = $2 AND app_id = $3 AND finished_at IS NULL AND cancelled_at IS NULL AND deleted_at IS NULL" + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(&domain_name) + .bind(&app_id) + .execute(&self.connection_pool) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + // Sets finished domain verification as deleted aka inactive, this way the same domain can be verified again by the same or another app + pub async fn delete_domain_verification( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + domain_name: &String, + app_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {DOMAIN_VERIFICATIONS_TABLE_NAME} SET deleted_at = $1 WHERE domain_name = $2 AND app_id = $3 AND deleted_at IS NULL AND finished_at IS NOT NULL AND cancelled_at IS NULL" + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(&domain_name) + .bind(&app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn delete_domain_verification_for_inactive_app( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + app_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {DOMAIN_VERIFICATIONS_TABLE_NAME} SET deleted_at = $1 WHERE app_id = $2 AND deleted_at IS NULL" + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(&app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + pub async fn delete_domain_verifications_for_inactive_apps( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + app_ids: &Vec, + ) -> Result<(), DbError> { + if app_ids.is_empty() { + return Ok(()); + } + + let query_body = format!( + "UPDATE {DOMAIN_VERIFICATIONS_TABLE_NAME} + SET deleted_at = $1 + WHERE app_id = ANY($2) + AND deleted_at IS NULL" + ); + + let query_result = sqlx::query(&query_body) + .bind(&get_current_datetime()) + .bind(&app_ids) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + + #[tokio::test] + async fn test_domain_verification() { + let db = super::Db::connect_to_the_pool().await; + db.truncate_all_tables().await.unwrap(); + + let domain_name = "valid_domain_name".to_string(); + let first_app_id = "first_app_id".to_string(); + let second_app_id = "second_app_id".to_string(); + + let code = "code".to_string(); + + // Start verification by first app + db.create_new_domain_verification_entry(&domain_name, &first_app_id, &code) + .await + .unwrap(); + + // Try to verify the same domain by the same app + db.create_new_domain_verification_entry(&domain_name, &first_app_id, &code) + .await + .unwrap_err(); + + // Try to start verification by the second app for the same domain + db.create_new_domain_verification_entry(&domain_name, &second_app_id, &code) + .await + .unwrap(); + + // Finish verification + let mut tx = db.connection_pool.begin().await.unwrap(); + db.finish_domain_verification(&mut tx, &domain_name, &first_app_id) + .await + .unwrap(); + tx.commit().await.unwrap(); + + // Try to finish verification of the same domain, should fail + let mut tx = db.connection_pool.begin().await.unwrap(); + db.finish_domain_verification(&mut tx, &domain_name, &second_app_id) + .await + .unwrap_err(); + tx.rollback().await.unwrap(); + } + + #[tokio::test] + async fn test_domain_verifications() { + let db = super::Db::connect_to_the_pool().await; + db.truncate_all_tables().await.unwrap(); + + let first_app_id = "first_app_id".to_string(); + let second_app_id = "second_app_id".to_string(); + + let code = "code".to_string(); + + // Start verification by first app for random domain + db.create_new_domain_verification_entry( + &"valid_domain_name_1".to_string(), + &first_app_id, + &code, + ) + .await + .unwrap(); + + // Start verification by the second app for random domain + db.create_new_domain_verification_entry( + &"valid_domain_name_2".to_string(), + &second_app_id, + &code, + ) + .await + .unwrap(); + + // Start verification by the second app for random domain + db.create_new_domain_verification_entry( + &"valid_domain_name_3".to_string(), + &second_app_id, + &code, + ) + .await + .unwrap(); + + let test = db + .get_pending_domain_verifications_by_app_ids(&vec![ + first_app_id.clone(), + second_app_id.clone(), + ]) + .await + .unwrap(); + + assert_eq!(test.len(), 2); + assert_eq!(test.get(&first_app_id).unwrap().len(), 1); + assert_eq!(test.get(&second_app_id).unwrap().len(), 2); + + // Cancel verification by the second app + db.cancel_domain_verification(&"valid_domain_name_2".to_string(), &second_app_id) + .await + .unwrap(); + + // Check + let data = db + .get_domain_verifications_by_app_id(&second_app_id) + .await + .unwrap(); + + assert_eq!(data.len(), 2); + // Find the cancelled verification + let cancelled_verification = data + .iter() + .find(|v| v.domain_name == "valid_domain_name_2".to_string()) + .unwrap(); + + assert!(cancelled_verification.cancelled_at.is_some()); + } + + #[tokio::test] + async fn test_domain_verification_deletion() { + let db = super::Db::connect_to_the_pool().await; + db.truncate_all_tables().await.unwrap(); + + let domain_name = "valid_domain_name".to_string(); + let app_id = "app_id".to_string(); + + let code = "code".to_string(); + + // Start verification by first app + db.create_new_domain_verification_entry(&domain_name, &app_id, &code) + .await + .unwrap(); + + let mut tx = db.connection_pool.begin().await.unwrap(); + + // Delete verification + db.delete_domain_verification(&mut tx, &domain_name, &app_id) + .await + .unwrap(); + + tx.commit().await.unwrap(); + + // Check + let data = db + .get_domain_verifications_by_app_id(&app_id) + .await + .unwrap(); + + assert_eq!(data.len(), 1); + assert!(data.get(0).unwrap().deleted_at.is_none()); + + // FInish verification + let mut tx = db.connection_pool.begin().await.unwrap(); + db.finish_domain_verification(&mut tx, &domain_name, &app_id) + .await + .unwrap(); + tx.commit().await.unwrap(); + + // Check + let data = db + .get_domain_verifications_by_app_id(&app_id) + .await + .unwrap(); + + assert_eq!(data.len(), 1); + assert!(data.get(0).unwrap().finished_at.is_some()); + + // Delete verification + let mut tx = db.connection_pool.begin().await.unwrap(); + db.delete_domain_verification(&mut tx, &domain_name, &app_id) + .await + .unwrap(); + + tx.commit().await.unwrap(); + + // Check + let data = db + .get_domain_verifications_by_app_id(&app_id) + .await + .unwrap(); + + assert_eq!(data.len(), 1); + assert!(data.get(0).unwrap().deleted_at.is_some()); + } +} diff --git a/database/src/tables/events/app_connect/table_struct.rs b/database/src/tables/events/app_connect/table_struct.rs index 6cca1b7f..90cce491 100644 --- a/database/src/tables/events/app_connect/table_struct.rs +++ b/database/src/tables/events/app_connect/table_struct.rs @@ -1,15 +1,17 @@ +use crate::structs::medium_type::DeviceMediumType; use sqlx::{postgres::PgRow, FromRow, Row}; pub const EVENT_APP_CONNECT_TABLE_NAME: &str = "event_app_connect"; pub const EVENT_APP_CONNECT_KEYS: &str = - "event_id, session_id, device_metadata, lang, timezone, new_session"; + "event_id, app_id, network, session_id, device_medium_type, device_metadata_uuid, lang, timezone, new_session, creation_timestamp"; #[derive(Clone, Debug, Eq, PartialEq)] pub struct AppConnectEvent { pub event_id: i64, - pub app_id: String, + pub network: String, pub session_id: String, - pub device_metadata: String, + pub device_medium_type: DeviceMediumType, + pub device_metadata_uuid: String, pub lang: String, pub timezone: String, } @@ -18,9 +20,10 @@ impl FromRow<'_, PgRow> for AppConnectEvent { fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { Ok(AppConnectEvent { event_id: row.get("event_id"), - app_id: row.get("app_id"), + network: row.get("network"), session_id: row.get("session_id"), - device_metadata: row.get("device_metadata"), + device_medium_type: row.get("device_medium_type"), + device_metadata_uuid: row.get("device_metadata_uuid"), lang: row.get("lang"), timezone: row.get("timezone"), }) diff --git a/database/src/tables/events/app_connect/update.rs b/database/src/tables/events/app_connect/update.rs index 330db8a3..678a5c5d 100644 --- a/database/src/tables/events/app_connect/update.rs +++ b/database/src/tables/events/app_connect/update.rs @@ -1,6 +1,15 @@ -use crate::tables::events::app_connect::table_struct::EVENT_APP_CONNECT_KEYS; -use crate::tables::events::app_connect::table_struct::EVENT_APP_CONNECT_TABLE_NAME; -use crate::{db::Db, structs::db_error::DbError}; +use crate::{ + db::Db, + structs::{db_error::DbError, device_metadata::DeviceMetadata, medium_type::DeviceMediumType}, + tables::{ + events::app_connect::table_struct::{EVENT_APP_CONNECT_KEYS, EVENT_APP_CONNECT_TABLE_NAME}, + metadata::{ + mobile_metadata::table_struct::DbMobileMetadata, + web_metadata::table_struct::DbWebMetadata, + }, + }, +}; +use chrono::{DateTime, Utc}; use sqlx::Transaction; use sqlx::{query, Postgres}; @@ -9,23 +18,62 @@ impl Db { &self, tx: &mut Transaction<'_, Postgres>, event_id: i64, + app_id: &String, + network: &String, session_id: &String, - device_metadata: &String, + device_metadata: &DeviceMetadata, lang: &String, timezone: &String, new_session: bool, + creation_timestamp: &DateTime, ) -> Result<(), DbError> { + // Save the device metadata to the corresponding table + let (device_metadata_type, device_metadata_uuid) = match device_metadata { + DeviceMetadata::Web(metadata) => { + let device_metadata_uuid = uuid7::uuid7().to_string(); + let web_metadata = DbWebMetadata { + uuid: device_metadata_uuid, + browser: metadata.browser.clone(), + browser_version: metadata.browser_version.clone(), + os: metadata.os.clone(), + os_version: metadata.os_version.clone(), + }; + + self.create_new_device_web_metadata_within_tx(tx, &web_metadata) + .await?; + (DeviceMediumType::Browser, Some(web_metadata.uuid.clone())) + } + DeviceMetadata::Mobile(metadata) => { + let device_metadata_uuid = uuid7::uuid7().to_string(); + let mobile_metadata = DbMobileMetadata { + uuid: device_metadata_uuid, + system_type: metadata.system.to_string().clone(), + system_version: metadata.version.clone(), + }; + + self.create_new_device_mobile_metadata_within_tx(tx, &mobile_metadata) + .await?; + (DeviceMediumType::Mobile, Some(mobile_metadata.uuid.clone())) + } + DeviceMetadata::Unknown => (DeviceMediumType::Unknown, None), + }; + + // Save the app connect event to the database let query_body = format!( - "INSERT INTO {EVENT_APP_CONNECT_TABLE_NAME} ({EVENT_APP_CONNECT_KEYS}) VALUES ($1, $2, $3, $4, $5, $6)" + "INSERT INTO {EVENT_APP_CONNECT_TABLE_NAME} ({EVENT_APP_CONNECT_KEYS}) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)" ); let query_result = query(&query_body) .bind(event_id) + .bind(app_id) + .bind(network) .bind(session_id) - .bind(device_metadata) + .bind(device_metadata_type) + .bind(device_metadata_uuid) .bind(lang) .bind(timezone) .bind(new_session) + .bind(creation_timestamp) .execute(&mut **tx) .await; diff --git a/database/src/tables/events/app_disconnect/table_struct.rs b/database/src/tables/events/app_disconnect/table_struct.rs index 8efac398..4b7d4a98 100644 --- a/database/src/tables/events/app_disconnect/table_struct.rs +++ b/database/src/tables/events/app_disconnect/table_struct.rs @@ -1,8 +1,7 @@ use sqlx::{postgres::PgRow, FromRow, Row}; pub const EVENT_APP_DISCONNECT_TABLE_NAME: &str = "event_app_disconnect"; -pub const EVENT_APP_DISCONNECT_KEYS: &str = - "event_id, session_id, device_metadata, lang, timezone, new_session"; +pub const EVENT_APP_DISCONNECT_KEYS: &str = "event_id, session_id"; #[derive(Clone, Debug, Eq, PartialEq)] pub struct AppDisconnectEvent { diff --git a/database/src/tables/events/events_index/table_struct.rs b/database/src/tables/events/events_index/table_struct.rs index 5817e7b0..a844096c 100644 --- a/database/src/tables/events/events_index/table_struct.rs +++ b/database/src/tables/events/events_index/table_struct.rs @@ -5,12 +5,13 @@ use sqlx::types::chrono; use sqlx::{postgres::PgRow, FromRow, Row}; pub const EVENTS_TABLE_NAME: &str = "events"; -pub const EVENTS_KEYS: &str = "event_id, app_id, event_type, creation_timestamp"; +pub const EVENTS_KEYS: &str = "event_id, app_id, network, event_type, creation_timestamp"; #[derive(Clone, Debug, Eq, PartialEq)] pub struct Event { pub event_id: i64, pub app_id: String, + pub network: String, pub event_type: EventType, pub creation_timestamp: DateTime, } @@ -30,6 +31,7 @@ impl FromRow<'_, PgRow> for Event { Ok(Event { event_id: row.get("event_id"), app_id: row.get("app_id"), + network: row.get("network"), event_type: row.get("event_type"), creation_timestamp: row.get("creation_timestamp"), }) diff --git a/database/src/tables/events/events_index/update.rs b/database/src/tables/events/events_index/update.rs index 0e4b2c2b..1dcb722b 100644 --- a/database/src/tables/events/events_index/update.rs +++ b/database/src/tables/events/events_index/update.rs @@ -3,6 +3,7 @@ use crate::{ structs::{db_error::DbError, event_type::EventType}, tables::events::events_index::table_struct::{EVENTS_KEYS, EVENTS_TABLE_NAME}, }; +use chrono::{DateTime, Utc}; use sqlx::{query, Postgres, Row, Transaction}; impl Db { @@ -10,15 +11,19 @@ impl Db { &self, tx: &mut Transaction<'_, Postgres>, app_id: &String, + network: &String, event_type: &EventType, + current_timestamp: &DateTime, ) -> Result { let query_body = format!( - "INSERT INTO {EVENTS_TABLE_NAME} ({EVENTS_KEYS}) VALUES (DEFAULT, $1, $2, DEFAULT) RETURNING event_id" + "INSERT INTO {EVENTS_TABLE_NAME} ({EVENTS_KEYS}) VALUES (DEFAULT, $1, $2, $3, $4) RETURNING event_id" ); let query_result = query(&query_body) .bind(app_id) + .bind(network) .bind(event_type) + .bind(current_timestamp) .fetch_one(&mut **tx) .await; @@ -29,8 +34,11 @@ impl Db { } } +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { + use crate::tables::utils::get_current_datetime; + use super::*; #[tokio::test] @@ -40,6 +48,7 @@ mod tests { let app_id = "test_app".to_string(); let event_type = EventType::AppConnect; + let network = "Solana".to_string(); // Create 1001 entries let mut tx = db @@ -50,7 +59,13 @@ mod tests { for _ in 0..2001 { let _ = db - .create_new_event_entry(&mut tx, &app_id, &event_type) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &event_type, + &get_current_datetime(), + ) .await .unwrap(); } diff --git a/database/src/tables/events/sign_message/update.rs b/database/src/tables/events/sign_message/update.rs index 7307006c..a5d9c539 100644 --- a/database/src/tables/events/sign_message/update.rs +++ b/database/src/tables/events/sign_message/update.rs @@ -43,7 +43,7 @@ impl Db { request_status: RequestStatus, ) -> Result<(), DbError> { let query_body = format!( - "UPDATE {EVENT_SIGN_MESSAGE_TABLE_NAME} SET request_status = $1, WHERE request_id = $2" + "UPDATE {EVENT_SIGN_MESSAGE_TABLE_NAME} SET request_status = $1 WHERE request_id = $2" ); let query_result = query(&query_body) diff --git a/database/src/tables/events/sign_transaction/update.rs b/database/src/tables/events/sign_transaction/update.rs index 53e1b329..a0e103d5 100644 --- a/database/src/tables/events/sign_transaction/update.rs +++ b/database/src/tables/events/sign_transaction/update.rs @@ -18,7 +18,7 @@ impl Db { network_id: &String, ) -> Result<(), DbError> { let query_body = format!( - "INSERT INTO {EVENT_SIGN_TRANSACTION_TABLE_NAME} ({EVENT_SIGN_TRANSACTION_KEYS}) VALUES ($1, $2, $3, $4, $5)" + "INSERT INTO {EVENT_SIGN_TRANSACTION_TABLE_NAME} ({EVENT_SIGN_TRANSACTION_KEYS}) VALUES ($1, $2, $3, $4, $5, NULL)" ); let query_result = query(&query_body) @@ -27,7 +27,6 @@ impl Db { .bind(request_id) .bind(RequestStatus::Pending) .bind(network_id) - .bind(None::) .execute(&mut **tx) .await; diff --git a/database/src/tables/grafana_users/select.rs b/database/src/tables/grafana_users/select.rs deleted file mode 100644 index ecfc5548..00000000 --- a/database/src/tables/grafana_users/select.rs +++ /dev/null @@ -1,32 +0,0 @@ -use super::table_struct::GrafanaUser; -use crate::db::Db; -use crate::structs::db_error::DbError; -use crate::tables::grafana_users::table_struct::GRAFANA_USERS_TABLE_NAME; -use sqlx::query_as; - -impl Db { - pub async fn get_user_by_user_id( - &self, - user_id: &String, - ) -> Result, DbError> { - let query = format!("SELECT * FROM {GRAFANA_USERS_TABLE_NAME} WHERE user_id = $1"); - let typed_query = query_as::<_, GrafanaUser>(&query); - - return typed_query - .bind(&user_id) - .fetch_optional(&self.connection_pool) - .await - .map_err(|e| e.into()); - } - - pub async fn get_user_by_email(&self, email: &String) -> Result, DbError> { - let query = format!("SELECT * FROM {GRAFANA_USERS_TABLE_NAME} WHERE email = $1"); - let typed_query = query_as::<_, GrafanaUser>(&query); - - return typed_query - .bind(&email) - .fetch_optional(&self.connection_pool) - .await - .map_err(|e| e.into()); - } -} diff --git a/database/src/tables/grafana_users/table_struct.rs b/database/src/tables/grafana_users/table_struct.rs deleted file mode 100644 index 5b07c513..00000000 --- a/database/src/tables/grafana_users/table_struct.rs +++ /dev/null @@ -1,27 +0,0 @@ -use sqlx::{ - postgres::PgRow, - types::chrono::{DateTime, Utc}, - FromRow, Row, -}; - -pub const GRAFANA_USERS_TABLE_NAME: &str = "grafana_users"; -pub const GRAFANA_USERS_KEYS: &str = "user_id, email, password_hash, creation_timestamp"; - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct GrafanaUser { - pub user_id: String, - pub email: String, - pub password_hash: String, - pub creation_timestamp: DateTime, -} - -impl FromRow<'_, PgRow> for GrafanaUser { - fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { - Ok(GrafanaUser { - email: row.get("email"), - password_hash: row.get("password_hash"), - user_id: row.get("user_id"), - creation_timestamp: row.get("creation_timestamp"), - }) - } -} diff --git a/database/src/tables/grafana_users/update.rs b/database/src/tables/grafana_users/update.rs deleted file mode 100644 index dded9d7f..00000000 --- a/database/src/tables/grafana_users/update.rs +++ /dev/null @@ -1,84 +0,0 @@ -use super::table_struct::{GrafanaUser, GRAFANA_USERS_KEYS, GRAFANA_USERS_TABLE_NAME}; -use crate::db::Db; -use crate::structs::db_error::DbError; -use sqlx::query; -use sqlx::Transaction; - -impl Db { - pub async fn create_new_user_within_tx( - &self, - tx: &mut Transaction<'_, sqlx::Postgres>, - user: &GrafanaUser, - ) -> Result<(), DbError> { - let query_body = format!( - "INSERT INTO {GRAFANA_USERS_TABLE_NAME} ({GRAFANA_USERS_KEYS}) VALUES ($1, $2, $3, $4)" - ); - - let query_result = query(&query_body) - .bind(&user.user_id) - .bind(&user.email) - .bind(&user.password_hash) - .bind(&user.creation_timestamp) - .execute(&mut **tx) - .await; - - match query_result { - Ok(_) => Ok(()), - Err(e) => Err(e).map_err(|e| e.into()), - } - } - - pub async fn add_new_user(&self, user: &GrafanaUser) -> Result<(), DbError> { - let query_body = format!( - "INSERT INTO {GRAFANA_USERS_TABLE_NAME} ({GRAFANA_USERS_KEYS}) VALUES ($1, $2, $3, $4)" - ); - - let query_result = query(&query_body) - .bind(&user.user_id) - .bind(&user.email) - .bind(&user.password_hash) - .bind(&user.creation_timestamp) - .execute(&self.connection_pool) - .await; - - match query_result { - Ok(_) => Ok(()), - Err(e) => Err(e).map_err(|e| e.into()), - } - } -} - -#[cfg(feature = "cloud_db_tests")] -#[cfg(test)] -mod tests { - use crate::tables::{ - grafana_users::table_struct::GrafanaUser, utils::to_microsecond_precision, - }; - use sqlx::types::chrono::Utc; - - #[tokio::test] - async fn test_create_user() { - let db = super::Db::connect_to_the_pool().await; - db.truncate_all_tables().await.unwrap(); - - // Create test team instance - let team_id = "test_team_id".to_string(); - let app_id = "test_app_id".to_string(); - - db.setup_test_team(&team_id, &app_id, Utc::now()) - .await - .unwrap(); - - let user = GrafanaUser { - email: "test_user_email".to_string(), - password_hash: "test_password_hash".to_string(), - user_id: "test_user_id".to_string(), - creation_timestamp: to_microsecond_precision(&Utc::now()), - }; - - db.add_new_user(&user).await.unwrap(); - - let user_result = db.get_user_by_user_id(&user.user_id).await.unwrap(); - assert_eq!(user_result, Some(user)); - } -} diff --git a/database/src/tables/ip_addresses/update.rs b/database/src/tables/ip_addresses/update.rs index 3598d3ac..ac1c0ee8 100644 --- a/database/src/tables/ip_addresses/update.rs +++ b/database/src/tables/ip_addresses/update.rs @@ -36,7 +36,7 @@ impl Db { } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { diff --git a/database/src/tables/metadata/mobile_metadata/mod.rs b/database/src/tables/metadata/mobile_metadata/mod.rs new file mode 100644 index 00000000..6027081c --- /dev/null +++ b/database/src/tables/metadata/mobile_metadata/mod.rs @@ -0,0 +1,2 @@ +pub mod table_struct; +pub mod update; diff --git a/database/src/tables/metadata/mobile_metadata/table_struct.rs b/database/src/tables/metadata/mobile_metadata/table_struct.rs new file mode 100644 index 00000000..c8598309 --- /dev/null +++ b/database/src/tables/metadata/mobile_metadata/table_struct.rs @@ -0,0 +1,21 @@ +use sqlx::{postgres::PgRow, FromRow, Row}; + +pub const MOBILE_METADATA_TABLE_NAME: &str = "mobile_metadata"; +pub const MOBILE_METADATA_KEYS: &str = "uuid, system_type, system_version"; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct DbMobileMetadata { + pub uuid: String, + pub system_type: String, + pub system_version: String, +} + +impl FromRow<'_, PgRow> for DbMobileMetadata { + fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { + Ok(DbMobileMetadata { + uuid: row.get("uuid"), + system_type: row.get("system_type"), + system_version: row.get("system_version"), + }) + } +} diff --git a/database/src/tables/metadata/mobile_metadata/update.rs b/database/src/tables/metadata/mobile_metadata/update.rs new file mode 100644 index 00000000..0c1bf471 --- /dev/null +++ b/database/src/tables/metadata/mobile_metadata/update.rs @@ -0,0 +1,32 @@ +use crate::{ + db::Db, + structs::db_error::DbError, + tables::metadata::mobile_metadata::table_struct::{ + DbMobileMetadata, MOBILE_METADATA_KEYS, MOBILE_METADATA_TABLE_NAME, + }, +}; +use sqlx::{query, Transaction}; + +impl Db { + pub async fn create_new_device_mobile_metadata_within_tx( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + metadata: &DbMobileMetadata, + ) -> Result<(), DbError> { + let query_body = format!( + "INSERT INTO {MOBILE_METADATA_TABLE_NAME} ({MOBILE_METADATA_KEYS}) VALUES ($1, $2, $3)" + ); + + let query_result = query(&query_body) + .bind(&metadata.uuid) + .bind(&metadata.system_type) + .bind(&metadata.system_version) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } +} diff --git a/database/src/tables/metadata/mod.rs b/database/src/tables/metadata/mod.rs new file mode 100644 index 00000000..46086f78 --- /dev/null +++ b/database/src/tables/metadata/mod.rs @@ -0,0 +1,2 @@ +pub mod mobile_metadata; +pub mod web_metadata; diff --git a/database/src/tables/metadata/web_metadata/mod.rs b/database/src/tables/metadata/web_metadata/mod.rs new file mode 100644 index 00000000..6027081c --- /dev/null +++ b/database/src/tables/metadata/web_metadata/mod.rs @@ -0,0 +1,2 @@ +pub mod table_struct; +pub mod update; diff --git a/database/src/tables/metadata/web_metadata/table_struct.rs b/database/src/tables/metadata/web_metadata/table_struct.rs new file mode 100644 index 00000000..767ce0b4 --- /dev/null +++ b/database/src/tables/metadata/web_metadata/table_struct.rs @@ -0,0 +1,25 @@ +use sqlx::{postgres::PgRow, FromRow, Row}; + +pub const WEB_METADATA_TABLE_NAME: &str = "web_metadata"; +pub const WEB_METADATA_KEYS: &str = "uuid, browser, browser_version, os, os_version"; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct DbWebMetadata { + pub uuid: String, + pub browser: String, + pub browser_version: String, + pub os: String, + pub os_version: String, +} + +impl FromRow<'_, PgRow> for DbWebMetadata { + fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { + Ok(DbWebMetadata { + uuid: row.get("uuid"), + browser: row.get("browser"), + browser_version: row.get("browser_version"), + os: row.get("os"), + os_version: row.get("os_version"), + }) + } +} diff --git a/database/src/tables/metadata/web_metadata/update.rs b/database/src/tables/metadata/web_metadata/update.rs new file mode 100644 index 00000000..3a7da167 --- /dev/null +++ b/database/src/tables/metadata/web_metadata/update.rs @@ -0,0 +1,33 @@ +use crate::{ + db::Db, + structs::db_error::DbError, + tables::metadata::web_metadata::table_struct::{ + DbWebMetadata, WEB_METADATA_KEYS, WEB_METADATA_TABLE_NAME, + }, +}; +use sqlx::{query, Transaction}; + +impl Db { + pub async fn create_new_device_web_metadata_within_tx( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + metadata: &DbWebMetadata, + ) -> Result<(), DbError> { + let query_body = + format!("INSERT INTO {WEB_METADATA_TABLE_NAME} ({WEB_METADATA_KEYS}) VALUES ($1, $2, $3, $4, $5)"); + + let query_result = query(&query_body) + .bind(&metadata.uuid) + .bind(&metadata.browser) + .bind(&metadata.browser_version) + .bind(&metadata.os) + .bind(&metadata.os_version) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } +} diff --git a/database/src/tables/mod.rs b/database/src/tables/mod.rs index 9c5ec739..75c16d9a 100644 --- a/database/src/tables/mod.rs +++ b/database/src/tables/mod.rs @@ -1,11 +1,14 @@ pub mod client_profiles; pub mod connection_events; pub mod events; -pub mod grafana_users; pub mod ip_addresses; pub mod public_keys; pub mod registered_app; +pub mod users; // pub mod requests; +pub mod domain_verifications; +pub mod metadata; +pub mod networks; pub mod session_public_keys; pub mod sessions; pub mod team; diff --git a/database/src/tables/networks/mod.rs b/database/src/tables/networks/mod.rs new file mode 100644 index 00000000..4b2d4aa3 --- /dev/null +++ b/database/src/tables/networks/mod.rs @@ -0,0 +1,3 @@ +pub mod select; +pub mod table_struct; +pub mod update; diff --git a/database/src/tables/networks/select.rs b/database/src/tables/networks/select.rs new file mode 100644 index 00000000..b1a1c45b --- /dev/null +++ b/database/src/tables/networks/select.rs @@ -0,0 +1,17 @@ +use super::table_struct::Network; +use crate::db::Db; +use crate::structs::db_error::DbError; +use crate::tables::networks::table_struct::NETWORKS_TABLE_NAME; +use sqlx::query_as; + +impl Db { + pub async fn get_all_networks(&self) -> Result, DbError> { + let query = format!("SELECT * FROM {NETWORKS_TABLE_NAME}"); + let typed_query = query_as::<_, Network>(&query); + + return typed_query + .fetch_all(&self.connection_pool) + .await + .map_err(|e| e.into()); + } +} diff --git a/database/src/tables/networks/table_struct.rs b/database/src/tables/networks/table_struct.rs new file mode 100644 index 00000000..530652bd --- /dev/null +++ b/database/src/tables/networks/table_struct.rs @@ -0,0 +1,17 @@ +use sqlx::{postgres::PgRow, FromRow, Row}; + +pub const NETWORKS_TABLE_NAME: &str = "networks"; +pub const NETWORKS_KEYS: &str = "network"; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Network { + pub network: String, +} + +impl FromRow<'_, PgRow> for Network { + fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { + Ok(Network { + network: row.get("network"), + }) + } +} diff --git a/database/src/tables/networks/update.rs b/database/src/tables/networks/update.rs new file mode 100644 index 00000000..44aa926e --- /dev/null +++ b/database/src/tables/networks/update.rs @@ -0,0 +1,50 @@ +use super::table_struct::{NETWORKS_KEYS, NETWORKS_TABLE_NAME}; +use crate::{db::Db, structs::db_error::DbError}; +use sqlx::{query, Transaction}; + +impl Db { + pub async fn add_new_network( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + network: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "INSERT INTO {NETWORKS_TABLE_NAME} ({NETWORKS_KEYS}) VALUES ($1) ON CONFLICT DO NOTHING" + ); + let query_result = query(&query_body).bind(network).execute(&mut **tx).await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + + #[tokio::test] + async fn test_add_new_network() { + let db = super::Db::connect_to_the_pool().await; + db.truncate_all_tables().await.unwrap(); + + let network = "test_network".to_string(); + + let mut tx = db.connection_pool.begin().await.unwrap(); + db.add_new_network(&mut tx, &network).await.unwrap(); + tx.commit().await.unwrap(); + + let networks = db.get_all_networks().await.unwrap(); + assert_eq!(networks.len(), 1); + assert_eq!(networks[0].network, network); + + let mut tx = db.connection_pool.begin().await.unwrap(); + db.add_new_network(&mut tx, &network).await.unwrap(); + tx.commit().await.unwrap(); + + let networks = db.get_all_networks().await.unwrap(); + assert_eq!(networks.len(), 1); + assert_eq!(networks[0].network, network); + } +} diff --git a/database/src/tables/public_keys/update.rs b/database/src/tables/public_keys/update.rs index 7a5b4c7a..4852cdc1 100644 --- a/database/src/tables/public_keys/update.rs +++ b/database/src/tables/public_keys/update.rs @@ -83,7 +83,7 @@ impl Db { } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { diff --git a/database/src/tables/registered_app/select.rs b/database/src/tables/registered_app/select.rs index 6735b1f0..87765983 100644 --- a/database/src/tables/registered_app/select.rs +++ b/database/src/tables/registered_app/select.rs @@ -7,7 +7,7 @@ impl Db { &self, app_id: &String, ) -> Result, DbError> { - let query = format!("SELECT * FROM {REGISTERED_APPS_TABLE_NAME} WHERE app_id = $1"); + let query = format!("SELECT * FROM {REGISTERED_APPS_TABLE_NAME} WHERE app_id = $1 AND deactivated_at IS NULL"); let typed_query = query_as::<_, DbRegisteredApp>(&query); return typed_query @@ -23,7 +23,7 @@ impl Db { team_id: &String, ) -> Result, DbError> { let query = format!( - "SELECT * FROM {REGISTERED_APPS_TABLE_NAME} WHERE app_name = $1 AND team_id = $2" + "SELECT * FROM {REGISTERED_APPS_TABLE_NAME} WHERE app_name = $1 AND team_id = $2 AND deactivated_at IS NULL" ); let typed_query = query_as::<_, DbRegisteredApp>(&query); diff --git a/database/src/tables/registered_app/table_struct.rs b/database/src/tables/registered_app/table_struct.rs index 528671c3..94eace7f 100644 --- a/database/src/tables/registered_app/table_struct.rs +++ b/database/src/tables/registered_app/table_struct.rs @@ -6,7 +6,7 @@ use sqlx::{ pub const REGISTERED_APPS_TABLE_NAME: &str = "registered_apps"; pub const REGISTERED_APPS_KEYS: &str = - "team_id, app_id, app_name, whitelisted_domains, ack_public_keys, registration_timestamp"; + "team_id, app_id, app_name, whitelisted_domains, ack_public_keys, registration_timestamp, deactivated_at"; #[derive(Clone, Debug, Eq, PartialEq)] pub struct DbRegisteredApp { @@ -16,6 +16,7 @@ pub struct DbRegisteredApp { pub whitelisted_domains: Vec, pub ack_public_keys: Vec, pub registration_timestamp: DateTime, + pub deactivated_at: Option>, } impl FromRow<'_, PgRow> for DbRegisteredApp { @@ -27,6 +28,7 @@ impl FromRow<'_, PgRow> for DbRegisteredApp { whitelisted_domains: row.get("whitelisted_domains"), ack_public_keys: row.get("ack_public_keys"), registration_timestamp: row.get("registration_timestamp"), + deactivated_at: row.get("deactivated_at"), }) } } diff --git a/database/src/tables/registered_app/update.rs b/database/src/tables/registered_app/update.rs index 4545cd02..82361c15 100644 --- a/database/src/tables/registered_app/update.rs +++ b/database/src/tables/registered_app/update.rs @@ -1,11 +1,16 @@ use super::table_struct::{DbRegisteredApp, REGISTERED_APPS_KEYS, REGISTERED_APPS_TABLE_NAME}; -use crate::{db::Db, structs::db_error::DbError}; + +use crate::{ + db::Db, + structs::db_error::DbError, + tables::{team::table_struct::TEAM_TABLE_NAME, utils::get_current_datetime}, +}; use sqlx::{query, Transaction}; impl Db { pub async fn register_new_app(&self, app: &DbRegisteredApp) -> Result<(), DbError> { let query_body = format!( - "INSERT INTO {REGISTERED_APPS_TABLE_NAME} ({REGISTERED_APPS_KEYS}) VALUES ($1, $2, $3, $4, $5, $6)" + "INSERT INTO {REGISTERED_APPS_TABLE_NAME} ({REGISTERED_APPS_KEYS}) VALUES ($1, $2, $3, $4, $5, $6, NULL)", ); let query_result = query(&query_body) @@ -30,7 +35,7 @@ impl Db { app: &DbRegisteredApp, ) -> Result<(), DbError> { let query_body = format!( - "INSERT INTO {REGISTERED_APPS_TABLE_NAME} ({}) VALUES ($1, $2, $3, $4, $5, $6)", + "INSERT INTO {REGISTERED_APPS_TABLE_NAME} ({}) VALUES ($1, $2, $3, $4, $5, $6, NULL)", REGISTERED_APPS_KEYS ); @@ -49,4 +54,90 @@ impl Db { Err(e) => Err(e).map_err(|e| e.into()), } } + + pub async fn add_new_whitelisted_domain( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + app_id: &str, + domain: &str, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {REGISTERED_APPS_TABLE_NAME} SET whitelisted_domains = array_append(whitelisted_domains, $1) WHERE app_id = $2 AND deactivated_at IS NULL", + ); + + let query_result = query(&query_body) + .bind(domain) + .bind(app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn remove_whitelisted_domain( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + app_id: &str, + domain: &str, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {REGISTERED_APPS_TABLE_NAME} SET whitelisted_domains = array_remove(whitelisted_domains, $1) WHERE app_id = $2 AND deactivated_at IS NULL", + ); + + let query_result = query(&query_body) + .bind(domain) + .bind(app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn deactivate_app( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + app_id: &str, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {REGISTERED_APPS_TABLE_NAME} SET deactivated_at = $1 WHERE app_id = $2 AND deactivated_at IS NULL", + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn deactivate_user_apps( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + user_id: &str, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {REGISTERED_APPS_TABLE_NAME} SET deactivated_at = $1 WHERE team_id IN (SELECT team_id FROM {TEAM_TABLE_NAME} WHERE team_admin_id = $2 AND deactivated_at IS NULL) AND deactivated_at IS NULL", + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(user_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } } diff --git a/database/src/tables/requests/table_struct.rs b/database/src/tables/requests/table_struct.rs index 0af6fe8b..5f75c8df 100644 --- a/database/src/tables/requests/table_struct.rs +++ b/database/src/tables/requests/table_struct.rs @@ -26,9 +26,11 @@ impl FromRow<'_, PgRow> for Request { Ok(Request { request_id: row.get("request_id"), app_id: row.get("app_id"), - request_type: RequestType::from_str(row.get("request_type")).unwrap(), + request_type: RequestType::from_str(row.get("request_type")) + .map_err(|_| sqlx::Error::Decode(format!("Invalid request_type")))?, session_id: row.get("session_id"), - request_status: row.get("request_status"), + request_status: RequestStatus::from_str(row.get("request_status")) + .map_err(|_| sqlx::Error::Decode(format!("Invalid request_status")))?, network: row.get("network"), creation_timestamp: row.get("creation_timestamp"), }) diff --git a/database/src/tables/requests/update.rs b/database/src/tables/requests/update.rs index 5c7ab17a..80e59cae 100644 --- a/database/src/tables/requests/update.rs +++ b/database/src/tables/requests/update.rs @@ -49,7 +49,7 @@ impl Db { } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { diff --git a/database/src/tables/session_public_keys/update.rs b/database/src/tables/session_public_keys/update.rs index 94798e89..936f70a6 100644 --- a/database/src/tables/session_public_keys/update.rs +++ b/database/src/tables/session_public_keys/update.rs @@ -34,7 +34,7 @@ impl Db { } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; diff --git a/database/src/tables/sessions/update.rs b/database/src/tables/sessions/update.rs index 1d7aac3c..cbb4850a 100644 --- a/database/src/tables/sessions/update.rs +++ b/database/src/tables/sessions/update.rs @@ -16,8 +16,12 @@ impl Db { session: &DbNcSession, geo_location: Option, ip_address: &String, + current_time: &DateTime, ) -> Result<(), DbError> { - let mut tx = self.connection_pool.begin().await.unwrap(); + let mut tx = match self.connection_pool.begin().await { + Ok(tx) => tx, + Err(err) => return Err(err.into()), + }; // 1. Save the new session if let Err(err) = self.save_new_session(&mut tx, &session).await { @@ -34,8 +38,10 @@ impl Db { &mut tx, &session.session_id, &session.app_id, + &session.network, &ip_address, geo_location, + ¤t_time, ) .await { @@ -46,8 +52,10 @@ impl Db { return Err(err); } - tx.commit().await.unwrap(); - + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + return Err(err).map_err(|err| err.into()); + } Ok(()) } @@ -111,7 +119,10 @@ impl Db { session_id: &String, ) -> Result<(), DbError> { // Start a new transaction - let mut tx = self.connection_pool.begin().await.unwrap(); + let mut tx = match self.connection_pool.begin().await { + Ok(tx) => tx, + Err(err) => return Err(err.into()), + }; // User can't connect to the session without any connected keys if connected_keys.is_empty() { @@ -227,20 +238,23 @@ impl Db { return Err(err); } - tx.commit().await.unwrap(); + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + return Err(err).map_err(|err| err.into()); + } Ok(()) } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; use crate::{ structs::{request_status::RequestStatus, request_type::RequestType}, - tables::utils::get_date_time, + tables::utils::{get_current_datetime, get_date_time}, }; #[tokio::test] @@ -268,9 +282,14 @@ mod tests { }; // Create a new session entry - db.handle_new_session(&session, None, &"127.0.0.1".to_string()) - .await - .unwrap(); + db.handle_new_session( + &session, + None, + &"127.0.0.1".to_string(), + &get_current_datetime(), + ) + .await + .unwrap(); // Get all sessions by app_id let sessions = db.get_sessions_by_app_id(&session.app_id).await.unwrap(); diff --git a/database/src/tables/team/select.rs b/database/src/tables/team/select.rs index 49cec382..00c35dca 100644 --- a/database/src/tables/team/select.rs +++ b/database/src/tables/team/select.rs @@ -11,7 +11,9 @@ impl Db { tx: Option<&mut Transaction<'_, sqlx::Postgres>>, team_id: &String, ) -> Result, DbError> { - let query = format!("SELECT * FROM {TEAM_TABLE_NAME} WHERE team_id = $1"); + let query = format!( + "SELECT * FROM {TEAM_TABLE_NAME} WHERE team_id = $1 AND deactivated_at IS NULL" + ); let typed_query = query_as::<_, Team>(&query); match tx { @@ -39,7 +41,7 @@ impl Db { let query = format!( "SELECT r.* FROM {REGISTERED_APPS_TABLE_NAME} r INNER JOIN team t ON r.team_id = t.team_id - WHERE t.team_id = $1 + WHERE t.team_id = $1 AND r.deactivated_at IS NULL AND t.deactivated_at IS NULL ORDER BY t.registration_timestamp DESC" ); let typed_query = query_as::<_, DbRegisteredApp>(&query); @@ -56,7 +58,7 @@ impl Db { admin_id: &String, ) -> Result, DbError> { let query = format!( - "SELECT * FROM {TEAM_TABLE_NAME} WHERE team_admin_id = $1 AND personal = false" + "SELECT * FROM {TEAM_TABLE_NAME} WHERE team_admin_id = $1 AND personal = false AND deactivated_at IS NULL" ); let typed_query = query_as::<_, Team>(&query); @@ -72,7 +74,7 @@ impl Db { admin_id: &String, ) -> Result, DbError> { let query = - format!("SELECT * FROM {TEAM_TABLE_NAME} WHERE team_admin_id = $1 AND personal = true"); + format!("SELECT * FROM {TEAM_TABLE_NAME} WHERE team_admin_id = $1 AND personal = true AND deactivated_at IS NULL"); let typed_query = query_as::<_, Team>(&query); return typed_query @@ -88,7 +90,7 @@ impl Db { admin_id: &String, ) -> Result, DbError> { let query = - format!("SELECT * FROM {TEAM_TABLE_NAME} WHERE team_name = $1 AND team_admin_id = $2"); + format!("SELECT * FROM {TEAM_TABLE_NAME} WHERE team_name = $1 AND deactivated_at IS NULL AND team_admin_id = $2"); let typed_query = query_as::<_, Team>(&query); return typed_query @@ -99,13 +101,12 @@ impl Db { .map_err(|e| e.into()); } - pub async fn get_team_by_admin_id(&self, admin_id: &String) -> Result, DbError> { - let query = format!("SELECT * FROM {TEAM_TABLE_NAME} WHERE team_admin_id = $1"); + pub async fn get_all_teams(&self) -> Result, DbError> { + let query = format!("SELECT * FROM {TEAM_TABLE_NAME} WHERE deactivated_at IS NULL"); let typed_query = query_as::<_, Team>(&query); return typed_query - .bind(&admin_id) - .fetch_optional(&self.connection_pool) + .fetch_all(&self.connection_pool) .await .map_err(|e| e.into()); } diff --git a/database/src/tables/team/table_struct.rs b/database/src/tables/team/table_struct.rs index 2e368fc2..e007a080 100644 --- a/database/src/tables/team/table_struct.rs +++ b/database/src/tables/team/table_struct.rs @@ -7,28 +7,32 @@ use sqlx::{ pub const TEAM_TABLE_NAME: &str = "team"; pub const TEAM_KEYS: &str = - "team_id, team_name, personal, subscription, team_admin_id, registration_timestamp"; + "team_id, grafana_id, team_name, personal, subscription, team_admin_id, registration_timestamp, deactivated_at"; #[derive(Clone, Debug, Eq, PartialEq)] pub struct Team { pub team_id: String, + pub grafana_id: Option, pub personal: bool, pub team_name: String, // Subscription is required to get access to the statistics pub subscription: Option, pub team_admin_id: String, pub registration_timestamp: DateTime, + pub deactivated_at: Option>, } impl FromRow<'_, PgRow> for Team { fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { Ok(Team { team_id: row.get("team_id"), + grafana_id: row.get("grafana_id"), team_name: row.get("team_name"), personal: row.get("personal"), subscription: row.get("subscription"), registration_timestamp: row.get("registration_timestamp"), team_admin_id: row.get("team_admin_id"), + deactivated_at: row.get("deactivated_at"), }) } } diff --git a/database/src/tables/team/update.rs b/database/src/tables/team/update.rs index 1dbdbacb..2ca76df0 100644 --- a/database/src/tables/team/update.rs +++ b/database/src/tables/team/update.rs @@ -2,7 +2,10 @@ use super::table_struct::TEAM_KEYS; use crate::{ db::Db, structs::{db_error::DbError, subscription::Subscription}, - tables::team::table_struct::{Team, TEAM_TABLE_NAME}, + tables::{ + team::table_struct::{Team, TEAM_TABLE_NAME}, + utils::get_current_datetime, + }, }; use sqlx::{query, Transaction}; @@ -12,11 +15,13 @@ impl Db { tx: &mut Transaction<'_, sqlx::Postgres>, team: &Team, ) -> Result<(), DbError> { - let query_body = - format!("INSERT INTO {TEAM_TABLE_NAME} ({TEAM_KEYS}) VALUES ($1, $2, $3, $4, $5, $6)"); + let query_body = format!( + "INSERT INTO {TEAM_TABLE_NAME} ({TEAM_KEYS}) VALUES ($1, $2, $3, $4, $5, $6, $7, NULL)" + ); let query_result = query(&query_body) .bind(&team.team_id) + .bind(&team.grafana_id) .bind(&team.team_name) .bind(&team.personal) .bind(&team.subscription) @@ -32,11 +37,13 @@ impl Db { } pub async fn create_new_team(&self, team: &Team) -> Result<(), DbError> { - let query_body = - format!("INSERT INTO {TEAM_TABLE_NAME} ({TEAM_KEYS}) VALUES ($1, $2, $3, $4, $5, $6)"); + let query_body = format!( + "INSERT INTO {TEAM_TABLE_NAME} ({TEAM_KEYS}) VALUES ($1, $2, $3, $4, $5, $6, $7, NULL)" + ); let query_result = query(&query_body) .bind(&team.team_id) + .bind(&team.grafana_id) .bind(&team.team_name) .bind(&team.personal) .bind(&team.subscription) @@ -56,8 +63,9 @@ impl Db { team_id: &String, subscription: &Subscription, ) -> Result<(), DbError> { - let query_body = - format!("UPDATE {TEAM_TABLE_NAME} SET subscription = $1 WHERE team_id = $2"); + let query_body = format!( + "UPDATE {TEAM_TABLE_NAME} SET subscription = $1 WHERE team_id = $2 AND deactivated_at IS NULL" + ); let query_result = query(&query_body) .bind(subscription) .bind(team_id) @@ -69,14 +77,83 @@ impl Db { Err(e) => Err(e).map_err(|e| e.into()), } } + + pub async fn deactivate_team( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + team_id: &str, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {TEAM_TABLE_NAME} SET deactivated_at = $1 WHERE team_id = $2 AND deactivated_at IS NULL", + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(team_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn update_grafana_id(&self, team_id: &str, grafana_id: &str) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {TEAM_TABLE_NAME} SET grafana_id = $1 WHERE team_id = $2 AND deactivated_at IS NULL", + ); + + let query_result = query(&query_body) + .bind(grafana_id) + .bind(team_id) + .execute(&self.connection_pool) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn clear_all_grafana_ids(&self) -> Result<(), DbError> { + let query_body = format!("UPDATE {TEAM_TABLE_NAME} SET grafana_id = NULL",); + + let query_result = query(&query_body).execute(&self.connection_pool).await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn delete_all_user_teams( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + user_id: &str, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {TEAM_TABLE_NAME} SET deactivated_at = $1 WHERE team_admin_id = $2 AND deactivated_at IS NULL", + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(user_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::tables::{ - grafana_users::table_struct::GrafanaUser, team::table_struct::Team, - utils::to_microsecond_precision, + team::table_struct::Team, test_utils::test_utils::to_microsecond_precision, }; use sqlx::types::chrono::Utc; @@ -86,23 +163,24 @@ mod tests { db.truncate_all_tables().await.unwrap(); // First create a user - let admin = GrafanaUser { - email: "test_email".to_string(), - password_hash: "test_password_hash".to_string(), - user_id: "test_user_id".to_string(), - creation_timestamp: to_microsecond_precision(&Utc::now()), - }; + let user_id = "test_user_id".to_string(); + let email = "test_user_email".to_string(); + let password_hash = "test_password_hash".to_string(); - db.add_new_user(&admin).await.unwrap(); + db.add_new_user(&user_id, &email, Some(&password_hash), None) + .await + .unwrap(); // Create team and register app let team = Team { team_id: "test_team_id".to_string(), + grafana_id: Some("test_grafana_id".to_string()), team_name: "test_team_name".to_string(), personal: false, subscription: None, team_admin_id: "test_team_admin_id".to_string(), registration_timestamp: to_microsecond_precision(&Utc::now()), + deactivated_at: None, }; db.create_new_team(&team).await.unwrap(); diff --git a/database/src/tables/team_invites/select.rs b/database/src/tables/team_invites/select.rs index bcfbe83d..401feb3f 100644 --- a/database/src/tables/team_invites/select.rs +++ b/database/src/tables/team_invites/select.rs @@ -20,7 +20,7 @@ impl Db { ti.accepted_at, ti.cancelled_at, t.team_name, gu.email AS admin_email FROM {TEAM_INVITES_TABLE_NAME} ti INNER JOIN team t ON ti.team_id = t.team_id - INNER JOIN grafana_users gu ON t.team_admin_id = gu.user_id + INNER JOIN users gu ON t.team_admin_id = gu.user_id WHERE ti.team_id = $1 {additional_filter} ORDER BY ti.created_at DESC", ); @@ -49,7 +49,7 @@ impl Db { ti.accepted_at, ti.cancelled_at, t.team_name, gu.email AS admin_email \ FROM {TEAM_INVITES_TABLE_NAME} ti \ INNER JOIN team t ON ti.team_id = t.team_id \ - INNER JOIN grafana_users gu ON t.team_admin_id = gu.user_id \ + INNER JOIN users gu ON t.team_admin_id = gu.user_id \ WHERE ti.user_email = $1 {additional_filter} \ ORDER BY ti.created_at DESC", TEAM_INVITES_TABLE_NAME = TEAM_INVITES_TABLE_NAME diff --git a/database/src/tables/team_invites/update.rs b/database/src/tables/team_invites/update.rs index 2aab9ad3..58792cd6 100644 --- a/database/src/tables/team_invites/update.rs +++ b/database/src/tables/team_invites/update.rs @@ -1,8 +1,8 @@ use super::table_struct::{TEAM_INVITES_KEYS, TEAM_INVITES_TABLE_NAME}; use crate::db::Db; use crate::structs::db_error::DbError; -use crate::tables::utils::get_current_datetime; -use sqlx::query; +use crate::tables::{team::table_struct::TEAM_TABLE_NAME, utils::get_current_datetime}; +use sqlx::{query, Transaction}; impl Db { pub async fn create_new_team_invite( @@ -71,4 +71,48 @@ impl Db { Err(e) => Err(e).map_err(|e| e.into()), } } + + pub async fn cancel_all_team_invites( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + team_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {TEAM_INVITES_TABLE_NAME} SET cancelled_at = $1 WHERE team_id = $2 AND accepted_at IS NULL AND cancelled_at IS NULL" + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(&team_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn cancel_all_team_invites_containing_email( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + user_email: &String, + user_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {TEAM_INVITES_TABLE_NAME} SET cancelled_at = $1 WHERE (user_email = $2 OR team_id IN (SELECT team_id FROM {TEAM_TABLE_NAME} WHERE team_admin_id = $3 AND deactivated_at IS NULL) ) AND accepted_at IS NULL AND cancelled_at IS NULL" + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(&user_email) + .bind(&user_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } } diff --git a/database/src/tables/test_utils.rs b/database/src/tables/test_utils.rs index be46dfbb..1657c97e 100644 --- a/database/src/tables/test_utils.rs +++ b/database/src/tables/test_utils.rs @@ -1,15 +1,15 @@ -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] pub mod test_utils { use crate::{ db::Db, structs::{db_error::DbError, privilege_level::PrivilegeLevel}, tables::{ - grafana_users::table_struct::GrafanaUser, registered_app::table_struct::DbRegisteredApp, team::table_struct::Team, - user_app_privileges::table_struct::UserAppPrivilege, + user_app_privileges::table_struct::UserAppPrivilege, utils::get_current_datetime, }, }; + use chrono::TimeZone; use sqlx::{ types::chrono::{DateTime, Utc}, Row, Transaction, @@ -28,11 +28,18 @@ pub mod test_utils { return Ok(()); } + let filter_list = vec![ + "_sqlx_migrations".to_string(), + "spatial_ref_sys".to_string(), + "geography_columns".to_string(), + "geometry_columns".to_string(), + ]; + // Join all names except _sqlx_migrations into a single string and run single truncate let tables_names = rows .iter() .map(|row| row.get::("table_name")) - .filter(|table_name| !table_name.starts_with("_sqlx_migrations")) + .filter(|table_name| !filter_list.contains(table_name)) .collect::>() .join(", "); @@ -82,38 +89,39 @@ pub mod test_utils { app_id: &String, registration_timestamp: DateTime, ) -> Result<(), DbError> { - let admin = GrafanaUser { - creation_timestamp: registration_timestamp, - email: "email".to_string(), - password_hash: "pass_hash".to_string(), - user_id: "test_admin".to_string(), - }; + let user_id = "test_admin".to_string(); + let email = "admin".to_string(); + let password_hash = "pass_hash".to_string(); - self.add_new_user(&admin).await?; + self.add_new_user(&user_id, &email, Some(&password_hash), None) + .await?; let team = Team { team_id: team_id.clone(), + grafana_id: None, team_name: "test_team_name".to_string(), personal: false, subscription: None, - team_admin_id: admin.user_id.clone(), + team_admin_id: user_id.clone(), registration_timestamp: registration_timestamp, + deactivated_at: None, }; let registered_app = DbRegisteredApp { team_id: team_id.clone(), app_id: app_id.clone(), - app_name: "test_app".to_string(), + app_name: format!("{app_id}_APP_NAME").to_string(), whitelisted_domains: vec!["localhost".to_string()], ack_public_keys: vec!["key".to_string()], registration_timestamp: registration_timestamp, + deactivated_at: None, }; let admin_privilege = UserAppPrivilege { app_id: app_id.clone(), creation_timestamp: registration_timestamp, privilege_level: PrivilegeLevel::Admin, - user_id: admin.user_id.clone(), + user_id: user_id.clone(), }; // Start a transaction @@ -152,4 +160,12 @@ pub mod test_utils { Ok(()) } } + + pub fn to_microsecond_precision(datetime: &DateTime) -> DateTime { + // Should never fail as we are converting from a valid DateTime + match Utc.timestamp_micros(datetime.timestamp_micros()) { + chrono::LocalResult::Single(dt) => dt, + _ => get_current_datetime(), + } + } } diff --git a/database/src/tables/user_app_privileges/select.rs b/database/src/tables/user_app_privileges/select.rs index 433fc09a..cd39f118 100644 --- a/database/src/tables/user_app_privileges/select.rs +++ b/database/src/tables/user_app_privileges/select.rs @@ -3,16 +3,18 @@ use crate::{ db::Db, structs::db_error::DbError, tables::{ - grafana_users::table_struct::GRAFANA_USERS_TABLE_NAME, registered_app::table_struct::{DbRegisteredApp, REGISTERED_APPS_TABLE_NAME}, team::table_struct::{Team, TEAM_TABLE_NAME}, user_app_privileges::table_struct::USER_APP_PRIVILEGES_TABLE_NAME, + users::table_struct::USERS_TABLE_NAME, }, }; use sqlx::{query_as, types::chrono::DateTime}; use sqlx::{types::chrono::Utc, Row}; use std::collections::HashMap; +// When app or team is not active, the privileges will be deleted, so we don't need to check it + impl Db { pub async fn get_privilege_by_user_id_and_app_id( &self, @@ -68,8 +70,7 @@ impl Db { let query = format!( "SELECT uap.* FROM {USER_APP_PRIVILEGES_TABLE_NAME} uap JOIN {REGISTERED_APPS_TABLE_NAME} ra ON uap.app_id = ra.app_id - WHERE ra.team_id = $1 - GROUP BY uap.app_id, uap.user_id, uap.creation_timestamp, uap.privilege_level" + WHERE ra.team_id = $1" ); let typed_query = sqlx::query_as::<_, UserAppPrivilege>(&query); @@ -110,11 +111,12 @@ impl Db { )>, DbError, > { + // 17.10.2024 Hubert: "If this ever breaks, I will write comments." let query = format!( "WITH RelevantTeams AS ( - SELECT DISTINCT t.team_id, t.team_name, t.personal, t.subscription, + SELECT DISTINCT t.team_id, t.grafana_id, t.team_name, t.personal, t.subscription, t.registration_timestamp, gu.email AS team_admin_email, - gu.user_id AS team_admin_id, + gu.user_id AS team_admin_id, t.deactivated_at, CASE WHEN t.team_admin_id = $1 THEN t.registration_timestamp ELSE MAX(uap.creation_timestamp) OVER (PARTITION BY t.team_id) @@ -122,16 +124,16 @@ impl Db { FROM {TEAM_TABLE_NAME} t LEFT JOIN {REGISTERED_APPS_TABLE_NAME} ra ON t.team_id = ra.team_id LEFT JOIN {USER_APP_PRIVILEGES_TABLE_NAME} uap ON ra.app_id = uap.app_id AND uap.user_id = $1 - JOIN {GRAFANA_USERS_TABLE_NAME} gu ON t.team_admin_id = gu.user_id - WHERE t.team_admin_id = $1 OR uap.user_id = $1 + JOIN {USERS_TABLE_NAME} gu ON t.team_admin_id = gu.user_id + WHERE (t.team_admin_id = $1 OR uap.user_id = $1) AND t.deactivated_at IS NULL ) - SELECT rt.team_id, rt.team_name, rt.personal, rt.subscription, rt.registration_timestamp, + SELECT rt.team_id, rt.grafana_id, rt.team_name, rt.personal, rt.subscription, rt.registration_timestamp, rt.team_admin_email, rt.team_admin_id, ra.app_id, ra.app_name, ra.whitelisted_domains, ra.ack_public_keys, ra.registration_timestamp AS app_registration_timestamp, uap.user_id, uap.privilege_level, uap.creation_timestamp AS privilege_creation_timestamp, - rt.user_joined_team_timestamp + rt.user_joined_team_timestamp, ra.deactivated_at FROM RelevantTeams rt - LEFT JOIN {REGISTERED_APPS_TABLE_NAME} ra ON rt.team_id = ra.team_id + LEFT JOIN {REGISTERED_APPS_TABLE_NAME} ra ON rt.team_id = ra.team_id AND ra.deactivated_at IS NULL LEFT JOIN {USER_APP_PRIVILEGES_TABLE_NAME} uap ON ra.app_id = uap.app_id AND uap.user_id = $1 ORDER BY rt.team_id, ra.app_id" ); @@ -161,11 +163,13 @@ impl Db { for row in rows { let team = Team { team_id: row.get("team_id"), + grafana_id: row.get("grafana_id"), personal: row.get("personal"), team_name: row.get("team_name"), subscription: row.get("subscription"), registration_timestamp: row.get("registration_timestamp"), team_admin_id: row.get("team_admin_id"), + deactivated_at: row.get("deactivated_at"), }; let admin_email = row.get("team_admin_email"); @@ -186,6 +190,7 @@ impl Db { whitelisted_domains: row.get("whitelisted_domains"), ack_public_keys: row.get("ack_public_keys"), registration_timestamp: row.get("app_registration_timestamp"), + deactivated_at: row.get("deactivated_at"), }; let privilege = UserAppPrivilege { diff --git a/database/src/tables/user_app_privileges/update.rs b/database/src/tables/user_app_privileges/update.rs index 4419d293..2cc310b1 100644 --- a/database/src/tables/user_app_privileges/update.rs +++ b/database/src/tables/user_app_privileges/update.rs @@ -9,6 +9,7 @@ use crate::tables::user_app_privileges::table_struct::{ USER_APP_PRIVILEGES_KEYS, USER_APP_PRIVILEGES_TABLE_NAME, }; use crate::tables::utils::get_current_datetime; +use log::error; use sqlx::query; use sqlx::Transaction; @@ -62,8 +63,9 @@ impl Db { team_id: &String, ) -> Result<(), DbError> { // Retrieve all apps associated with the team - let apps_query = - format!("SELECT app_id FROM {REGISTERED_APPS_TABLE_NAME} WHERE team_id = $1"); + let apps_query = format!( + "SELECT app_id FROM {REGISTERED_APPS_TABLE_NAME} WHERE team_id = $1 AND deactivated_at IS NULL" + ); let apps: Vec = sqlx::query_as(&apps_query) .bind(team_id) .fetch_all(&self.connection_pool) @@ -110,8 +112,9 @@ impl Db { team_id: &String, ) -> Result<(), DbError> { // Retrieve all apps associated with the team - let apps_query = - format!("SELECT app_id FROM {REGISTERED_APPS_TABLE_NAME} WHERE team_id = $1"); + let apps_query = format!( + "SELECT app_id FROM {REGISTERED_APPS_TABLE_NAME} WHERE team_id = $1 AND deactivated_at IS NULL" + ); let apps: Vec = sqlx::query_as(&apps_query) .bind(team_id) .fetch_all(&self.connection_pool) @@ -148,7 +151,10 @@ impl Db { } // Commit the transaction - tx.commit().await?; + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + return Err(err).map_err(|err| err.into()); + } Ok(()) } @@ -199,17 +205,109 @@ impl Db { Ok(()) } + + pub async fn update_user_privilege( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + user_id: &String, + app_id: &String, + new_privilege_level: PrivilegeLevel, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {USER_APP_PRIVILEGES_TABLE_NAME} SET privilege_level = $1 WHERE user_id = $2 AND app_id = $3" + ); + + let query_result = query(&query_body) + .bind(&new_privilege_level) + .bind(user_id) + .bind(app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn remove_user_privilege( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + user_id: &String, + app_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "DELETE FROM {USER_APP_PRIVILEGES_TABLE_NAME} WHERE user_id = $1 AND app_id = $2" + ); + + let query_result = query(&query_body) + .bind(user_id) + .bind(app_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + pub async fn remove_privileges_for_inactive_app_within_tx( + &self, + tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, + app_id: &str, + ) -> Result<(), DbError> { + let query_body = format!("DELETE FROM {USER_APP_PRIVILEGES_TABLE_NAME} WHERE app_id = $1"); + let query_result = query(&query_body).bind(app_id).execute(&mut **tx).await; + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn remove_inactive_user_from_teams( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + user_id: &String, + ) -> Result<(), DbError> { + let query_body = format!("DELETE FROM {USER_APP_PRIVILEGES_TABLE_NAME} WHERE user_id = $1"); + let query_result = query(&query_body).bind(user_id).execute(&mut **tx).await; + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn remove_privileges_for_inactive_teams( + &self, + tx: &mut Transaction<'_, sqlx::Postgres>, + user_id: &String, + ) -> Result<(), DbError> { + let query_body = format!( + "DELETE FROM {USER_APP_PRIVILEGES_TABLE_NAME} + WHERE app_id IN ( + SELECT app_id + FROM {REGISTERED_APPS_TABLE_NAME} r + INNER JOIN team t ON r.team_id = t.team_id + WHERE t.team_admin_id = $1 + )" + ); + let query_result = query(&query_body).bind(user_id).execute(&mut **tx).await; + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::{ structs::privilege_level::PrivilegeLevel, tables::{ - grafana_users::table_struct::GrafanaUser, registered_app::table_struct::DbRegisteredApp, team::table_struct::Team, - user_app_privileges::table_struct::UserAppPrivilege, utils::to_microsecond_precision, + test_utils::test_utils::to_microsecond_precision, + user_app_privileges::table_struct::UserAppPrivilege, }, }; use sqlx::types::chrono::Utc; @@ -227,16 +325,16 @@ mod tests { .await .unwrap(); - let user = GrafanaUser { - email: "test_user_email".to_string(), - password_hash: "test_password_hash".to_string(), - user_id: "test_user_id".to_string(), - creation_timestamp: to_microsecond_precision(&Utc::now()), - }; - db.add_new_user(&user).await.unwrap(); + let user_id = "test_user_id".to_string(); + let email = "test_user_email".to_string(); + let password_hash = "test_password_hash".to_string(); + + db.add_new_user(&user_id, &email, Some(&password_hash), None) + .await + .unwrap(); let privilege = UserAppPrivilege { - user_id: user.user_id.clone(), + user_id: user_id.clone(), app_id: app_id.clone(), privilege_level: PrivilegeLevel::Edit, creation_timestamp: to_microsecond_precision(&Utc::now()), @@ -244,12 +342,12 @@ mod tests { db.add_new_privilege(&privilege).await.unwrap(); let get_by_user_id_and_app_id = db - .get_privilege_by_user_id_and_app_id(&user.user_id, &app_id) + .get_privilege_by_user_id_and_app_id(&user_id, &app_id) .await .unwrap(); assert_eq!(privilege, get_by_user_id_and_app_id.unwrap()); - let get_by_user_id = db.get_privileges_by_user_id(&user.user_id).await.unwrap(); + let get_by_user_id = db.get_privileges_by_user_id(&user_id).await.unwrap(); assert_eq!(vec![privilege.clone()], get_by_user_id); let get_by_app_id = db.get_privileges_by_app_id(&app_id).await.unwrap(); @@ -270,13 +368,13 @@ mod tests { .await .unwrap(); - let user = GrafanaUser { - email: "test_user_email".to_string(), - password_hash: "test_password_hash".to_string(), - user_id: "test_user_id".to_string(), - creation_timestamp: to_microsecond_precision(&Utc::now()), - }; - db.add_new_user(&user).await.unwrap(); + let user_id = "test_user_id".to_string(); + let email = "test_user_email".to_string(); + let password_hash = "test_password_hash".to_string(); + + db.add_new_user(&user_id, &email, Some(&password_hash), None) + .await + .unwrap(); // Create 7 more apps under the same team for i in 0..7 { @@ -288,18 +386,19 @@ mod tests { app_name: format!("test_app_name_{}", i), team_id: team_id.clone(), registration_timestamp: to_microsecond_precision(&Utc::now()), + deactivated_at: None, }; db.register_new_app(&app).await.unwrap(); } let mut tx = db.connection_pool.begin().await.unwrap(); - db.add_user_to_the_team(&mut tx, &user.user_id, &team_id) + db.add_user_to_the_team(&mut tx, &user_id, &team_id) .await .unwrap(); tx.commit().await.unwrap(); - let get_by_user_id = db.get_privileges_by_user_id(&user.user_id).await.unwrap(); + let get_by_user_id = db.get_privileges_by_user_id(&user_id).await.unwrap(); assert!(get_by_user_id.len() == 8); // Create new team @@ -307,11 +406,13 @@ mod tests { let team = Team { team_id: team_id.clone(), + grafana_id: None, team_name: "test_team_name".to_string(), personal: false, subscription: None, team_admin_id: "test_team_admin_id".to_string(), registration_timestamp: to_microsecond_precision(&Utc::now()), + deactivated_at: None, }; db.create_new_team(&team).await.unwrap(); @@ -326,6 +427,7 @@ mod tests { app_name: format!("test_app_name_{}", i), team_id: team_id.clone(), registration_timestamp: to_microsecond_precision(&Utc::now()), + deactivated_at: None, }; db.register_new_app(&app).await.unwrap(); @@ -333,12 +435,12 @@ mod tests { // Add user to the new team let mut tx = db.connection_pool.begin().await.unwrap(); - db.add_user_to_the_team(&mut tx, &user.user_id, &team_id) + db.add_user_to_the_team(&mut tx, &user_id, &team_id) .await .unwrap(); tx.commit().await.unwrap(); - let get_by_user_id = db.get_privileges_by_user_id(&user.user_id).await.unwrap(); + let get_by_user_id = db.get_privileges_by_user_id(&user_id).await.unwrap(); assert!(get_by_user_id.len() == 10); } } diff --git a/database/src/tables/users/mod.rs b/database/src/tables/users/mod.rs new file mode 100644 index 00000000..4b2d4aa3 --- /dev/null +++ b/database/src/tables/users/mod.rs @@ -0,0 +1,3 @@ +pub mod select; +pub mod table_struct; +pub mod update; diff --git a/database/src/tables/users/select.rs b/database/src/tables/users/select.rs new file mode 100644 index 00000000..56addc12 --- /dev/null +++ b/database/src/tables/users/select.rs @@ -0,0 +1,69 @@ +use std::collections::HashMap; + +use super::table_struct::{User, UserIdEmail}; +use crate::db::Db; +use crate::structs::db_error::DbError; +use crate::tables::users::table_struct::USERS_TABLE_NAME; +use sqlx::query_as; + +impl Db { + pub async fn get_user_by_user_id(&self, user_id: &String) -> Result, DbError> { + let query = format!( + "SELECT * FROM {USERS_TABLE_NAME} WHERE user_id = $1 AND deactivated_at IS NULL" + ); + let typed_query = query_as::<_, User>(&query); + + return typed_query + .bind(&user_id) + .fetch_optional(&self.connection_pool) + .await + .map_err(|e| e.into()); + } + + pub async fn get_user_by_email(&self, email: &String) -> Result, DbError> { + let query = + format!("SELECT * FROM {USERS_TABLE_NAME} WHERE email = $1 AND deactivated_at IS NULL"); + let typed_query = query_as::<_, User>(&query); + + return typed_query + .bind(&email) + .fetch_optional(&self.connection_pool) + .await + .map_err(|e| e.into()); + } + + pub async fn get_users_ids_by_emails( + &self, + emails: &Vec, + ) -> Result, DbError> { + // User email to user id + let query = format!("SELECT user_id, email FROM {USERS_TABLE_NAME} WHERE email = ANY($1) AND deactivated_at IS NULL"); + let typed_query = query_as::<_, UserIdEmail>(&query); + + let data_vec = typed_query + .bind(&emails) + .fetch_all(&self.connection_pool) + .await + .map_err(|e| DbError::from(e))?; + + return Ok(data_vec.into_iter().map(|x| (x.email, x.user_id)).collect()); + } + + pub async fn get_users_emails_by_ids( + &self, + user_ids: &Vec, + ) -> Result, DbError> { + // User id to user email + let query = + format!("SELECT user_id, email FROM {USERS_TABLE_NAME} WHERE user_id = ANY($1) AND deactivated_at IS NULL"); + let typed_query = query_as::<_, UserIdEmail>(&query); + + let data_vec = typed_query + .bind(&user_ids) + .fetch_all(&self.connection_pool) + .await + .map_err(|e| DbError::from(e))?; + + return Ok(data_vec.into_iter().map(|x| (x.user_id, x.email)).collect()); + } +} diff --git a/database/src/tables/users/table_struct.rs b/database/src/tables/users/table_struct.rs new file mode 100644 index 00000000..f131528a --- /dev/null +++ b/database/src/tables/users/table_struct.rs @@ -0,0 +1,54 @@ +use sqlx::{ + postgres::PgRow, + types::chrono::{DateTime, Utc}, + FromRow, Row, +}; +use webauthn_rs::prelude::Passkey; + +pub const USERS_TABLE_NAME: &str = "users"; +pub const USERS_KEYS: &str = + "user_id, email, password_hash, passkeys, creation_timestamp, deactivated_at"; + +#[derive(Clone, Debug, PartialEq)] +pub struct User { + pub user_id: String, + pub email: String, + pub password_hash: Option, + pub passkeys: Option>, + pub creation_timestamp: DateTime, + pub deactivated_at: Option>, +} + +impl FromRow<'_, PgRow> for User { + fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { + let passkeys: Option = row.get("passkeys"); + Ok(User { + email: row.get("email"), + password_hash: row.get("password_hash"), + passkeys: match passkeys { + Some(passkeys) => { + serde_json::from_str(&passkeys).map_err(|e| sqlx::Error::Decode(Box::new(e)))? + } + None => None, + }, + user_id: row.get("user_id"), + creation_timestamp: row.get("creation_timestamp"), + deactivated_at: row.get("deactivated_at"), + }) + } +} + +#[derive(Clone, Debug, PartialEq)] +pub struct UserIdEmail { + pub user_id: String, + pub email: String, +} + +impl FromRow<'_, PgRow> for UserIdEmail { + fn from_row(row: &sqlx::postgres::PgRow) -> std::result::Result { + Ok(UserIdEmail { + user_id: row.get("user_id"), + email: row.get("email"), + }) + } +} diff --git a/database/src/tables/users/update.rs b/database/src/tables/users/update.rs new file mode 100644 index 00000000..7ac89b77 --- /dev/null +++ b/database/src/tables/users/update.rs @@ -0,0 +1,160 @@ +use super::table_struct::{USERS_KEYS, USERS_TABLE_NAME}; +use crate::db::Db; +use crate::structs::db_error::DbError; +use crate::tables::utils::get_current_datetime; +use sqlx::{query, Transaction}; +use webauthn_rs::prelude::Passkey; + +impl Db { + pub async fn add_new_user( + &self, + user_id: &String, + email: &String, + password_hash: Option<&String>, + passkey: Option<&Passkey>, + ) -> Result<(), DbError> { + let query_body = format!( + "INSERT INTO {USERS_TABLE_NAME} ({USERS_KEYS}) VALUES ($1, $2, $3, $4, $5, NULL)" + ); + + let passkey = match passkey { + Some(passkey) => { + let serialized_passkey = + serde_json::to_string(&vec![passkey.clone()]).map_err(|e| { + DbError::DatabaseError(format!( + "Failed to serialize passkey: {}", + e.to_string() + )) + })?; + + Some(serialized_passkey) + } + None => None, + }; + let query_result = query(&query_body) + .bind(&user_id) + .bind(&email) + .bind(&password_hash) + .bind(&passkey) + .bind(&get_current_datetime()) + .execute(&self.connection_pool) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn set_new_password( + &self, + user_email: &String, + new_password: &String, + ) -> Result<(), DbError> { + let query_body = + format!("UPDATE {USERS_TABLE_NAME} SET password_hash = $1 WHERE email = $2 AND deactivated_at IS NULL"); + + let query_result = query(&query_body) + .bind(new_password) + .bind(user_email) + .execute(&self.connection_pool) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn update_passkeys( + &self, + user_email: &String, + passkeys: &Vec, + ) -> Result<(), DbError> { + let serialized_passkey = serde_json::to_string(passkeys).map_err(|e| { + DbError::DatabaseError(format!("Failed to serialize passkey: {}", e.to_string())) + })?; + + let query_body = format!("UPDATE {USERS_TABLE_NAME} SET passkeys = $1 WHERE email = $2 AND deactivated_at IS NULL"); + + let query_result = query(&query_body) + .bind(&serialized_passkey) + .bind(user_email) + .execute(&self.connection_pool) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } + + pub async fn deactivate_user( + &self, + user_id: &String, + tx: &mut Transaction<'_, sqlx::Postgres>, + ) -> Result<(), DbError> { + let query_body = format!( + "UPDATE {USERS_TABLE_NAME} SET deactivated_at = $1 WHERE user_id = $2 AND deactivated_at IS NULL" + ); + + let query_result = query(&query_body) + .bind(&get_current_datetime()) + .bind(user_id) + .execute(&mut **tx) + .await; + + match query_result { + Ok(_) => Ok(()), + Err(e) => Err(e).map_err(|e| e.into()), + } + } +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use crate::tables::{ + test_utils::test_utils::to_microsecond_precision, users::table_struct::User, + }; + use sqlx::types::chrono::Utc; + + #[tokio::test] + async fn test_create_user() { + let db = super::Db::connect_to_the_pool().await; + db.truncate_all_tables().await.unwrap(); + + // Create test team instance + let team_id = "test_team_id".to_string(); + let app_id = "test_app_id".to_string(); + + db.setup_test_team(&team_id, &app_id, Utc::now()) + .await + .unwrap(); + + let password = "test_password_hash".to_string(); + let user = User { + email: "test_user_email".to_string(), + password_hash: Some(password.clone()), + user_id: "test_user_id".to_string(), + passkeys: None, + creation_timestamp: to_microsecond_precision(&Utc::now()), + deactivated_at: None, + }; + + db.add_new_user(&user.user_id, &user.email, Some(&password), None) + .await + .unwrap(); + + let user_result = db + .get_user_by_user_id(&user.user_id) + .await + .unwrap() + .unwrap(); + + assert_eq!(user.email, user_result.email); + assert_eq!(user.password_hash, user_result.password_hash); + assert_eq!(user.user_id, user_result.user_id); + assert_eq!(user.passkeys, user_result.passkeys); + } +} diff --git a/database/src/tables/utils.rs b/database/src/tables/utils.rs index 53aeb985..30f0fcda 100644 --- a/database/src/tables/utils.rs +++ b/database/src/tables/utils.rs @@ -15,11 +15,6 @@ pub fn get_current_datetime() -> DateTime { Utc::now() } -pub fn to_microsecond_precision(datetime: &DateTime) -> DateTime { - // Should never fail as we are converting from a valid DateTime - Utc.timestamp_micros(datetime.timestamp_micros()).unwrap() -} - // This function is used to format the keys of a table to be used in a view query pub fn format_view_keys(prefix: &str, keys: &[(&'static str, bool)]) -> String { keys.iter() @@ -38,7 +33,7 @@ pub fn format_view_name(prefix: &str, view_name: &str) -> String { format!("{}_{}", prefix, view_name) } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod test { use super::*; diff --git a/grafana-client-gen/.env b/grafana-client-gen/.env new file mode 100644 index 00000000..f7e7d6f0 --- /dev/null +++ b/grafana-client-gen/.env @@ -0,0 +1,3 @@ +OPENAPI_GENERATOR_DIR=./build +OPENAPI_LANGUAGE=rust +TARGET_DIR=../openapi \ No newline at end of file diff --git a/grafana-client-gen/run_codegen.sh b/grafana-client-gen/run_codegen.sh new file mode 100755 index 00000000..898ce113 --- /dev/null +++ b/grafana-client-gen/run_codegen.sh @@ -0,0 +1,107 @@ +#!/bin/bash +# Source both .env files +if [ -f .env ]; then + export $(cat .env | xargs) +fi + +# Source Grafana version from the other directory +if [ -f ../grafana/.env ]; then + export $(cat ../grafana/.env | xargs) +elif [ -f ../grafana-client-gen/.env ]; then + export $(cat ../grafana-client-gen/.env | xargs) +fi + +if [ -z "$GRAFANA_VERSION" ]; then + echo "Error: GRAFANA_VERSION not found in environment variables" + exit 1 +fi + +echo "Build path: $OPENAPI_GENERATOR_DIR" +echo "Language: $OPENAPI_LANGUAGE" +echo "Grafana Version: $GRAFANA_VERSION" + +# Remove v prefix if present in version +GRAFANA_VERSION_CLEAN=${GRAFANA_VERSION#v} + +echo "Removing existing build directory..." +rm -rf $OPENAPI_GENERATOR_DIR + +echo "Setting up new build directory..." +mkdir -p $OPENAPI_GENERATOR_DIR + +# First, get the tag reference +TAG_URL="https://api.github.com/repos/grafana/grafana/git/refs/tags/v$GRAFANA_VERSION_CLEAN" +echo "Fetching from tag URL: $TAG_URL" +TAG_DATA=$(curl -s "$TAG_URL") +echo "Tag API Response:" +echo "$TAG_DATA" + +# Get the SHA of the tag object +TAG_SHA=$(echo "$TAG_DATA" | grep -o '"sha": "[^"]*"' | head -1 | cut -d'"' -f4) +echo "Tag SHA: $TAG_SHA" + +# Now get the actual commit SHA that this tag points to +TAG_URL="https://api.github.com/repos/grafana/grafana/git/tags/$TAG_SHA" +echo "Fetching tag details from: $TAG_URL" +TAG_DETAILS=$(curl -s "$TAG_URL") +echo "Tag Details Response:" +echo "$TAG_DETAILS" + +# Extract the actual commit SHA +COMMIT_HASH=$(echo "$TAG_DETAILS" | grep -o '"sha": "[^"]*"' | tail -1 | cut -d'"' -f4) + +if [ -z "$COMMIT_HASH" ] || [ "$COMMIT_HASH" = "null" ]; then + echo "Failed to get proper commit hash for version $GRAFANA_VERSION_CLEAN" + exit 1 +fi + +echo "Found commit hash: $COMMIT_HASH" + +# Download the OpenAPI spec for the specific version +echo "Downloading OpenAPI spec for commit $COMMIT_HASH..." +SPEC_URL="https://raw.githubusercontent.com/grafana/grafana/$COMMIT_HASH/public/openapi3.json" +echo "Downloading from: $SPEC_URL" +curl -L -o $OPENAPI_GENERATOR_DIR/openapi3.json "$SPEC_URL" + +if [ -f $OPENAPI_GENERATOR_DIR/openapi3.json ]; then + echo "OPENAPI file downloaded successfully." +else + echo "Failed to download OPENAPI file." + exit 1 +fi + +# Get current user's UID and GID +USER_ID=$(id -u) +GROUP_ID=$(id -g) + +echo "Running Docker to generate code..." +docker run --rm \ + --user $USER_ID:$GROUP_ID \ + -v ${PWD}/${OPENAPI_GENERATOR_DIR}:/local \ + openapitools/openapi-generator-cli generate \ + -i /local/openapi3.json \ + -g $OPENAPI_LANGUAGE \ + -o /local/grafana-rust-client + +echo "Code generation complete." + +if [ -d "$OPENAPI_GENERATOR_DIR/grafana-rust-client/src" ]; then + echo "Removing unwanted files..." + rm -rf "$OPENAPI_GENERATOR_DIR/grafana-rust-client/.openapi-generator" + rm -rf "$OPENAPI_GENERATOR_DIR/grafana-rust-client/.openapi-generator-ignore" + rm -rf "$OPENAPI_GENERATOR_DIR/grafana-rust-client/.travis.yml" + rm -f "$OPENAPI_GENERATOR_DIR/grafana-rust-client/.gitignore" + rm -f "$OPENAPI_GENERATOR_DIR/grafana-rust-client/git_push.sh" + + echo "Copying generated package to the target directory..." + rm -rf "$TARGET_DIR" + cp -r "$OPENAPI_GENERATOR_DIR/grafana-rust-client" "$TARGET_DIR" + echo "Files copied successfully to $TARGET_DIR." + + echo "Setting permissions for $TARGET_DIR..." + chmod -R 777 "$TARGET_DIR" + echo "Permissions set for all files and directories in $TARGET_DIR." +else + echo "Code generation did not complete successfully; src directory not found." + exit 1 +fi \ No newline at end of file diff --git a/grafana/.env b/grafana/.env new file mode 100644 index 00000000..cccffa07 --- /dev/null +++ b/grafana/.env @@ -0,0 +1,3 @@ +# We can't just put the version inside main .env file as docker developers denied this feature due to skill issues +# https://github.com/docker/compose/issues/11122 +GRAFANA_VERSION=11.0.0 \ No newline at end of file diff --git a/grafana/TEMPLATE_DASHBOARD.json b/grafana/TEMPLATE_DASHBOARD.json new file mode 100644 index 00000000..aff79897 --- /dev/null +++ b/grafana/TEMPLATE_DASHBOARD.json @@ -0,0 +1,2940 @@ +{ + "__inputs": [ + { + "name": "DS_GRAFANA-POSTGRESQL-DATASOURCE", + "label": "grafana-postgresql-datasource", + "description": "", + "type": "datasource", + "pluginId": "grafana-postgresql-datasource", + "pluginName": "PostgreSQL" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "barchart", + "name": "Bar chart", + "version": "" + }, + { + "type": "panel", + "id": "geomap", + "name": "Geomap", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "11.0.0" + }, + { + "type": "datasource", + "id": "grafana-postgresql-datasource", + "name": "PostgreSQL", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "piechart", + "name": "Pie chart", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 19, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 27, + "options": { + "basemap": { + "config": {}, + "name": "Layer 0", + "type": "default" + }, + "controls": { + "mouseWheelZoom": true, + "showAttribution": false, + "showDebug": false, + "showMeasure": false, + "showScale": true, + "showZoom": true + }, + "layers": [ + { + "config": { + "showLegend": true, + "style": { + "color": { + "fixed": "dark-green" + }, + "opacity": 0.5, + "rotation": { + "field": "count", + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "field": "count", + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "symbolAlign": { + "horizontal": "center", + "vertical": "center" + }, + "text": { + "fixed": "", + "mode": "fixed" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + "filterData": { + "id": "byRefId", + "options": "A" + }, + "location": { + "latitude": "latitude", + "longitude": "longitude", + "mode": "coords" + }, + "name": "Layer 1", + "tooltip": false, + "type": "markers" + } + ], + "tooltip": { + "mode": "details" + }, + "view": { + "allLayers": true, + "id": "europe", + "lat": 46, + "lon": 14, + "zoom": 4 + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n (geo_location).lat AS latitude,\n (geo_location).lon AS longitude,\n COUNT(*) AS count\nFROM\n connection_events\nWHERE\n (geo_location).lat IS NOT NULL AND\n (geo_location).lon IS NOT NULL\nGROUP BY\n (geo_location).lat, (geo_location).lon\nORDER BY\n count DESC;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Panel Title", + "transformations": [ + { + "id": "calculateField", + "options": { + "binary": { + "left": "latitude" + }, + "mode": "binary", + "reduce": { + "include": [ + "longitude", + "latitude" + ], + "reducer": "uniqueValues" + }, + "replaceFields": false + } + } + ], + "type": "geomap" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "connections" + }, + "properties": [ + { + "id": "displayName", + "value": "connections" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT app_id, daily_bucket as time, daily_app_connection_count as connections, 'daily' AS metric\nFROM daily_connection_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT app_id, hourly_bucket as time, hourly_app_connection_count as connections, 'hourly' AS metric\nFROM hourly_connection_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hourly_bucket)\nUNION ALL\n-- Use raw data (minute intervals) intervals between 0 and 3 days\nSELECT app_id, quarter_bucket as time, quarter_app_connection_count as connections, '15min' AS metric\nFROM quarter_connection_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "App connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "connections" + }, + "properties": [ + { + "id": "displayName", + "value": "connections" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT app_id, daily_bucket as time, daily_clients_connection_count as connections, 'daily' AS metric\nFROM daily_connection_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT app_id, hourly_bucket as time, hourly_clients_connection_count as connections, 'hourly' AS metric\nFROM hourly_connection_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hourly_bucket)\nUNION ALL\n-- Use raw data (minute intervals) intervals between 0 and 3 days\nSELECT app_id, quarter_bucket as time, quarter_clients_connection_count as connections, '15min' AS metric\nFROM quarter_connection_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Client connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "active_users" + }, + "properties": [ + { + "id": "displayName", + "value": "active users" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT ra.app_name, ds.daily_bucket as time, ds.daily_active_users as active_users, 'daily' AS metric\nFROM daily_sessions_stats_per_app ds\nJOIN registered_apps ra ON ds.app_id = ra.app_id\nWHERE ds.app_id = '${__dashboard.uid}'\nAND $__timeFilter(ds.daily_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Daily Active Users", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "sessions_opened" + }, + "properties": [ + { + "id": "displayName", + "value": "opened" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT ra.app_name, ds.daily_bucket as time, ds.daily_sessions_opened as sessions_opened, 'daily' AS metric\nFROM daily_sessions_stats_per_app ds\nJOIN registered_apps ra ON ds.app_id = ra.app_id\nWHERE ds.app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(ds.daily_bucket)\n\nUNION ALL\n\n-- Hourly aggregate for intervals between 3 and 14 days\nSELECT ra.app_name, hs.hourly_bucket as time, hs.hourly_sessions_opened as sessions_opened, 'hourly' AS metric\nFROM hourly_sessions_stats_per_app hs\nJOIN registered_apps ra ON hs.app_id = ra.app_id\nWHERE hs.app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hs.hourly_bucket)\n\nUNION ALL\n\n-- Use raw data (minute intervals) for intervals between 0 and 3 days\nSELECT ra.app_id, qs.quarter_bucket as time, qs.quarter_app_connection_count as connections, '15min' AS metric\nFROM quarter_connection_stats_per_app qs\nJOIN registered_apps ra ON qs.app_id = ra.app_id\nWHERE qs.app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(qs.quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Sessions Opened", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 6, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "failed_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "failed requests" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "success_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "successfull requests" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 35 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 300 + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT app_id, daily_bucket as time, daily_successful_requests as success_requests, daily_unsuccessful_requests as failed_requests, 'daily' AS metric\nFROM daily_events_sign_message_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT app_id, hour_bucket as time, hour_successful_requests as success_requests, hour_unsuccessful_requests as failed_requests, 'hourly' AS metric\nFROM hour_events_sign_message_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT app_id, quarter_bucket as time, quarter_successful_requests as quarter_requests, quarter_unsuccessful_requests as failed_requests, '15min' AS metric\nFROM quarter_events_sign_message_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Sign Message", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 6, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "failed_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "failed requests" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "success_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "successfull requests" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 35 + }, + "id": 16, + "options": { + "legend": { + "calcs": [ + "diffperc", + "delta" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT app_id, daily_bucket as time, daily_successful_requests as success_requests, daily_unsuccessful_requests as failed_requests, 'daily' AS metric\nFROM daily_events_sign_and_send_transaction_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT app_id, hour_bucket as time, hour_successful_requests as success_requests, hour_unsuccessful_requests as failed_requests, 'hourly' AS metric\nFROM hour_events_sign_and_send_transaction_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT app_id, quarter_bucket as time, quarter_successful_requests as quarter_requests, quarter_unsuccessful_requests as failed_requests, '15min' AS metric\nFROM quarter_events_sign_and_send_transaction_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Sign And Send Transaction", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "failed_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "failed requests" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "success_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "successfull requests" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 43 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT app_id, daily_bucket as time, daily_successful_requests as success_requests, daily_unsuccessful_requests as failed_requests, 'daily' AS metric\nFROM daily_events_sign_transaction_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT app_id, hour_bucket as time, hour_successful_requests as success_requests, hour_unsuccessful_requests as failed_requests, 'hourly' AS metric\nFROM hour_events_sign_transaction_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT app_id, quarter_bucket as time, quarter_successful_requests as quarter_requests, quarter_unsuccessful_requests as failed_requests, '15min' AS metric\nFROM quarter_events_sign_transaction_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Sign Transaction", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "failed_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "failed requests" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "success_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "successfull requests" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 43 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT app_id, daily_bucket as time, daily_successful_requests as success_requests, daily_unsuccessful_requests as failed_requests, 'daily' AS metric\nFROM daily_events_change_network_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT app_id, hour_bucket as time, hour_successful_requests as success_requests, hour_unsuccessful_requests as failed_requests, 'hourly' AS metric\nFROM hour_events_change_network_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT app_id, quarter_bucket as time, quarter_successful_requests as quarter_requests, quarter_unsuccessful_requests as failed_requests, '15min' AS metric\nFROM quarter_events_change_network_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Change Network", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "failed_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "failed requests" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "success_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "successfull requests" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 51 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT \n app_id, \n wallet_name,\n time, \n SUM(success_requests) AS success_requests, \n SUM(failed_requests) AS failed_requests, \n metric\nFROM (\n SELECT \n app_id, \n wallet_name, \n daily_bucket AS time, \n daily_successful_requests AS success_requests, \n daily_unsuccessful_requests AS failed_requests, \n 'daily' AS metric\n FROM \n daily_events_change_wallet_stats_per_app\n WHERE \n app_id = '${__dashboard.uid}' AND \n $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND \n $__timeFilter(daily_bucket)\n \n UNION ALL\n\n SELECT \n app_id, \n wallet_name, \n hour_bucket AS time, \n hour_successful_requests AS success_requests, \n hour_unsuccessful_requests AS failed_requests, \n 'hourly' AS metric\n FROM \n hour_events_change_wallet_stats_per_app\n WHERE \n app_id = '${__dashboard.uid}' AND \n $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND \n $__timeFilter(hour_bucket)\n \n UNION ALL\n\n SELECT \n app_id, \n wallet_name, \n quarter_bucket AS time, \n quarter_successful_requests AS success_requests, \n quarter_unsuccessful_requests AS failed_requests, \n '15min' AS metric\n FROM \n quarter_events_change_wallet_stats_per_app\n WHERE \n app_id = '${__dashboard.uid}' AND \n $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND \n $__timeFilter(quarter_bucket)\n) aggregated\nGROUP BY \n app_id, \n wallet_name,\n time, \n metric\nORDER BY \n time;\n", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Change Wallet Account", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisGridShow": true, + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "success_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "${__field.labels.request_type}" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + { + "id": "custom.drawStyle", + "value": "line" + }, + { + "id": "custom.stacking", + "value": { + "group": "B", + "mode": "none" + } + }, + { + "id": "custom.showPoints", + "value": "always" + }, + { + "id": "custom.lineInterpolation", + "value": "smooth" + }, + { + "id": "custom.fillBelowTo", + "value": "Total" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 59 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n 'sign_message' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_sign_message_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'sign_message' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_sign_message_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'sign_message' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_sign_message_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL -------------------------------------------------------------------\nSELECT\n 'sign_transaction' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_sign_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'sign_transaction' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_sign_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'sign_transaction' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_sign_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL ------------------------------------------------------------------\nSELECT\n 'sign_and_send_transaction' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_sign_and_send_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'sign_and_send_transaction' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_sign_and_send_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'sign_and_send_transaction' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_sign_and_send_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL ---------------------------------------------------------------------\nSELECT\n 'change_network' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_change_network_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'change_network' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_change_network_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'change_network' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_change_network_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL ---------------------------------------------------------------------\nSELECT\n 'change_wallet' as request_type,\n app_id,\n time,\n SUM(success_requests) AS success_requests,\n SUM(failed_requests) AS failed_requests,\n metric\nFROM\n (\n SELECT\n app_id,\n wallet_name,\n daily_bucket AS time,\n daily_successful_requests AS success_requests,\n daily_unsuccessful_requests AS failed_requests,\n 'daily' AS metric\n FROM\n daily_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\n UNION\n ALL\n SELECT\n app_id,\n wallet_name,\n hour_bucket AS time,\n hour_successful_requests AS success_requests,\n hour_unsuccessful_requests AS failed_requests,\n 'hourly' AS metric\n FROM\n hour_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\n UNION\n ALL\n SELECT\n app_id,\n wallet_name,\n quarter_bucket AS time,\n quarter_successful_requests AS success_requests,\n quarter_unsuccessful_requests AS failed_requests,\n '15min' AS metric\n FROM\n quarter_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\n ) aggregated\nGROUP BY\n app_id,\n wallet_name,\n time,\n metric\nORDER BY\n time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Successful requests summarization", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "byVariable": false, + "include": { + "names": [ + "success_requests {app_id=\"018fe846-3b7d-7af8-a14f-96d97820bccf\", metric=\"daily\", request_type=\"change_network\"}", + "success_requests {app_id=\"018fe846-3b7d-7af8-a14f-96d97820bccf\", metric=\"daily\", request_type=\"change_wallet\"}", + "success_requests {app_id=\"018fe846-3b7d-7af8-a14f-96d97820bccf\", metric=\"daily\", request_type=\"sign_and_send_transaction\"}", + "success_requests {app_id=\"018fe846-3b7d-7af8-a14f-96d97820bccf\", metric=\"daily\", request_type=\"sign_message\"}", + "success_requests {app_id=\"018fe846-3b7d-7af8-a14f-96d97820bccf\", metric=\"daily\", request_type=\"sign_transaction\"}", + "Time" + ], + "pattern": "^success_requests\\s*\\{[^}]*\\}" + } + } + }, + { + "id": "calculateField", + "options": {} + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisGridShow": true, + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "failed_requests" + }, + "properties": [ + { + "id": "displayName", + "value": "${__field.labels.request_type}" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "custom.drawStyle", + "value": "line" + }, + { + "id": "custom.stacking", + "value": { + "group": "B", + "mode": "none" + } + }, + { + "id": "custom.showPoints", + "value": "always" + }, + { + "id": "custom.lineInterpolation", + "value": "smooth" + }, + { + "id": "custom.fillBelowTo", + "value": "Total" + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 69 + }, + "id": 31, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n 'sign_message' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_sign_message_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'sign_message' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_sign_message_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'sign_message' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_sign_message_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL -------------------------------------------------------------------\nSELECT\n 'sign_transaction' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_sign_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'sign_transaction' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_sign_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'sign_transaction' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_sign_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL ------------------------------------------------------------------\nSELECT\n 'sign_and_send_transaction' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_sign_and_send_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'sign_and_send_transaction' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_sign_and_send_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'sign_and_send_transaction' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_sign_and_send_transaction_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL ---------------------------------------------------------------------\nSELECT\n 'change_network' as request_type,\n app_id,\n daily_bucket as time,\n daily_successful_requests as success_requests,\n daily_unsuccessful_requests as failed_requests,\n 'daily' AS metric\nFROM\n daily_events_change_network_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\nUNION\nALL -- Use hourly aggregate for intervals between 3 and 14 days\nSELECT\n 'change_network' as request_type,\n app_id,\n hour_bucket as time,\n hour_successful_requests as success_requests,\n hour_unsuccessful_requests as failed_requests,\n 'hourly' AS metric\nFROM\n hour_events_change_network_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\nUNION\nALL -- Use 15 minutes interval 0 and 3 days\nSELECT\n 'change_network' as request_type,\n app_id,\n quarter_bucket as time,\n quarter_successful_requests as quarter_requests,\n quarter_unsuccessful_requests as failed_requests,\n '15min' AS metric\nFROM\n quarter_events_change_network_stats_per_app\nWHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\nUNION\nALL ---------------------------------------------------------------------\nSELECT\n 'change_wallet' as request_type,\n app_id,\n time,\n SUM(success_requests) AS success_requests,\n SUM(failed_requests) AS failed_requests,\n metric\nFROM\n (\n SELECT\n app_id,\n wallet_name,\n daily_bucket AS time,\n daily_successful_requests AS success_requests,\n daily_unsuccessful_requests AS failed_requests,\n 'daily' AS metric\n FROM\n daily_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp > '14 days' :: interval\n AND $__timeFilter(daily_bucket)\n UNION\n ALL\n SELECT\n app_id,\n wallet_name,\n hour_bucket AS time,\n hour_successful_requests AS success_requests,\n hour_unsuccessful_requests AS failed_requests,\n 'hourly' AS metric\n FROM\n hour_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp BETWEEN '3 days' :: interval\n AND '14 days' :: interval\n AND $__timeFilter(hour_bucket)\n UNION\n ALL\n SELECT\n app_id,\n wallet_name,\n quarter_bucket AS time,\n quarter_successful_requests AS success_requests,\n quarter_unsuccessful_requests AS failed_requests,\n '15min' AS metric\n FROM\n quarter_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo() :: timestamp - $__timeFrom() :: timestamp < '3 days' :: interval\n AND $__timeFilter(quarter_bucket)\n ) aggregated\nGROUP BY\n app_id,\n wallet_name,\n time,\n metric\nORDER BY\n time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Failed requests summarization", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "byVariable": false, + "include": { + "names": [ + "failed_requests {app_id=\"TEMPLATE_UID\", metric=\"daily\", request_type=\"change_network\"}", + "failed_requests {app_id=\"TEMPLATE_UID\", metric=\"daily\", request_type=\"change_wallet\"}", + "failed_requests {app_id=\"TEMPLATE_UID\", metric=\"daily\", request_type=\"sign_and_send_transaction\"}", + "failed_requests {app_id=\"TEMPLATE_UID\", metric=\"daily\", request_type=\"sign_message\"}", + "failed_requests {app_id=\"TEMPLATE_UID\", metric=\"daily\", request_type=\"sign_transaction\"}", + "Time" + ], + "pattern": "^failed_requests\\s*\\{[^}]*\\}" + } + } + }, + { + "id": "calculateField", + "options": { + "mode": "reduceRow", + "reduce": { + "include": [], + "reducer": "sum" + }, + "replaceFields": false + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 80 + }, + "id": 32, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "orientation": "auto", + "showValue": "always", + "stacking": "none", + "tooltip": { + "maxHeight": 600, + "mode": "multi", + "sort": "desc" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n time,\n SUM(success_requests) AS success_requests,\n SUM(failed_requests) AS failed_requests,\n metric\nFROM (\n SELECT\n 'sign_message' AS request_type,\n app_id,\n daily_bucket AS time,\n daily_successful_requests AS success_requests,\n daily_unsuccessful_requests AS failed_requests,\n 'daily' AS metric\n FROM\n daily_events_sign_message_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval\n AND $__timeFilter(daily_bucket)\n UNION ALL\n SELECT\n 'sign_message' AS request_type,\n app_id,\n hour_bucket AS time,\n hour_successful_requests AS success_requests,\n hour_unsuccessful_requests AS failed_requests,\n 'hourly' AS metric\n FROM\n hour_events_sign_message_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval\n AND $__timeFilter(hour_bucket)\n UNION ALL\n SELECT\n 'sign_message' AS request_type,\n app_id,\n quarter_bucket AS time,\n quarter_successful_requests AS success_requests,\n quarter_unsuccessful_requests AS failed_requests,\n '15min' AS metric\n FROM\n quarter_events_sign_message_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval\n AND $__timeFilter(quarter_bucket)\n UNION ALL\n SELECT\n 'sign_transaction' AS request_type,\n app_id,\n daily_bucket AS time,\n daily_successful_requests AS success_requests,\n daily_unsuccessful_requests AS failed_requests,\n 'daily' AS metric\n FROM\n daily_events_sign_transaction_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval\n AND $__timeFilter(daily_bucket)\n UNION ALL\n SELECT\n 'sign_transaction' AS request_type,\n app_id,\n hour_bucket AS time,\n hour_successful_requests AS success_requests,\n hour_unsuccessful_requests AS failed_requests,\n 'hourly' AS metric\n FROM\n hour_events_sign_transaction_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval\n AND $__timeFilter(hour_bucket)\n UNION ALL\n SELECT\n 'sign_transaction' AS request_type,\n app_id,\n quarter_bucket AS time,\n quarter_successful_requests AS success_requests,\n quarter_unsuccessful_requests AS failed_requests,\n '15min' AS metric\n FROM\n quarter_events_sign_transaction_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval\n AND $__timeFilter(quarter_bucket)\n UNION ALL\n SELECT\n 'sign_and_send_transaction' AS request_type,\n app_id,\n daily_bucket AS time,\n daily_successful_requests AS success_requests,\n daily_unsuccessful_requests AS failed_requests,\n 'daily' AS metric\n FROM\n daily_events_sign_and_send_transaction_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval\n AND $__timeFilter(daily_bucket)\n UNION ALL\n SELECT\n 'sign_and_send_transaction' AS request_type,\n app_id,\n hour_bucket AS time,\n hour_successful_requests AS success_requests,\n hour_unsuccessful_requests AS failed_requests,\n 'hourly' AS metric\n FROM\n hour_events_sign_and_send_transaction_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval\n AND $__timeFilter(hour_bucket)\n UNION ALL\n SELECT\n 'sign_and_send_transaction' AS request_type,\n app_id,\n quarter_bucket AS time,\n quarter_successful_requests AS success_requests,\n quarter_unsuccessful_requests AS failed_requests,\n '15min' AS metric\n FROM\n quarter_events_sign_and_send_transaction_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval\n AND $__timeFilter(quarter_bucket)\n UNION ALL\n SELECT\n 'change_network' AS request_type,\n app_id,\n daily_bucket AS time,\n daily_successful_requests AS success_requests,\n daily_unsuccessful_requests AS failed_requests,\n 'daily' AS metric\n FROM\n daily_events_change_network_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval\n AND $__timeFilter(daily_bucket)\n UNION ALL\n SELECT\n 'change_network' AS request_type,\n app_id,\n hour_bucket AS time,\n hour_successful_requests AS success_requests,\n hour_unsuccessful_requests AS failed_requests,\n 'hourly' AS metric\n FROM\n hour_events_change_network_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval\n AND $__timeFilter(hour_bucket)\n UNION ALL\n SELECT\n 'change_network' AS request_type,\n app_id,\n quarter_bucket AS time,\n quarter_successful_requests AS success_requests,\n quarter_unsuccessful_requests AS failed_requests,\n '15min' AS metric\n FROM\n quarter_events_change_network_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval\n AND $__timeFilter(quarter_bucket)\n UNION ALL\n SELECT\n 'change_wallet' AS request_type,\n app_id,\n time,\n SUM(success_requests) AS success_requests,\n SUM(failed_requests) AS failed_requests,\n metric\n FROM (\n SELECT\n app_id,\n wallet_name,\n daily_bucket AS time,\n daily_successful_requests AS success_requests,\n daily_unsuccessful_requests AS failed_requests,\n 'daily' AS metric\n FROM\n daily_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval\n AND $__timeFilter(daily_bucket)\n UNION ALL\n SELECT\n app_id,\n wallet_name,\n hour_bucket AS time,\n hour_successful_requests AS success_requests,\n hour_unsuccessful_requests AS failed_requests,\n 'hourly' AS metric\n FROM\n hour_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval\n AND $__timeFilter(hour_bucket)\n UNION ALL\n SELECT\n app_id,\n wallet_name,\n quarter_bucket AS time,\n quarter_successful_requests AS success_requests,\n quarter_unsuccessful_requests AS failed_requests,\n '15min' AS metric\n FROM\n quarter_events_change_wallet_stats_per_app\n WHERE\n app_id = '${__dashboard.uid}'\n AND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval\n AND $__timeFilter(quarter_bucket)\n ) aggregated\n GROUP BY\n app_id,\n wallet_name,\n time,\n metric\n) combined\nGROUP BY\n time,\n metric\nORDER BY\n time;\n", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Requests sumarization", + "transformations": [ + { + "id": "calculateField", + "options": {} + }, + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "time", + "success_requests", + "failed_requests", + "Total" + ] + } + } + } + ], + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "mobile_sessions" + }, + "properties": [ + { + "id": "displayName", + "value": "Mobile" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "unknown_sessions" + }, + "properties": [ + { + "id": "displayName", + "value": "Unknown" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "web_sessions" + }, + "properties": [ + { + "id": "displayName", + "value": "Web" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 91 + }, + "id": 25, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT daily_bucket as time, daily_mobile_sessions as mobile_sessions, daily_web_sessions as web_sessions, daily_unknown_sessions as unknown_sessions, 'daily' AS metric\nFROM daily_events_app_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT hour_bucket as time, hour_mobile_sessions as mobile_sessions, hour_web_sessions as web_sessions, hour_unknown_sessions as unknown_sessions, 'hourly' AS metric\nFROM hour_events_app_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT quarter_bucket as time, quarter_mobile_sessions as mobile_sessions, quarter_web_sessions as web_sessions, quarter_unknown_sessions as unknown_sessions, '15min' AS metric\nFROM quarter_events_app_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Sessions | Connection Type", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "fieldMinMax": false, + "mappings": [], + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "system_type_count" + }, + "properties": [ + { + "id": "displayName", + "value": "${__field.labels.system_type}" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 91 + }, + "id": 24, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Percent", + "sortDesc": true, + "values": [ + "percent", + "value" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT system_type, daily_bucket as time, daily_system as system_type_count, 'daily' AS metric\nFROM daily_events_app_connect_system_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\n UNION ALL\nSELECT system_type, hour_bucket as time, hour_system as system_type_count, 'hourly' AS metric\nFROM hour_events_app_connect_system_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\n UNION ALL\nSELECT system_type, quarter_bucket as time, quarter_system as system_type_count, '15min' AS metric\nFROM quarter_events_app_connect_system_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time\n", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Mobile Sessions | System type", + "type": "piechart" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "fieldMinMax": false, + "mappings": [], + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "browser_count" + }, + "properties": [ + { + "id": "displayName", + "value": "${__field.labels.browser}" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 91 + }, + "id": 22, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "percent", + "value" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT browser, daily_bucket as time, daily_browser as browser_count, 'daily' AS metric\nFROM daily_events_app_connect_browser_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\n UNION ALL\nSELECT browser, hour_bucket as time, hour_browser as browser_count, 'hourly' AS metric\nFROM hour_events_app_connect_browser_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\n UNION ALL\nSELECT browser, quarter_bucket as time, quarter_browser as browser_count, '15min' AS metric\nFROM quarter_events_app_connect_browser_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time\n", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Web Sessions | Browser", + "type": "piechart" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 99 + }, + "id": 19, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT wallet_name, daily_bucket as time, daily_successful_requests as success_requests, daily_unsuccessful_requests as failed_requests, 'daily' AS metric\nFROM daily_events_client_connect_wallet_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT wallet_name, hour_bucket as time, hour_successful_requests as success_requests, hour_unsuccessful_requests as failed_requests, 'hourly' AS metric\nFROM hour_events_client_connect_wallet_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT wallet_name, quarter_bucket as time, quarter_successful_requests as quarter_requests, quarter_unsuccessful_requests as failed_requests, '15min' AS metric\nFROM quarter_events_client_connect_wallet_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Client Connections | Wallets", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "fieldMinMax": false, + "mappings": [], + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "mobile" + }, + "properties": [ + { + "id": "displayName", + "value": "Mobile" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "unknown" + }, + "properties": [ + { + "id": "displayName", + "value": "Unknown" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "web daily" + }, + "properties": [ + { + "id": "displayName", + "value": "Web" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 99 + }, + "id": 21, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "percent", + "value" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "hide": false, + "rawQuery": true, + "rawSql": "SELECT daily_bucket as time, daily_mobile_sessions as mobile, daily_web_sessions as web, daily_unknown_sessions as unknown, 'daily' AS metric\nFROM daily_events_app_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT hour_bucket as time, hour_mobile_sessions as mobile, hour_web_sessions as web, hour_unknown_sessions as unknown, 'hourly' AS metric\nFROM hour_events_app_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT quarter_bucket as time, quarter_mobile_sessions as mobile, quarter_web_sessions as web, quarter_unknown_sessions as unknown, '15min' AS metric\nFROM quarter_events_app_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Sessions | Connection Type Total", + "type": "piechart" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "fieldMinMax": false, + "mappings": [], + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "os_count" + }, + "properties": [ + { + "id": "displayName", + "value": "${__field.labels.os}" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Linux" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 99 + }, + "id": 23, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "percent", + "value" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT os, daily_bucket as time, daily_os as os_count, 'daily' AS metric\nFROM daily_events_app_connect_os_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\n UNION ALL\nSELECT os, hour_bucket as time, hour_os as os_count, 'hourly' AS metric\nFROM hour_events_app_connect_os_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\n UNION ALL\nSELECT os, quarter_bucket as time, quarter_os as os_count, '15min' AS metric\nFROM quarter_events_app_connect_os_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time\n", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Web Sessions | Os type", + "type": "piechart" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "fieldMinMax": false, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "failed_requests {metric=\"daily\", session_type=\"Extension\"}" + }, + "properties": [ + { + "id": "displayName", + "value": "Failed" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 107 + }, + "id": 20, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT session_type, daily_bucket as time, daily_successful_requests as success_requests, daily_unsuccessful_requests as failed_requests, 'daily' AS metric\nFROM daily_events_client_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\nUNION ALL\n-- Use hourly aggregate for intervals between 3 and 14 days\nSELECT session_type, hour_bucket as time, hour_successful_requests as success_requests, hour_unsuccessful_requests as failed_requests, 'hourly' AS metric\nFROM hour_events_client_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\nUNION ALL\n-- Use 15 minutes interval 0 and 3 days\nSELECT session_type, quarter_bucket as time, quarter_successful_requests as quarter_requests, quarter_unsuccessful_requests as failed_requests, '15min' AS metric\nFROM quarter_events_client_connect_session_type_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Client Connections | Session Type", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "fieldMinMax": false, + "mappings": [], + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "lang_count" + }, + "properties": [ + { + "id": "displayName", + "value": "${__field.labels.lang}" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 107 + }, + "id": 26, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "percent", + "value" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "${DS_GRAFANA-POSTGRESQL-DATASOURCE}" + }, + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT lang, daily_bucket as time, daily_language as lang_count, 'daily' AS metric\nFROM daily_events_app_connect_language_stats_per_app\nWHERE app_id = '${__dashboard.uid}'\nAND $__timeTo()::timestamp - $__timeFrom()::timestamp > '14 days'::interval AND $__timeFilter(daily_bucket)\n UNION ALL\nSELECT lang, hour_bucket as time, hour_language as lang_count, 'hourly' AS metric\nFROM hour_events_app_connect_language_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp BETWEEN '3 days'::interval AND '14 days'::interval AND $__timeFilter(hour_bucket)\n UNION ALL\nSELECT lang, quarter_bucket as time, quarter_language as lang_count, '15min' AS metric\nFROM quarter_events_app_connect_language_stats_per_app\nWHERE app_id = '${__dashboard.uid}' \nAND $__timeTo()::timestamp - $__timeFrom()::timestamp < '3 days'::interval AND $__timeFilter(quarter_bucket)\nORDER BY time\n", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Language", + "type": "piechart" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30d", + "to": "now" + }, + "timeRangeUpdatedDuringEditOrView": false, + "timepicker": {}, + "timezone": "utc", + "title": "Test_App", + "uid": "TEMPLATE_UID", + "version": 24, + "weekStart": "monday" +} \ No newline at end of file diff --git a/grafana/docker-compose.yml b/grafana/docker-compose.yml index 2d8caf65..5e9e1449 100644 --- a/grafana/docker-compose.yml +++ b/grafana/docker-compose.yml @@ -1,19 +1,11 @@ -version: '3.1' - services: grafana: - image: grafana/grafana:latest - # container_name: grafana - # environment: - # - GF_SECURITY_ADMIN_PASSWORD=secret # Change 'secret' to a strong password - # - GF_USERS_ALLOW_SIGN_UP=false + image: grafana/grafana:${GRAFANA_VERSION} + user: "${GRAFANA_USER_ID:-1000:1000}" volumes: - ./grafana-data:/var/lib/grafana # Persists Grafana data - ./grafana.ini:/etc/grafana/grafana.ini # Optional: Custom Grafana configuration - - ../jwt_keys/grafana.key.pub:/etc/grafana/public-key.pem # Optional: Custom Grafana configuration + - ../jwt_keys/grafana.key.pub:/etc/grafana/public-key.pem # Optional: Public key for JWT ports: - - '3000:3000' + - '3005:3000' restart: unless-stopped - -volumes: - grafana-data: diff --git a/grafana/grafana.ini b/grafana/grafana.ini index da7a7388..8680bcba 100644 --- a/grafana/grafana.ini +++ b/grafana/grafana.ini @@ -1,3 +1,4 @@ +; Auth via jwt token is not working perfectly by design https://github.com/grafana/grafana/pull/78602 [auth.jwt] enabled = true header_name = X-JWT-Assertion @@ -5,4 +6,13 @@ email_claim = sub username_claim = sub auto_sign_up = true key_file = /etc/grafana/public-key.pem -url_login = true \ No newline at end of file +url_login = true + +[feature_toggles] +enable = dashboardScene + +[security] +; TEST USERNAME DO NOT USE IN PRODUCTION +admin_user = admin +; TEST PASSWORD DO NOT USE IN PRODUCTION +admin_password = admin \ No newline at end of file diff --git a/grafana/readme.md b/grafana/readme.md index e7dbd44d..cd075ed1 100644 --- a/grafana/readme.md +++ b/grafana/readme.md @@ -1,6 +1,118 @@ -// Setup +# Local deployment -1. Use openresty -2. Use grafana without auth -3. Generate JWT on backed -4. Validate JWT in openresty/nginx +Make sure you have installed required tools as specified in the [Requirements](../readme.md#requirements) section. + +## Starting the service + +Before starting the docker container create a folder which is going to store the grafana state data. + +1. Navigate to the `grafana` directory: + + + ```bash + cd ~/connect/grafana + ``` + +2. Create a folder for the data: + + ```bash + mkdir -p grafana-data + ``` + +3. Change folder permissions: + + ```bash + chmod -R 777 ./grafana-data + ``` + +Then you can start the service by running: + +```bash +docker compose up +``` + +Check if you can access the Grafana service by navigating to [http://localhost:3005](http://localhost:3005) in your browser. + +> [!IMPORTANT] +> Mind you that default admin credentials are `admin:admin`, make sure to change to a more secure password. + +## Basic grafana configuration + +Once you have the service running you can configure the Grafana instance. +We will start the process by adding a data source. + +1. Navigate to [http://localhost:3005/connections/datasources](http://localhost:3005/connections/datasources) in your browser. + +2. Click on the `Add data source` button. + +3. Choose the `PostgreSQL` data source. + +4. Configure the data source with default values: + + - Connection + - Host URL - in our current setup host url is the docker bridge network address, instead of container address. Yuo can use `ifconfig`, find entry `docker0` and use the `inet` address. You may also use command: + + ```bash + docker network inspect bridge + ``` + + Copy the `Gateway` address and use it as the host url. + The final version of `Host URL` should include this address with port, for example: `172.17.0.1:5432`. + + - Database name: `connect_db` + - Authentication + - Username: `admin1234` + - Password: `password12345` + - TLS/SSL Mode: `disable` + - Additional settings + - Version: `15` + - TimescaleDB: `on` + +5. You may set this as default data source at the top. Click on the `Save & Test` button. + +6. Navigate to [http://localhost:3005/dashboards](http://localhost:3005/dashboards) to create a new folder. Name it for example `TEMPLATES`, for now the name of the folder does not matter. + + Inside the folder we will place the template dashboard which will get used for every new registered application. + +7. Now find the `Import` button at the top right corner of the page. + + Template dashboard can be found here: + + ```bash + ./connect/grafana/TEMPLATE_DASHBOARD.json + ``` + + Name the dashboard in the `Name` field, for example `TEMPLATE`, name of the dashboard does not really matter. What matters is the dashboard uid which is unique and will be used in the connect service. + + The `UID` field is hardcoded in `~/connect/server/src/statics.rs` under `DASHBOARD_TEMPLATE_UID` variable. Make sure that your dashboard uid is the same as the one in the file. + + As the last step choose the data source you have created in the previous steps. + +8. (Optional) Change permissions + + After importing dashboard enter `Settings` and navigate to the `Permissions` tab. Here you can set the permissions for the dashboard. You can set the permissions for the `Admin` role to `View` and `Edit` the dashboard. We propose to remove all permissions apart from the `Admin` role which can't be removed anyway. + +## Stopping the service + +To stop the service run: + +```bash +docker compose down +``` + +## Updating the existing dashboards + +For now if any dashboard update is needed, you need to manually update the every dashboard in every team folder. + +## Login with JWT token + +Grafana config `grafana.ini` was configured to use JWT token for login. You can test this functionality by navigating to `jwt_keys` folder and running the `Python` script with following command: + +```bash +/bin/python3 /home/giems/connect/jwt_keys/test.py +``` + +This command might not work on your machine, adjust it based on your setup. + +After executing the script you will get quite long link which you can copy-paste to your browser. + \ No newline at end of file diff --git a/images/nightly_connect/Nightly Connect Logo Circle.svg b/images/nightly_connect/Nightly Connect Logo Circle.svg new file mode 100644 index 00000000..f6c1dd65 --- /dev/null +++ b/images/nightly_connect/Nightly Connect Logo Circle.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + diff --git a/infra/.env b/infra/.env old mode 100644 new mode 100755 index c31c5dd9..c738af77 --- a/infra/.env +++ b/infra/.env @@ -1,5 +1,41 @@ -ENV=DEV # PROD or DEV -PGDATA=/home/postgres/pgdata/data +ENV=DEV # Does nothing for now +ONLY_DATABASE=false # If true, only the database will be started, if not will also start ofelia and another future services + +# Database Configuration +DATABASE_ADDRESS=127.0.0.1 +DATABASE_PORT=5432 +# Those two has to be the same POSTGRES_USER=admin1234 +PGUSER=admin1234 +# ----------------------- POSTGRES_PASSWORD=password12345 POSTGRES_DB=connect_db +PG_DATA=/home/postgres/pgdata + +# Grafana read only database user +GRAFANA_DB_USERNAME=grafanaaccess +GRAFANA_DB_PASSWORD=very-stronk-password + +# Images +# https://github.com/timescale/timescaledb-docker-ha +TIMESCALEDB_IMAGE=timescale/timescaledb-ha:pg15-ts2.10 +OFELIA_IMAGE=mcuadros/ofelia:988d988 + +# Volume Bindings +TIMESCALEDB_DATA=./target +TIMESCALEDB_BACKUPS=./backups +TIMESCALEDB_LOGS=./logs +TIMESCALEDB_PGBACKREST_CONFIG=./config +OFELIA_LOGS=./ofelia_logs +MANUAL_BACKUPS=./manual_backups +CUSTOM_ENTRYPOINT=./scripts/custom_entrypoint.sh + +# Ofelia Configuration +OFELIA_SMTP_HOST=smtp.example.com +OFELIA_SMTP_PORT=587 +# Those two has to be the same +OFELIA_SMTP_USER=example@email.com +OFELIA_EMAIL_FROM=example@email.com +# ----------------------- +OFELIA_SMTP_PASSWORD=examplepassword +OFELIA_EMAIL_TO=logsreceiver@email.com diff --git a/infra/docker-compose.yaml b/infra/docker-compose.yaml old mode 100644 new mode 100755 index e3fb4940..d86ecbff --- a/infra/docker-compose.yaml +++ b/infra/docker-compose.yaml @@ -1,16 +1,65 @@ -version: '3.9' - services: timescaledb: - image: timescale/timescaledb-ha:pg16 + image: ${TIMESCALEDB_IMAGE} ports: - - 5432:5432 + - ${DATABASE_PORT}:5432 volumes: - - ./target:/var/lib/postgresql/data + - ${TIMESCALEDB_DATA}:/home/postgres/pgdata + - ${TIMESCALEDB_BACKUPS}:/var/lib/pgbackrest + - ${TIMESCALEDB_PGBACKREST_CONFIG}:/home/postgres/pgdata/backup + - ${TIMESCALEDB_LOGS}:/var/log + - ${CUSTOM_ENTRYPOINT}:/usr/local/bin/custom_entrypoint.sh + entrypoint: ["/usr/local/bin/custom_entrypoint.sh"] + command: ["postgres"] + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 3 + restart: no env_file: - .env environment: - - POSTGRES_USER - - POSTGRES_PASSWORD - - POSTGRES_DB - - TIMESCALEDB_TELEMETRY=off + ENV: ${ENV} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + PG_DATA: ${PG_DATA} + PGUSER: ${PGUSER} + labels: + ofelia.enabled: "true" + # Schedule job to backup timescaledb, commands can be changed to instead run scripts in order to log more data + # Perform full backup every day at 00:00 + ofelia.job-exec.full-backup.user: "postgres" + ofelia.job-exec.full-backup.schedule: "0 0 * * *" + ofelia.job-exec.full-backup.command: "pgbackrest --stanza=db --type=full --log-level-stderr=info backup" + # Perform diff backup every 15 minutes (900 seconds) + ofelia.job-exec.diff-backup.schedule: "@every 900s" + ofelia.job-exec.diff-backup.user: "postgres" + ofelia.job-exec.diff-backup.command: "pgbackrest --stanza=db --type=diff --log-level-stderr=info backup" + + + # Service for running shedule job to backup timescaledb + # https://github.com/mcuadros/ofelia + ofelia: + image: ${OFELIA_IMAGE} + depends_on: + timescaledb: + condition: service_healthy + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ${OFELIA_LOGS}:/tmp/logs:rw + command: daemon --docker + profiles: [full] + env_file: + - .env + labels: + # Save logs locally and via email reports + ofelia.save-folder: "./tmp/logs" + ofelia.smtp-host: "${OFELIA_SMTP_HOST}" + ofelia.smtp-port: "${OFELIA_SMTP_PORT}" + ofelia.smtp-user: "${OFELIA_SMTP_USER}" + ofelia.smtp-password: "${OFELIA_SMTP_PASSWORD}" + ofelia.email-to: "${OFELIA_EMAIL_TO}" + ofelia.email-from: "${OFELIA_EMAIL_FROM}" + \ No newline at end of file diff --git a/infra/readme.md b/infra/readme.md new file mode 100644 index 00000000..d47f8f5d --- /dev/null +++ b/infra/readme.md @@ -0,0 +1,250 @@ +# Overview + +In order to store our data, we have decided to use PostgreSQL, and specifically self-hosted local deployment of extension to database called [TimescaleDB](https://docs.timescale.com/self-hosted/latest/). This extension is designed to handle time-series data, which is the main type of data we are going to store. + +As this is Rust based project we had to utilize a crate to interact with the database. We have chosen Rust version of [sqlx](https://github.com/launchbadge/sqlx) which is a general purpose driver to interact with different types of databases. + +# Local deployment + +Make sure you have installed required tools as specified in the [Requirements](../readme.md#requirements) section. + +If this is your first start of the project, you might want to start docker using custom script ```./scripts/clean_start.sh```. What does this scripts do: + +- Create all folders which will be mounted to the docker container +- Setup backups using [pgBackRest](https://pgbackrest.org/) + +> [!NOTE] +> When starting the database docker we will be using custom entrypoint as original timescaledb container exits if something happens to the db, which will prevent us from accessing pgBackRest tools to lets say backup or restore db. + +1. Setup ```ENV``` variables in ```./connect/infra/.env``` file. + - ```ONLY_DATABASE``` - by default docker will start all services, if you want to skip them simply change this value to ```TRUE```. + - Most of the database settings are already set to local development, but you can change them if needed. We don't recommend changing the variable ```PG_DATA```. + - Be careful with ```TIMESCALEDB_IMAGE```, current version was proved to work with the rest of the services, but if you want to change it, make sure it is compatible with the rest of the services. + - Ofelia configuration is required to properly receive notifications with backup schedule status. Invalid configuration won't crush the system, backup will be still created, but you won't be able to receive notifications. If you want to change ```backup``` schedule, you can do it in ```docker-compose.yaml``` labels section. + +2. Navigate to the infra folder: + + ```bash + cd ~/connect/infra + ``` + +3. Run startup script + + ```bash + ./scripts/clean_start.sh + ``` + +> [!NOTE] +> It is needed to run ```clean_start.sh``` script only once, running it again shouldn't cause any issues, but it is not needed. + +4. Check if the containers are running: + + ```bash + docker ps + ``` + +5. To stop the containers: + + With only db running: + + ```bash + docker compose down + ``` + + With all services running: + + ```bash + docker compose --profile full down + ``` + +6. Next time you run the containers you can use: + + For only db: + + ```bash + docker compose up + ``` + + For all services: + + ```bash + docker compose --profile full up + ``` + +After the data in container is all setup, the next step is to run the migrations. You can do this by running the following command: + +```bash +cargo run --bin tables_migration +``` + +This command executes sql commands from ```./connect/database/migrations``` folder. You can check if the tables were created by connecting to the database using psql or any other tool of your choice. + +> [!IMPORTANT] +> You can add more migrations but you can't modify old ones once they are executed. If you want to modify the migration, you have to create a new one. + + +# Database backup and restoration + +> [!WARNING] +> Each of the provided methods differ in usage and purpose. While this short guide will provide you with basic information, it is recommended to read the official documentation of the tools used. Wrong usage of the tools may result in permanent data loss. + +## \#(Option 1 | Recommended) Scheduled Backups (Ofelia with pgBackRest) + +### Backup + +Running all services should start the ``Ofelia`` service which is responsible for creating scheduled backups. You can check if the service is running by executing: + +```bash +docker logs -f $(docker ps --filter "ancestor=mcuadros/ofelia:988d988" --format "{{.ID}}") +``` + +You should see some messages about the backup schedule. By our setup a backup is created every day at 00:00 UTC and a differential backup every 15 minutes. Differential backups are deleted after full backup on which they are based is created. You may substitute backup commands with whole scripts to gather more info about the backup process. + +You can also use commands to trigger backup by yourself, the same ones used by Ofelia: + +For ```differential backup```: +```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") pgbackrest --stanza=db --type=diff --log-level-stderr=info backup +``` + +and for ```full backup```: + +```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") pgbackrest --stanza=db --type=full --log-level-stderr=info backup +``` + +### Restore + +In order to restore the database using pgBackRest, you need to have a backup created by pgBackRest. Check your current backup status by checking those: + + - ```./infra/backups/backup/db``` - folder containing all backups + - ```./infra/logs/pgbackrest``` - folder containing pgBackRest logs + - ```./infra/ofelia_logs``` - containing logs from all ofelia jobs + +In order to restore the database, you have to stop the database inside the container: + +```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}} ") pg_ctl -D /home/postgres/pgdata/data stop +``` + +Check if database was stopped and container is still running: + +```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") pg_ctl -D /home/postgres/pgdata/data status +``` + +You should see: + +```bash + pg_ctl: no server running +``` + +The next step would be to remove content of the data folder: + +```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") rm -rI /home/postgres/pgdata/data +``` + +WIth all of this you can perform the restoration: + +```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") pgbackrest --stanza=db --log-level-stderr=info restore +``` + +Read more about restoring database using pgBackRest [here](https://pgbackrest.org/user-guide.html#restore). + +## \#(Option 2) Manual backup using pg_dump and pg_restore + +### Backup (pg_dump) + +If you need to create a backup only for certain database, you can use the following command: + +```bash +docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") sh -c 'pg_dump -U admin1234 -F t -d connect_db -f /var/lib/pgbackrest/manual_backup/connect_db_pg_dump_$(date "+%Y%m%d_%H%M%S").tar' +``` + +Navigate to ```./infra/backups/manual_backup``` to find your backup file. +You may read more about backup command at [PostgreSQL documentation](https://www.postgresql.org/docs/15/app-pgdump.html). + +### Restore (pg_restore) + +Replace ```backup_file_name.tar``` with the name of the backup file you want to restore. + +```bash +docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") sh -c 'pg_restore -U admin1234 -Ft -d connect_db < /var/lib/pgbackrest/manual_backup/backup_file_name.tar' +``` +You may read more about restore command at [PostgreSQL documentation](https://www.postgresql.org/docs/15/app-pgrestore.html). + +### (Bonus) Backup and restoration using pg_dumpall and psql + +You may want to create a backup of all databases, for this you can use the following command: + +```bash +docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") sh -c 'pg_dumpall -U admin1234 -f /var/lib/pgbackrest/manual_backup/all_dbs_pg_dumpall_$(date "+%Y%m%d_%H%M%S").sql' +``` + +Navigate to ```./infra/backups/manual_backup``` to find your backup file. +You may read more about all databases backup command at [PostgreSQL documentation](https://www.postgresql.org/docs/15/app-pg-dumpall.html). + +This command produces sql file which can be used to restore all databases, in order to do that we will utilize ```psql``` command: + +```bash +docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") sh -c 'psql -U admin1234 -d postgres -f /var/lib/pgbackrest/manual_backup/backup_file_name.sql' +``` + +## \#(Option 3) Manual backup using pg_basebackup + +In order to backup the whole cluster you can use ```pg_basebackup``` command. This command can be run on live database. + +```bash +docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") sh -c 'pg_basebackup -h localhost -p 5432 -U admin1234 -D /var/lib/pgbackrest/manual_backup/pg_basebackup_$(date "+%Y%m%d_%H%M%S") -P -F t -Z 9 -X stream' +``` + +For the restoration part: + + 1. Stop the database inside the container: + ```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}} ") pg_ctl -D /home/postgres/pgdata/data stop + ``` + + 2. Check if database was stopped and container is still running: + ```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") pg_ctl -D /home/postgres/pgdata/data status + ``` + + You should see: + ```bash + pg_ctl: no server running + ``` + +> [!WARNING] +> Backup Integrity: Ensure that the backup files are complete and not corrupted. If you used compression (e.g., gzip), verify that the archive can be successfully decompressed. + +The database restoration will include replacement of the main data folder with the backup data. You may want to backup the data folder before proceeding with the restoration. + + 3. Delete old data folder: + ```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") rm -rI /home/postgres/pgdata/data + ``` + +4. Create a new data folder and set permissions: + + ```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") mkdir /home/postgres/pgdata/data + ``` + + ```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") chown -R postgres:postgres /home/postgres/pgdata/data + ``` + +5. Navigate to directory with backup files and copy the backup to the data folder: + + ```bash + docker exec -it $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") sh -c 'cd /var/lib/pgbackrest/manual_backup/your_pg_basebackup && tar -zxvf base.tar.gz -C /home/postgres/pgdata/data && tar -zxvf pg_wal.tar.gz -C /home/postgres/pgdata/data/pg_wal' + ``` + +6. Restart docker container: + + ```bash + docker restart $(docker ps --filter "ancestor=timescale/timescaledb-ha:pg15-ts2.10" --format "{{.ID}}") + ``` \ No newline at end of file diff --git a/infra/scripts/clean_start.sh b/infra/scripts/clean_start.sh new file mode 100755 index 00000000..0b98b0fa --- /dev/null +++ b/infra/scripts/clean_start.sh @@ -0,0 +1,274 @@ +#!/bin/bash + +# Step [1]: For full clean start, remove the below directories +# Step [2]: Run the script +# Step [3]: Run the binary located in ./database/src/bin/tables_migration.rs + +# Source the .env +# Assuming env_loader.sh is in the same directory as this script +source "$(dirname "$0")/env_loader.sh" +read_env + +# Just in case stop the docker-compose +CONTAINER_ID=$(docker ps --filter "ancestor=$TIMESCALEDB_IMAGE" --format "{{.ID}}") + +# Define maximum wait time in seconds (20 seconds) +MAX_WAIT=20 +# Define sleep interval in seconds +SLEEP_INTERVAL=2 + +if [[ -n "$CONTAINER_ID" ]]; then + echo "Container found for $TIMESCALEDB_IMAGE, initiating shutdown..." + + # Attempt to gracefully stop the container + docker compose --profile full down + + WAIT_TIME=0 + + # Wait for the container to stop + while docker ps --filter "id=$CONTAINER_ID" --format "{{.ID}}" | grep -q "$CONTAINER_ID"; do + echo "Waiting for container $CONTAINER_ID to stop... ($WAIT_TIME seconds)" + sleep $SLEEP_INTERVAL + ((WAIT_TIME += SLEEP_INTERVAL)) + if ((WAIT_TIME >= MAX_WAIT)); then + echo "Maximum wait time reached. Proceeding with the next steps." + break + fi + done + + if ((WAIT_TIME < MAX_WAIT)); then + echo "Container $CONTAINER_ID has been successfully stopped." + fi +else + echo "No running container found for $TIMESCALEDB_IMAGE." +fi + +# Define the base directory as the path to the infra directory +BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." &>/dev/null && pwd)" + +directories=( + "${BASE_DIR}/${TIMESCALEDB_DATA}" + "${BASE_DIR}/${TIMESCALEDB_BACKUPS}" + "${BASE_DIR}/${TIMESCALEDB_LOGS}" + "${BASE_DIR}/${TIMESCALEDB_PGBACKREST_CONFIG}" + "${BASE_DIR}/${OFELIA_LOGS}" +) + +printf "\n------------- Tidying up the directories -------------\n" +for dir in "${directories[@]}"; do + if [ ! -d "$dir" ]; then + echo "Creating directory $dir" + mkdir -p "$dir" + fi + + chown -R $USER:$USER "$dir" + chmod -R 777 "$dir" +done + +# Configuration file path +pgbackrest_conf="$BASE_DIR/config/pgbackrest.conf" + +# Call the setup script with the configuration file path +echo "Generating pgbackrest_config..." +"$BASE_DIR/scripts/generate_pgbackrest_config.sh" "$pgbackrest_conf" + +# Change to the infra directory where the docker-compose.yaml file is located +cd "$BASE_DIR" + +# Define PostgreSQL data directory +POSTGRESQL_DATA_DIR="${PG_DATA}/data" # Source this path from .env +# PostgreSQL configuration file +POSTGRESQL_CONF="$POSTGRESQL_DATA_DIR/postgresql.conf" +BACKUP_MARKER="db" + +# Start Docker Compose in detached mode +echo "Starting Docker Compose..." + +if [ "$ONLY_DATABASE" = "TRUE" ]; then + echo "Starting only the TimescaleDB service..." + docker compose up -d +else + echo "Starting all services including Ofelia..." + docker compose --profile full up -d +fi + +# Function to check database readiness +wait_for_db_ready() { + echo "Waiting for TimescaleDB to be ready..." + local WAIT_TIME=0 + local CONTAINER_ID="" + + while ((WAIT_TIME < MAX_WAIT)); do + CONTAINER_ID=$(docker ps --filter "ancestor=$TIMESCALEDB_IMAGE" --format "{{.ID}}") + if [[ -z "$CONTAINER_ID" ]]; then + echo "No container found for $TIMESCALEDB_IMAGE, retrying..." + sleep $SLEEP_INTERVAL + ((WAIT_TIME += SLEEP_INTERVAL)) + continue + fi + + # Check the Docker logs for the readiness message + if docker logs $CONTAINER_ID 2>&1 | grep -q "database system is ready to accept connections"; then + echo "TimescaleDB is now ready." + return 0 + fi + + echo "Waiting for TimescaleDB to be ready... ${WAIT_TIME}s elapsed" + sleep $SLEEP_INTERVAL + ((WAIT_TIME += SLEEP_INTERVAL)) + done + + echo "Timeout waiting for TimescaleDB to be ready after ${MAX_WAIT}s." + return 1 +} + +# Wait for TimescaleDB to be ready +if wait_for_db_ready; then + printf "\n------------- Updating PostgreSQL configuration -------------\n" + + CONTAINER_ID=$(docker ps --filter "ancestor=$TIMESCALEDB_IMAGE" --format "{{.ID}}") + if [[ -z "$CONTAINER_ID" ]]; then + echo "Failed to find a running container for $TIMESCALEDB_IMAGE. Exiting." + exit 1 + fi + + docker exec -u postgres $CONTAINER_ID bash -c " + echo 'Using configuration file at: $POSTGRESQL_CONF' + + # Create a temporary file for the new configuration and check its validity + TEMP_CONF=\$(mktemp) + if [[ -z \$TEMP_CONF ]]; then + echo 'Failed to create a temporary file. Exiting.' + exit 1 + else + echo 'Temporary file created at: '\$TEMP_CONF'' + fi + + # Read the config file and make changes line by line + while IFS= read -r line || [[ -n \$line ]]; do + if echo \"\$line\" | grep -q 'timescaledb.telemetry_level='; then + echo 'timescaledb.telemetry_level=off' + elif echo \"\$line\" | grep -q 'timescaledb.max_background_workers ='; then + echo 'timescaledb.max_background_workers = 32' + else + echo \"\$line\" + fi + done < \"$POSTGRESQL_CONF\" > \"\$TEMP_CONF\" + + if [ -s \"\$TEMP_CONF\" ]; then + echo 'Configuration file has been successfully updated.' + mv \"\$TEMP_CONF\" \"$POSTGRESQL_CONF\" + else + echo 'Failed to update configuration file. Temporary file is empty.' + rm -f \"\$TEMP_CONF\" + exit 1 + fi + " + + + + docker exec -u root $CONTAINER_ID bash -c " + echo -e '\n# Custom PostgreSQL Configurations' >> $POSTGRESQL_CONF + echo 'archive_mode = on' >> $POSTGRESQL_CONF + echo 'archive_command = '\"'pgbackrest --stanza=$BACKUP_MARKER archive-push %p'\"'' >> $POSTGRESQL_CONF + echo 'max_wal_senders = 10' >> $POSTGRESQL_CONF + echo 'wal_level = logical' >> $POSTGRESQL_CONF + " + echo "PostgreSQL configuration updated." + + # Restart docker to apply the changes + echo "Restarting the container..." + docker restart $CONTAINER_ID +else + echo "Failed to confirm TimescaleDB readiness. Check logs for more details." +fi + +# Wait for TimescaleDB to be ready after the restart +if wait_for_db_ready; then + printf "\n------------- Proceeding with pgBackRest setup -------------\n" + CONTAINER_ID=$(docker ps --filter "ancestor=$TIMESCALEDB_IMAGE" --format "{{.ID}}") + if [[ -z "$CONTAINER_ID" ]]; then + echo "Failed to find a running container for $TIMESCALEDB_IMAGE after restart. Exiting." + exit 1 + fi + + sleep 2 + # Execute pgBackRest stanza-create + docker exec -u root $CONTAINER_ID bash -c " + pgbackrest --stanza=$BACKUP_MARKER --log-level-console=info --pg1-path=/home/postgres/pgdata/data --repo1-path=/var/lib/pgbackrest stanza-create + " + echo "pgBackRest stanza-create executed." + + # Fix permissions for the pgBackRest backup directory + docker exec -u root $CONTAINER_ID bash -c " + chown -R postgres:postgres /var/lib/pgbackrest + chmod -R 700 /var/lib/pgbackrest + mkdir -p /var/log/pgbackrest + chown -R postgres:postgres /var/log/pgbackrest + chmod -R 770 /var/log/pgbackrest + chown -R postgres:postgres /tmp/pgbackrest + chmod -R 770 /tmp/pgbackrest + mkdir -p /var/log/pgbackrest + chown -R postgres:postgres /var/lib/pgbackrest + chmod -R 770 /var/lib/pgbackrest + mkdir -p /var/lib/pgbackrest/manual_backup + chown -R postgres:postgres /var/lib/pgbackrest/manual_backup + " + echo "Permissions fixed for pgBackRest backup and log directories." + + # Execute pgBackRest check + docker exec -u postgres $CONTAINER_ID bash -c " + pgbackrest --stanza=$BACKUP_MARKER --log-level-console=info check + " + echo "pgBackRest check executed successfully." + + # Run docker logs if the env is not github CI + # if [[ -z "$CI_ENVIRONMENT" ]]; then + # echo "Not a CI, displaying the container logs..." + # docker logs -f $CONTAINER_ID + # fi + + echo "Creating a restricted user for Grafana in the database..." + + # Verify the variables are set + if [ -z "$GRAFANA_DB_USERNAME" ] || [ -z "$GRAFANA_DB_PASSWORD" ]; then + echo "Error: GRAFANA_DB_USERNAME or GRAFANA_DB_PASSWORD is not set. Please set these variables." + exit 1 + fi + printf "DATABASE NAME: $POSTGRES_DB\n" + + docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -c "CREATE USER $GRAFANA_DB_USERNAME WITH PASSWORD '$GRAFANA_DB_PASSWORD';" + docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -c "GRANT CONNECT ON DATABASE $POSTGRES_DB TO $GRAFANA_DB_USERNAME;" + docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -c "GRANT USAGE ON SCHEMA public TO $GRAFANA_DB_USERNAME;" + docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -c "GRANT SELECT ON ALL TABLES IN SCHEMA public TO $GRAFANA_DB_USERNAME;" + docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO $GRAFANA_DB_USERNAME;" + docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -c "REVOKE DELETE ON ALL TABLES IN SCHEMA public FROM $GRAFANA_DB_USERNAME;" + docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE DELETE ON TABLES FROM $GRAFANA_DB_USERNAME;" + + echo "Restricted user for Grafana has been created with SELECT privileges only." + + # Check if the user was created successfully + echo "Verifying the user creation and connection..." + # This query will return a row if the user exists + user_exists=$(docker exec -u postgres $CONTAINER_ID psql -d "$POSTGRES_DB" -tAc "SELECT 1 FROM pg_roles WHERE rolname = '$GRAFANA_DB_USERNAME';") + + if [[ "$user_exists" == "1" ]]; then + echo "User $GRAFANA_DB_USERNAME exists in the database." + else + echo "User $GRAFANA_DB_USERNAME does not exist. Please check the creation process." + exit 1 + fi + + # Check if the new user can connect and run a query + docker exec -u postgres $CONTAINER_ID psql -U "$GRAFANA_DB_USERNAME" -d "$POSTGRES_DB" -c "SELECT 1;" &>/dev/null + + if [ $? -eq 0 ]; then + echo "User $GRAFANA_DB_USERNAME created and verified successfully." + else + echo "Failed to verify user $GRAFANA_DB_USERNAME. Please check the PostgreSQL logs." + exit 1 + fi +else + echo "Failed to confirm TimescaleDB readiness after restart. Check logs for more details." + exit 1 +fi diff --git a/infra/scripts/custom_entrypoint.sh b/infra/scripts/custom_entrypoint.sh new file mode 100755 index 00000000..909a6a3b --- /dev/null +++ b/infra/scripts/custom_entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/bash +echo "Starting the original entrypoint script..." + +docker-entrypoint.sh "$@" +echo "Original entrypoint script has been called." + +# Keep the container from exiting +tail -f /dev/null diff --git a/infra/scripts/env_loader.sh b/infra/scripts/env_loader.sh new file mode 100755 index 00000000..7a6a6014 --- /dev/null +++ b/infra/scripts/env_loader.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +read_env() { + local filePath="${1:-.env}" + + if [ ! -f "$filePath" ]; then + echo "Missing ${filePath}" + exit 1 + fi + + echo "Reading $filePath" + while IFS='=' read -r key value; do + key=$(echo "$key" | awk '{$1=$1};1' | tr -d '\r') + value=$(echo "$value" | sed 's/#.*//' | awk '{$1=$1};1' | tr -d '\r') + + if [[ -n $key ]] && [[ -n $value ]]; then + if [[ "$value" =~ ^\".*\"$ || "$value" =~ ^\'.*\'$ ]]; then + value="${value:1:-1}" # Strip the quotes + fi + export "$key"="$value" + fi + done < "$filePath" +} diff --git a/infra/scripts/generate_pgbackrest_config.sh b/infra/scripts/generate_pgbackrest_config.sh new file mode 100755 index 00000000..4447598b --- /dev/null +++ b/infra/scripts/generate_pgbackrest_config.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# The first argument is the path where the pgbackrest.conf should be created/overwritten +config_path="$1" + +# Check if the configuration path was provided +if [ -z "$config_path" ]; then + echo "Usage: $0 " + exit 1 +fi + +# Source the .env +# Assuming env_loader.sh is in the same directory as this script +source "$(dirname "$0")/env_loader.sh" +read_env + +# Creating the pgbackrest configuration file +echo "Creating pgbackrest configuration at $config_path" + +# Use 'cat' to write the contents to the configuration file +cat >"$config_path" < models::SuccessResponseBody add_team_role(team_id, add_team_role_command) +Add team role. + +You need to have a permission with action `teams.roles:add` and scope `permissions:type:delegate`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | +**add_team_role_command** | [**AddTeamRoleCommand**](AddTeamRoleCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## add_user_role + +> models::SuccessResponseBody add_user_role(user_id, add_user_role_command) +Add a user role assignment. + +Assign a role to a specific user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:add` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only assign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign a role which will allow to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**add_user_role_command** | [**AddUserRoleCommand**](AddUserRoleCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_role + +> models::RoleDto create_role(create_role_form) +Create a new custom role. + +Creates a new custom role and maps given permissions to that role. Note that roles with the same prefix as Fixed Roles can’t be created. You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to create a custom role which allows to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_role_form** | [**CreateRoleForm**](CreateRoleForm.md) | | [required] | + +### Return type + +[**models::RoleDto**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_role + +> models::SuccessResponseBody delete_role(role_uid, force, global) +Delete a custom role. + +Delete a role with the given UID, and it’s permissions. If the role is assigned to a built-in role, the deletion operation will fail, unless force query param is set to true, and in that case all assignments will also be deleted. You need to have a permission with action `roles:delete` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only delete a custom role with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to delete a custom role which allows to do that. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**force** | Option<**bool**> | | | +**global** | Option<**bool**> | | | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_access_control_status + +> i64 get_access_control_status() +Get status. + +Returns an indicator to check if fine-grained access control is enabled or not. You need to have a permission with action `status:accesscontrol` and scope `services:accesscontrol`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**i64** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_resource_description + +> models::Description get_resource_description(resource) +Get a description of a resource's access control properties. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**resource** | **String** | | [required] | + +### Return type + +[**models::Description**](Description.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_resource_permissions + +> Vec get_resource_permissions(resource, resource_id) +Get permissions for a resource. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**resource** | **String** | | [required] | +**resource_id** | **String** | | [required] | + +### Return type + +[**Vec**](resourcePermissionDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_role + +> models::RoleDto get_role(role_uid) +Get a role. + +Get a role for the given UID. You need to have a permission with action `roles:read` and scope `roles:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | + +### Return type + +[**models::RoleDto**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_role_assignments + +> models::RoleAssignmentsDto get_role_assignments(role_uid) +Get role assignments. + +Get role assignments for the role with the given UID. You need to have a permission with action `teams.roles:list` and scope `teams:id:*` and `users.roles:list` and scope `users:id:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | + +### Return type + +[**models::RoleAssignmentsDto**](RoleAssignmentsDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_roles + +> Vec list_roles(delegatable) +Get all roles. + +Gets all existing roles. The response contains all global and organization local roles, for the organization which user is signed in. You need to have a permission with action `roles:read` and scope `roles:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**delegatable** | Option<**bool**> | | | + +### Return type + +[**Vec**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_team_roles + +> models::SuccessResponseBody list_team_roles(team_id) +Get team roles. + +You need to have a permission with action `teams.roles:read` and scope `teams:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_teams_roles + +> std::collections::HashMap> list_teams_roles(roles_search_query) +List roles assigned to multiple teams. + +Lists the roles that have been directly assigned to the given teams. You need to have a permission with action `teams.roles:read` and scope `teams:id:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**roles_search_query** | [**RolesSearchQuery**](RolesSearchQuery.md) | | [required] | + +### Return type + +[**std::collections::HashMap>**](Vec.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_user_roles + +> Vec list_user_roles(user_id) +List roles assigned to a user. + +Lists the roles that have been directly assigned to a given user. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**Vec**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_users_roles + +> std::collections::HashMap> list_users_roles(roles_search_query) +List roles assigned to multiple users. + +Lists the roles that have been directly assigned to the given users. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**roles_search_query** | [**RolesSearchQuery**](RolesSearchQuery.md) | | [required] | + +### Return type + +[**std::collections::HashMap>**](Vec.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_team_role + +> models::SuccessResponseBody remove_team_role(role_uid, team_id) +Remove team role. + +You need to have a permission with action `teams.roles:remove` and scope `permissions:type:delegate`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**team_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_user_role + +> models::SuccessResponseBody remove_user_role(role_uid, user_id, global) +Remove a user role assignment. + +Revoke a role from a user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:remove` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to unassign a role which will allow to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**user_id** | **i64** | | [required] | +**global** | Option<**bool**> | A flag indicating if the assignment is global or not. If set to false, the default org ID of the authenticated user will be used from the request to remove assignment. | | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_resource_permissions + +> models::SuccessResponseBody set_resource_permissions(resource, resource_id, set_permissions_command) +Set resource permissions. + +Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to one or many assignment types. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**resource** | **String** | | [required] | +**resource_id** | **String** | | [required] | +**set_permissions_command** | [**SetPermissionsCommand**](SetPermissionsCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_resource_permissions_for_built_in_role + +> models::SuccessResponseBody set_resource_permissions_for_built_in_role(resource, resource_id, built_in_role, set_permission_command) +Set resource permissions for a built-in role. + +Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to a built-in role. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**resource** | **String** | | [required] | +**resource_id** | **String** | | [required] | +**built_in_role** | **String** | | [required] | +**set_permission_command** | [**SetPermissionCommand**](SetPermissionCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_resource_permissions_for_team + +> models::SuccessResponseBody set_resource_permissions_for_team(resource, resource_id, team_id, set_permission_command) +Set resource permissions for a team. + +Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to a team. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**resource** | **String** | | [required] | +**resource_id** | **String** | | [required] | +**team_id** | **i64** | | [required] | +**set_permission_command** | [**SetPermissionCommand**](SetPermissionCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_resource_permissions_for_user + +> models::SuccessResponseBody set_resource_permissions_for_user(resource, resource_id, user_id, set_permission_command) +Set resource permissions for a user. + +Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to a user or a service account. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**resource** | **String** | | [required] | +**resource_id** | **String** | | [required] | +**user_id** | **i64** | | [required] | +**set_permission_command** | [**SetPermissionCommand**](SetPermissionCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_role_assignments + +> models::RoleAssignmentsDto set_role_assignments(role_uid, set_role_assignments_command) +Set role assignments. + +Set role assignments for the role with the given UID. You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate`, and `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**set_role_assignments_command** | [**SetRoleAssignmentsCommand**](SetRoleAssignmentsCommand.md) | | [required] | + +### Return type + +[**models::RoleAssignmentsDto**](RoleAssignmentsDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_team_roles + +> models::SuccessResponseBody set_team_roles(team_id) +Update team role. + +You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate` for each. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_user_roles + +> models::SuccessResponseBody set_user_roles(user_id, set_user_roles_command) +Set user role assignments. + +Update the user’s role assignments to match the provided set of UIDs. This will remove any assigned roles that aren’t in the request and add roles that are in the set but are not already assigned to the user. If you want to add or remove a single role, consider using Add a user role assignment or Remove a user role assignment instead. You need to have a permission with action `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate` for each. `permissions:type:delegate` scope ensures that users can only assign or unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign or unassign a role which will allow to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**set_user_roles_command** | [**SetUserRolesCommand**](SetUserRolesCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_role + +> models::RoleDto update_role(role_uid, update_role_command) +Update a custom role. + +You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**update_role_command** | [**UpdateRoleCommand**](UpdateRoleCommand.md) | | [required] | + +### Return type + +[**models::RoleDto**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/AccessControlProvisioningApi.md b/openapi/docs/AccessControlProvisioningApi.md new file mode 100755 index 00000000..854ad6f0 --- /dev/null +++ b/openapi/docs/AccessControlProvisioningApi.md @@ -0,0 +1,34 @@ +# \AccessControlProvisioningApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**admin_provisioning_reload_access_control**](AccessControlProvisioningApi.md#admin_provisioning_reload_access_control) | **POST** /admin/provisioning/access-control/reload | You need to have a permission with action `provisioning:reload` with scope `provisioners:accesscontrol`. + + + +## admin_provisioning_reload_access_control + +> models::ErrorResponseBody admin_provisioning_reload_access_control() +You need to have a permission with action `provisioning:reload` with scope `provisioners:accesscontrol`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ErrorResponseBody**](ErrorResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/ActiveSyncStatusDto.md b/openapi/docs/ActiveSyncStatusDto.md new file mode 100755 index 00000000..8de61ccc --- /dev/null +++ b/openapi/docs/ActiveSyncStatusDto.md @@ -0,0 +1,14 @@ +# ActiveSyncStatusDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**enabled** | Option<**bool**> | | [optional] +**next_sync** | Option<**String**> | | [optional] +**prev_sync** | Option<[**models::SyncResult**](SyncResult.md)> | | [optional] +**schedule** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ActiveUserStats.md b/openapi/docs/ActiveUserStats.md new file mode 100755 index 00000000..d60298a2 --- /dev/null +++ b/openapi/docs/ActiveUserStats.md @@ -0,0 +1,14 @@ +# ActiveUserStats + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active_admins_and_editors** | Option<**i64**> | | [optional] +**active_anonymous_devices** | Option<**i64**> | | [optional] +**active_users** | Option<**i64**> | | [optional] +**active_viewers** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddApiKeyCommand.md b/openapi/docs/AddApiKeyCommand.md new file mode 100755 index 00000000..b82d37be --- /dev/null +++ b/openapi/docs/AddApiKeyCommand.md @@ -0,0 +1,13 @@ +# AddApiKeyCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] +**seconds_to_live** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddDataSource200Response.md b/openapi/docs/AddDataSource200Response.md new file mode 100755 index 00000000..7051aeba --- /dev/null +++ b/openapi/docs/AddDataSource200Response.md @@ -0,0 +1,14 @@ +# AddDataSource200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**datasource** | [**models::DataSource**](DataSource.md) | | +**id** | **i64** | ID Identifier of the new data source. | +**message** | **String** | Message Message of the deleted dashboard. | +**name** | **String** | Name of the new data source. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddDataSourceCommand.md b/openapi/docs/AddDataSourceCommand.md new file mode 100755 index 00000000..af175ef0 --- /dev/null +++ b/openapi/docs/AddDataSourceCommand.md @@ -0,0 +1,23 @@ +# AddDataSourceCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access** | Option<**String**> | | [optional] +**basic_auth** | Option<**bool**> | | [optional] +**basic_auth_user** | Option<**String**> | | [optional] +**database** | Option<**String**> | | [optional] +**is_default** | Option<**bool**> | | [optional] +**json_data** | Option<[**serde_json::Value**](.md)> | | [optional] +**name** | Option<**String**> | | [optional] +**secure_json_data** | Option<**std::collections::HashMap**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**user** | Option<**String**> | | [optional] +**with_credentials** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddInviteForm.md b/openapi/docs/AddInviteForm.md new file mode 100755 index 00000000..db8f74f0 --- /dev/null +++ b/openapi/docs/AddInviteForm.md @@ -0,0 +1,14 @@ +# AddInviteForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**login_or_email** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] +**send_email** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddOrgUserCommand.md b/openapi/docs/AddOrgUserCommand.md new file mode 100755 index 00000000..c541f234 --- /dev/null +++ b/openapi/docs/AddOrgUserCommand.md @@ -0,0 +1,12 @@ +# AddOrgUserCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**login_or_email** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddServiceAccountTokenCommand.md b/openapi/docs/AddServiceAccountTokenCommand.md new file mode 100755 index 00000000..0a53f2d4 --- /dev/null +++ b/openapi/docs/AddServiceAccountTokenCommand.md @@ -0,0 +1,12 @@ +# AddServiceAccountTokenCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**seconds_to_live** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddTeamMemberCommand.md b/openapi/docs/AddTeamMemberCommand.md new file mode 100755 index 00000000..a0651590 --- /dev/null +++ b/openapi/docs/AddTeamMemberCommand.md @@ -0,0 +1,11 @@ +# AddTeamMemberCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddTeamRoleCommand.md b/openapi/docs/AddTeamRoleCommand.md new file mode 100755 index 00000000..2d24d8bc --- /dev/null +++ b/openapi/docs/AddTeamRoleCommand.md @@ -0,0 +1,11 @@ +# AddTeamRoleCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**role_uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AddUserRoleCommand.md b/openapi/docs/AddUserRoleCommand.md new file mode 100755 index 00000000..aaee08d6 --- /dev/null +++ b/openapi/docs/AddUserRoleCommand.md @@ -0,0 +1,12 @@ +# AddUserRoleCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**global** | Option<**bool**> | | [optional] +**role_uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Address.md b/openapi/docs/Address.md new file mode 100755 index 00000000..f54f7e79 --- /dev/null +++ b/openapi/docs/Address.md @@ -0,0 +1,16 @@ +# Address + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**address1** | Option<**String**> | | [optional] +**address2** | Option<**String**> | | [optional] +**city** | Option<**String**> | | [optional] +**country** | Option<**String**> | | [optional] +**state** | Option<**String**> | | [optional] +**zip_code** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AdminApi.md b/openapi/docs/AdminApi.md new file mode 100755 index 00000000..9127f728 --- /dev/null +++ b/openapi/docs/AdminApi.md @@ -0,0 +1,64 @@ +# \AdminApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**admin_get_settings**](AdminApi.md#admin_get_settings) | **GET** /admin/settings | Fetch settings. +[**admin_get_stats**](AdminApi.md#admin_get_stats) | **GET** /admin/stats | Fetch Grafana Stats. + + + +## admin_get_settings + +> std::collections::HashMap> admin_get_settings() +Fetch settings. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `settings:read` and scopes: `settings:*`, `settings:auth.saml:` and `settings:auth.saml:enabled` (property level). + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**std::collections::HashMap>**](std::collections::HashMap.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_get_stats + +> models::AdminStats admin_get_stats() +Fetch Grafana Stats. + +Only works with Basic Authentication (username and password). See introduction for an explanation. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `server:stats:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::AdminStats**](AdminStats.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/AdminCreateUserForm.md b/openapi/docs/AdminCreateUserForm.md new file mode 100755 index 00000000..d6dc5384 --- /dev/null +++ b/openapi/docs/AdminCreateUserForm.md @@ -0,0 +1,15 @@ +# AdminCreateUserForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**email** | Option<**String**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**password** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AdminCreateUserResponse.md b/openapi/docs/AdminCreateUserResponse.md new file mode 100755 index 00000000..c69ed926 --- /dev/null +++ b/openapi/docs/AdminCreateUserResponse.md @@ -0,0 +1,12 @@ +# AdminCreateUserResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**message** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AdminLdapApi.md b/openapi/docs/AdminLdapApi.md new file mode 100755 index 00000000..a8961ded --- /dev/null +++ b/openapi/docs/AdminLdapApi.md @@ -0,0 +1,126 @@ +# \AdminLdapApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_ldap_status**](AdminLdapApi.md#get_ldap_status) | **GET** /admin/ldap/status | Attempts to connect to all the configured LDAP servers and returns information on whenever they're available or not. +[**get_user_from_ldap**](AdminLdapApi.md#get_user_from_ldap) | **GET** /admin/ldap/{user_name} | Finds an user based on a username in LDAP. This helps illustrate how would the particular user be mapped in Grafana when synced. +[**post_sync_user_with_ldap**](AdminLdapApi.md#post_sync_user_with_ldap) | **POST** /admin/ldap/sync/{user_id} | Enables a single Grafana user to be synchronized against LDAP. +[**reload_ldap_cfg**](AdminLdapApi.md#reload_ldap_cfg) | **POST** /admin/ldap/reload | Reloads the LDAP configuration. + + + +## get_ldap_status + +> models::SuccessResponseBody get_ldap_status() +Attempts to connect to all the configured LDAP servers and returns information on whenever they're available or not. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.status:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_user_from_ldap + +> models::SuccessResponseBody get_user_from_ldap(user_name) +Finds an user based on a username in LDAP. This helps illustrate how would the particular user be mapped in Grafana when synced. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.user:read`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_name** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_sync_user_with_ldap + +> models::SuccessResponseBody post_sync_user_with_ldap(user_id) +Enables a single Grafana user to be synchronized against LDAP. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.user:sync`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## reload_ldap_cfg + +> models::SuccessResponseBody reload_ldap_cfg() +Reloads the LDAP configuration. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.config:reload`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/AdminProvisioningApi.md b/openapi/docs/AdminProvisioningApi.md new file mode 100755 index 00000000..ca5066a5 --- /dev/null +++ b/openapi/docs/AdminProvisioningApi.md @@ -0,0 +1,92 @@ +# \AdminProvisioningApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**admin_provisioning_reload_dashboards**](AdminProvisioningApi.md#admin_provisioning_reload_dashboards) | **POST** /admin/provisioning/dashboards/reload | Reload dashboard provisioning configurations. +[**admin_provisioning_reload_datasources**](AdminProvisioningApi.md#admin_provisioning_reload_datasources) | **POST** /admin/provisioning/datasources/reload | Reload datasource provisioning configurations. +[**admin_provisioning_reload_plugins**](AdminProvisioningApi.md#admin_provisioning_reload_plugins) | **POST** /admin/provisioning/plugins/reload | Reload plugin provisioning configurations. + + + +## admin_provisioning_reload_dashboards + +> models::SuccessResponseBody admin_provisioning_reload_dashboards() +Reload dashboard provisioning configurations. + +Reloads the provisioning config files for dashboards again. It won’t return until the new provisioned entities are already stored in the database. In case of dashboards, it will stop polling for changes in dashboard files and then restart it with new configurations after returning. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `provisioning:reload` and scope `provisioners:dashboards`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_provisioning_reload_datasources + +> models::SuccessResponseBody admin_provisioning_reload_datasources() +Reload datasource provisioning configurations. + +Reloads the provisioning config files for datasources again. It won’t return until the new provisioned entities are already stored in the database. In case of dashboards, it will stop polling for changes in dashboard files and then restart it with new configurations after returning. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `provisioning:reload` and scope `provisioners:datasources`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_provisioning_reload_plugins + +> models::SuccessResponseBody admin_provisioning_reload_plugins() +Reload plugin provisioning configurations. + +Reloads the provisioning config files for plugins again. It won’t return until the new provisioned entities are already stored in the database. In case of dashboards, it will stop polling for changes in dashboard files and then restart it with new configurations after returning. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `provisioning:reload` and scope `provisioners:plugin`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/AdminStats.md b/openapi/docs/AdminStats.md new file mode 100755 index 00000000..4168b78f --- /dev/null +++ b/openapi/docs/AdminStats.md @@ -0,0 +1,34 @@ +# AdminStats + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active_admins** | Option<**i64**> | | [optional] +**active_devices** | Option<**i64**> | | [optional] +**active_editors** | Option<**i64**> | | [optional] +**active_sessions** | Option<**i64**> | | [optional] +**active_users** | Option<**i64**> | | [optional] +**active_viewers** | Option<**i64**> | | [optional] +**admins** | Option<**i64**> | | [optional] +**alerts** | Option<**i64**> | | [optional] +**daily_active_admins** | Option<**i64**> | | [optional] +**daily_active_editors** | Option<**i64**> | | [optional] +**daily_active_sessions** | Option<**i64**> | | [optional] +**daily_active_users** | Option<**i64**> | | [optional] +**daily_active_viewers** | Option<**i64**> | | [optional] +**dashboards** | Option<**i64**> | | [optional] +**datasources** | Option<**i64**> | | [optional] +**editors** | Option<**i64**> | | [optional] +**monthly_active_users** | Option<**i64**> | | [optional] +**orgs** | Option<**i64**> | | [optional] +**playlists** | Option<**i64**> | | [optional] +**snapshots** | Option<**i64**> | | [optional] +**stars** | Option<**i64**> | | [optional] +**tags** | Option<**i64**> | | [optional] +**users** | Option<**i64**> | | [optional] +**viewers** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AdminUpdateUserPasswordForm.md b/openapi/docs/AdminUpdateUserPasswordForm.md new file mode 100755 index 00000000..b435e20a --- /dev/null +++ b/openapi/docs/AdminUpdateUserPasswordForm.md @@ -0,0 +1,11 @@ +# AdminUpdateUserPasswordForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**password** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AdminUpdateUserPermissionsForm.md b/openapi/docs/AdminUpdateUserPermissionsForm.md new file mode 100755 index 00000000..53b124ef --- /dev/null +++ b/openapi/docs/AdminUpdateUserPermissionsForm.md @@ -0,0 +1,11 @@ +# AdminUpdateUserPermissionsForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**is_grafana_admin** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AdminUsersApi.md b/openapi/docs/AdminUsersApi.md new file mode 100755 index 00000000..e721d6ee --- /dev/null +++ b/openapi/docs/AdminUsersApi.md @@ -0,0 +1,354 @@ +# \AdminUsersApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**admin_create_user**](AdminUsersApi.md#admin_create_user) | **POST** /admin/users | Create new user. +[**admin_delete_user**](AdminUsersApi.md#admin_delete_user) | **DELETE** /admin/users/{user_id} | Delete global User. +[**admin_disable_user**](AdminUsersApi.md#admin_disable_user) | **POST** /admin/users/{user_id}/disable | Disable user. +[**admin_enable_user**](AdminUsersApi.md#admin_enable_user) | **POST** /admin/users/{user_id}/enable | Enable user. +[**admin_get_user_auth_tokens**](AdminUsersApi.md#admin_get_user_auth_tokens) | **GET** /admin/users/{user_id}/auth-tokens | Return a list of all auth tokens (devices) that the user currently have logged in from. +[**admin_logout_user**](AdminUsersApi.md#admin_logout_user) | **POST** /admin/users/{user_id}/logout | Logout user revokes all auth tokens (devices) for the user. User of issued auth tokens (devices) will no longer be logged in and will be required to authenticate again upon next activity. +[**admin_revoke_user_auth_token**](AdminUsersApi.md#admin_revoke_user_auth_token) | **POST** /admin/users/{user_id}/revoke-auth-token | Revoke auth token for user. +[**admin_update_user_password**](AdminUsersApi.md#admin_update_user_password) | **PUT** /admin/users/{user_id}/password | Set password for user. +[**admin_update_user_permissions**](AdminUsersApi.md#admin_update_user_permissions) | **PUT** /admin/users/{user_id}/permissions | Set permissions for user. +[**get_user_quota**](AdminUsersApi.md#get_user_quota) | **GET** /admin/users/{user_id}/quotas | Fetch user quota. +[**update_user_quota**](AdminUsersApi.md#update_user_quota) | **PUT** /admin/users/{user_id}/quotas/{quota_target} | Update user quota. + + + +## admin_create_user + +> models::AdminCreateUserResponse admin_create_user(admin_create_user_form) +Create new user. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:create`. Note that OrgId is an optional parameter that can be used to assign a new user to a different organization when `auto_assign_org` is set to `true`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**admin_create_user_form** | [**AdminCreateUserForm**](AdminCreateUserForm.md) | | [required] | + +### Return type + +[**models::AdminCreateUserResponse**](AdminCreateUserResponse.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_delete_user + +> models::SuccessResponseBody admin_delete_user(user_id) +Delete global User. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:delete` and scope `global.users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_disable_user + +> models::SuccessResponseBody admin_disable_user(user_id) +Disable user. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:disable` and scope `global.users:1` (userIDScope). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_enable_user + +> models::SuccessResponseBody admin_enable_user(user_id) +Enable user. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:enable` and scope `global.users:1` (userIDScope). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_get_user_auth_tokens + +> Vec admin_get_user_auth_tokens(user_id) +Return a list of all auth tokens (devices) that the user currently have logged in from. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.authtoken:list` and scope `global.users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**Vec**](UserToken.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_logout_user + +> models::SuccessResponseBody admin_logout_user(user_id) +Logout user revokes all auth tokens (devices) for the user. User of issued auth tokens (devices) will no longer be logged in and will be required to authenticate again upon next activity. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.logout` and scope `global.users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_revoke_user_auth_token + +> models::SuccessResponseBody admin_revoke_user_auth_token(user_id, revoke_auth_token_cmd) +Revoke auth token for user. + +Revokes the given auth token (device) for the user. User of issued auth token (device) will no longer be logged in and will be required to authenticate again upon next activity. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.authtoken:update` and scope `global.users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**revoke_auth_token_cmd** | [**RevokeAuthTokenCmd**](RevokeAuthTokenCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_update_user_password + +> models::SuccessResponseBody admin_update_user_password(user_id, admin_update_user_password_form) +Set password for user. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.password:update` and scope `global.users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**admin_update_user_password_form** | [**AdminUpdateUserPasswordForm**](AdminUpdateUserPasswordForm.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_update_user_permissions + +> models::SuccessResponseBody admin_update_user_permissions(user_id, admin_update_user_permissions_form) +Set permissions for user. + +Only works with Basic Authentication (username and password). See introduction for an explanation. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.permissions:update` and scope `global.users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**admin_update_user_permissions_form** | [**AdminUpdateUserPermissionsForm**](AdminUpdateUserPermissionsForm.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_user_quota + +> Vec get_user_quota(user_id) +Fetch user quota. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.quotas:list` and scope `global.users:1` (userIDScope). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**Vec**](QuotaDTO.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_user_quota + +> models::SuccessResponseBody update_user_quota(quota_target, user_id, update_quota_cmd) +Update user quota. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.quotas:update` and scope `global.users:1` (userIDScope). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**quota_target** | **String** | | [required] | +**user_id** | **i64** | | [required] | +**update_quota_cmd** | [**UpdateQuotaCmd**](UpdateQuotaCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/Alert.md b/openapi/docs/Alert.md new file mode 100755 index 00000000..76706a9d --- /dev/null +++ b/openapi/docs/Alert.md @@ -0,0 +1,12 @@ +# Alert + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**generator_url** | Option<**String**> | generator URL Format: uri | [optional] +**labels** | **std::collections::HashMap** | LabelSet label set | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertDiscovery.md b/openapi/docs/AlertDiscovery.md new file mode 100755 index 00000000..8c52ed34 --- /dev/null +++ b/openapi/docs/AlertDiscovery.md @@ -0,0 +1,11 @@ +# AlertDiscovery + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alerts** | [**Vec**](Alert.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertGroup.md b/openapi/docs/AlertGroup.md new file mode 100755 index 00000000..b21c89cb --- /dev/null +++ b/openapi/docs/AlertGroup.md @@ -0,0 +1,13 @@ +# AlertGroup + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alerts** | [**Vec**](gettableAlert.md) | alerts | +**labels** | **std::collections::HashMap** | LabelSet label set | +**receiver** | [**models::Receiver**](receiver.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertInstancesResponse.md b/openapi/docs/AlertInstancesResponse.md new file mode 100755 index 00000000..92610c42 --- /dev/null +++ b/openapi/docs/AlertInstancesResponse.md @@ -0,0 +1,11 @@ +# AlertInstancesResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**instances** | Option<[**Vec>**](Vec.md)> | Instances is an array of arrow encoded dataframes each frame has a single row, and a column for each instance (alert identified by unique labels) with a boolean value (firing/not firing) | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertManager.md b/openapi/docs/AlertManager.md new file mode 100755 index 00000000..cf73d728 --- /dev/null +++ b/openapi/docs/AlertManager.md @@ -0,0 +1,11 @@ +# AlertManager + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertManagersResult.md b/openapi/docs/AlertManagersResult.md new file mode 100755 index 00000000..0a7f7032 --- /dev/null +++ b/openapi/docs/AlertManagersResult.md @@ -0,0 +1,12 @@ +# AlertManagersResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active_alert_managers** | Option<[**Vec**](AlertManager.md)> | | [optional] +**dropped_alert_managers** | Option<[**Vec**](AlertManager.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertQuery.md b/openapi/docs/AlertQuery.md new file mode 100755 index 00000000..75ed0fd6 --- /dev/null +++ b/openapi/docs/AlertQuery.md @@ -0,0 +1,15 @@ +# AlertQuery + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**datasource_uid** | Option<**String**> | Grafana data source unique identifier; it should be '__expr__' for a Server Side Expression operation. | [optional] +**model** | Option<[**serde_json::Value**](.md)> | JSON is the raw JSON query and includes the above properties as well as custom properties. | [optional] +**query_type** | Option<**String**> | QueryType is an optional identifier for the type of query. It can be used to distinguish different types of queries. | [optional] +**ref_id** | Option<**String**> | RefID is the unique identifier of the query, set by the frontend call. | [optional] +**relative_time_range** | Option<[**models::RelativeTimeRange**](RelativeTimeRange.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertQueryExport.md b/openapi/docs/AlertQueryExport.md new file mode 100755 index 00000000..db5fe0fc --- /dev/null +++ b/openapi/docs/AlertQueryExport.md @@ -0,0 +1,15 @@ +# AlertQueryExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**datasource_uid** | Option<**String**> | | [optional] +**model** | Option<[**serde_json::Value**](.md)> | | [optional] +**query_type** | Option<**String**> | | [optional] +**ref_id** | Option<**String**> | | [optional] +**relative_time_range** | Option<[**models::RelativeTimeRangeExport**](RelativeTimeRangeExport.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertResponse.md b/openapi/docs/AlertResponse.md new file mode 100755 index 00000000..cfabaee3 --- /dev/null +++ b/openapi/docs/AlertResponse.md @@ -0,0 +1,14 @@ +# AlertResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | Option<[**models::AlertDiscovery**](AlertDiscovery.md)> | | [optional] +**error** | Option<**String**> | | [optional] +**error_type** | Option<**String**> | | [optional] +**status** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertRuleExport.md b/openapi/docs/AlertRuleExport.md new file mode 100755 index 00000000..55c445ba --- /dev/null +++ b/openapi/docs/AlertRuleExport.md @@ -0,0 +1,23 @@ +# AlertRuleExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotations** | Option<**std::collections::HashMap**> | | [optional] +**condition** | Option<**String**> | | [optional] +**dasboard_uid** | Option<**String**> | | [optional] +**data** | Option<[**Vec**](AlertQueryExport.md)> | | [optional] +**exec_err_state** | Option<**String**> | | [optional] +**r#for** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**is_paused** | Option<**bool**> | | [optional] +**labels** | Option<**std::collections::HashMap**> | | [optional] +**no_data_state** | Option<**String**> | | [optional] +**notification_settings** | Option<[**models::AlertRuleNotificationSettingsExport**](AlertRuleNotificationSettingsExport.md)> | | [optional] +**panel_id** | Option<**i64**> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertRuleGroup.md b/openapi/docs/AlertRuleGroup.md new file mode 100755 index 00000000..e55bed36 --- /dev/null +++ b/openapi/docs/AlertRuleGroup.md @@ -0,0 +1,14 @@ +# AlertRuleGroup + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder_uid** | Option<**String**> | | [optional] +**interval** | Option<**i64**> | | [optional] +**rules** | Option<[**Vec**](ProvisionedAlertRule.md)> | | [optional] +**title** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertRuleGroupExport.md b/openapi/docs/AlertRuleGroupExport.md new file mode 100755 index 00000000..a50dea24 --- /dev/null +++ b/openapi/docs/AlertRuleGroupExport.md @@ -0,0 +1,15 @@ +# AlertRuleGroupExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder** | Option<**String**> | | [optional] +**interval** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**rules** | Option<[**Vec**](AlertRuleExport.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertRuleGroupMetadata.md b/openapi/docs/AlertRuleGroupMetadata.md new file mode 100755 index 00000000..36e6922a --- /dev/null +++ b/openapi/docs/AlertRuleGroupMetadata.md @@ -0,0 +1,11 @@ +# AlertRuleGroupMetadata + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**interval** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertRuleNotificationSettings.md b/openapi/docs/AlertRuleNotificationSettings.md new file mode 100755 index 00000000..c8b97a85 --- /dev/null +++ b/openapi/docs/AlertRuleNotificationSettings.md @@ -0,0 +1,16 @@ +# AlertRuleNotificationSettings + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**group_by** | Option<**Vec**> | Override the labels by which incoming alerts are grouped together. For example, multiple alerts coming in for cluster=A and alertname=LatencyHigh would be batched into a single group. To aggregate by all possible labels use the special value '...' as the sole label name. This effectively disables aggregation entirely, passing through all alerts as-is. This is unlikely to be what you want, unless you have a very low alert volume or your upstream notification system performs its own grouping. Must include 'alertname' and 'grafana_folder' if not using '...'. | [optional][default to ["alertname","grafana_folder"]] +**group_interval** | Option<**String**> | Override how long to wait before sending a notification about new alerts that are added to a group of alerts for which an initial notification has already been sent. (Usually ~5m or more.) | [optional] +**group_wait** | Option<**String**> | Override how long to initially wait to send a notification for a group of alerts. Allows to wait for an inhibiting alert to arrive or collect more initial alerts for the same group. (Usually ~0s to few minutes.) | [optional] +**mute_time_intervals** | Option<**Vec**> | Override the times when notifications should be muted. These must match the name of a mute time interval defined in the alertmanager configuration mute_time_intervals section. When muted it will not send any notifications, but otherwise acts normally. | [optional] +**receiver** | **String** | Name of the receiver to send notifications to. | +**repeat_interval** | Option<**String**> | Override how long to wait before sending a notification again if it has already been sent successfully for an alert. (Usually ~3h or more). Note that this parameter is implicitly bound by Alertmanager's `--data.retention` configuration flag. Notifications will be resent after either repeat_interval or the data retention period have passed, whichever occurs first. `repeat_interval` should not be less than `group_interval`. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertRuleNotificationSettingsExport.md b/openapi/docs/AlertRuleNotificationSettingsExport.md new file mode 100755 index 00000000..42e48d71 --- /dev/null +++ b/openapi/docs/AlertRuleNotificationSettingsExport.md @@ -0,0 +1,16 @@ +# AlertRuleNotificationSettingsExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**group_by** | Option<**Vec**> | | [optional] +**group_interval** | Option<**String**> | | [optional] +**group_wait** | Option<**String**> | | [optional] +**mute_time_intervals** | Option<**Vec**> | | [optional] +**receiver** | Option<**String**> | | [optional] +**repeat_interval** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertStatus.md b/openapi/docs/AlertStatus.md new file mode 100755 index 00000000..8c0af0ec --- /dev/null +++ b/openapi/docs/AlertStatus.md @@ -0,0 +1,13 @@ +# AlertStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**inhibited_by** | **Vec** | inhibited by | +**silenced_by** | **Vec** | silenced by | +**state** | **String** | state | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertingFileExport.md b/openapi/docs/AlertingFileExport.md new file mode 100755 index 00000000..075ab64d --- /dev/null +++ b/openapi/docs/AlertingFileExport.md @@ -0,0 +1,15 @@ +# AlertingFileExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_version** | Option<**i64**> | | [optional] +**contact_points** | Option<[**Vec**](ContactPointExport.md)> | | [optional] +**groups** | Option<[**Vec**](AlertRuleGroupExport.md)> | | [optional] +**mute_times** | Option<[**Vec**](MuteTimeIntervalExport.md)> | | [optional] +**policies** | Option<[**Vec**](NotificationPolicyExport.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertingRule.md b/openapi/docs/AlertingRule.md new file mode 100755 index 00000000..0322bd36 --- /dev/null +++ b/openapi/docs/AlertingRule.md @@ -0,0 +1,25 @@ +# AlertingRule + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active_at** | **String** | | +**alerts** | Option<[**Vec**](Alert.md)> | | [optional] +**annotations** | **std::collections::HashMap** | The custom marshaling for labels.Labels ends up doing this anyways. | +**duration** | Option<**f64**> | | [optional] +**evaluation_time** | Option<**f64**> | | [optional] +**health** | **String** | | +**labels** | Option<**std::collections::HashMap**> | The custom marshaling for labels.Labels ends up doing this anyways. | [optional] +**last_error** | Option<**String**> | | [optional] +**last_evaluation** | Option<**String**> | | [optional] +**name** | **String** | | +**query** | **String** | | +**state** | **String** | State can be \"pending\", \"firing\", \"inactive\". | +**totals** | Option<**std::collections::HashMap**> | | [optional] +**totals_filtered** | Option<**std::collections::HashMap**> | | [optional] +**r#type** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertingStatus.md b/openapi/docs/AlertingStatus.md new file mode 100755 index 00000000..1758a23d --- /dev/null +++ b/openapi/docs/AlertingStatus.md @@ -0,0 +1,12 @@ +# AlertingStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alertmanagers_choice** | Option<**String**> | | [optional] +**num_external_alertmanagers** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertmanagerConfig.md b/openapi/docs/AlertmanagerConfig.md new file mode 100755 index 00000000..88863c23 --- /dev/null +++ b/openapi/docs/AlertmanagerConfig.md @@ -0,0 +1,11 @@ +# AlertmanagerConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**original** | **String** | original | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AlertmanagerStatus.md b/openapi/docs/AlertmanagerStatus.md new file mode 100755 index 00000000..19b5db8f --- /dev/null +++ b/openapi/docs/AlertmanagerStatus.md @@ -0,0 +1,14 @@ +# AlertmanagerStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**cluster** | [**models::ClusterStatus**](clusterStatus.md) | | +**config** | [**models::AlertmanagerConfig**](alertmanagerConfig.md) | | +**uptime** | **String** | uptime | +**version_info** | [**models::VersionInfo**](versionInfo.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Annotation.md b/openapi/docs/Annotation.md new file mode 100755 index 00000000..76d5d516 --- /dev/null +++ b/openapi/docs/Annotation.md @@ -0,0 +1,29 @@ +# Annotation + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alert_id** | Option<**i64**> | | [optional] +**alert_name** | Option<**String**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**created** | Option<**i64**> | | [optional] +**dashboard_id** | Option<**i64**> | | [optional] +**dashboard_uid** | Option<**String**> | | [optional] +**data** | Option<[**serde_json::Value**](.md)> | | [optional] +**email** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**login** | Option<**String**> | | [optional] +**new_state** | Option<**String**> | | [optional] +**panel_id** | Option<**i64**> | | [optional] +**prev_state** | Option<**String**> | | [optional] +**tags** | Option<**Vec**> | | [optional] +**text** | Option<**String**> | | [optional] +**time** | Option<**i64**> | | [optional] +**time_end** | Option<**i64**> | | [optional] +**updated** | Option<**i64**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AnnotationActions.md b/openapi/docs/AnnotationActions.md new file mode 100755 index 00000000..d1b1d309 --- /dev/null +++ b/openapi/docs/AnnotationActions.md @@ -0,0 +1,13 @@ +# AnnotationActions + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**can_add** | Option<**bool**> | | [optional] +**can_delete** | Option<**bool**> | | [optional] +**can_edit** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AnnotationEvent.md b/openapi/docs/AnnotationEvent.md new file mode 100755 index 00000000..73ec71c5 --- /dev/null +++ b/openapi/docs/AnnotationEvent.md @@ -0,0 +1,20 @@ +# AnnotationEvent + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**color** | Option<**String**> | | [optional] +**dashboard_id** | Option<**i64**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_region** | Option<**bool**> | | [optional] +**panel_id** | Option<**i64**> | | [optional] +**source** | Option<[**models::AnnotationQuery**](AnnotationQuery.md)> | | [optional] +**tags** | Option<**Vec**> | | [optional] +**text** | Option<**String**> | | [optional] +**time** | Option<**i64**> | | [optional] +**time_end** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AnnotationPanelFilter.md b/openapi/docs/AnnotationPanelFilter.md new file mode 100755 index 00000000..470551c6 --- /dev/null +++ b/openapi/docs/AnnotationPanelFilter.md @@ -0,0 +1,12 @@ +# AnnotationPanelFilter + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**exclude** | Option<**bool**> | Should the specified panels be included or excluded | [optional] +**ids** | Option<**Vec**> | Panel IDs that should be included or excluded | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AnnotationPermission.md b/openapi/docs/AnnotationPermission.md new file mode 100755 index 00000000..7ab5a61e --- /dev/null +++ b/openapi/docs/AnnotationPermission.md @@ -0,0 +1,12 @@ +# AnnotationPermission + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard** | Option<[**models::AnnotationActions**](AnnotationActions.md)> | | [optional] +**organization** | Option<[**models::AnnotationActions**](AnnotationActions.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AnnotationQuery.md b/openapi/docs/AnnotationQuery.md new file mode 100755 index 00000000..f99333b8 --- /dev/null +++ b/openapi/docs/AnnotationQuery.md @@ -0,0 +1,19 @@ +# AnnotationQuery + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**built_in** | Option<**f32**> | Set to 1 for the standard annotation query all dashboards have by default. | [optional] +**datasource** | Option<[**models::DataSourceRef**](DataSourceRef.md)> | | [optional] +**enable** | Option<**bool**> | When enabled the annotation query is issued with every dashboard refresh | [optional] +**filter** | Option<[**models::AnnotationPanelFilter**](AnnotationPanelFilter.md)> | | [optional] +**hide** | Option<**bool**> | Annotation queries can be toggled on or off at the top of the dashboard. When hide is true, the toggle is not shown in the dashboard. | [optional] +**icon_color** | Option<**String**> | Color to use for the annotation event markers | [optional] +**name** | Option<**String**> | Name of annotation. | [optional] +**target** | Option<[**models::AnnotationTarget**](AnnotationTarget.md)> | | [optional] +**r#type** | Option<**String**> | TODO -- this should not exist here, it is based on the --grafana-- datasource | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AnnotationTarget.md b/openapi/docs/AnnotationTarget.md new file mode 100755 index 00000000..1de4a1d2 --- /dev/null +++ b/openapi/docs/AnnotationTarget.md @@ -0,0 +1,14 @@ +# AnnotationTarget + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**limit** | Option<**i64**> | Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change | [optional] +**match_any** | Option<**bool**> | Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change | [optional] +**tags** | Option<**Vec**> | Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change | [optional] +**r#type** | Option<**String**> | Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AnnotationsApi.md b/openapi/docs/AnnotationsApi.md new file mode 100755 index 00000000..b70d8b15 --- /dev/null +++ b/openapi/docs/AnnotationsApi.md @@ -0,0 +1,296 @@ +# \AnnotationsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**delete_annotation_by_id**](AnnotationsApi.md#delete_annotation_by_id) | **DELETE** /annotations/{annotation_id} | Delete Annotation By ID. +[**get_annotation_by_id**](AnnotationsApi.md#get_annotation_by_id) | **GET** /annotations/{annotation_id} | Get Annotation by ID. +[**get_annotation_tags**](AnnotationsApi.md#get_annotation_tags) | **GET** /annotations/tags | Find Annotations Tags. +[**get_annotations**](AnnotationsApi.md#get_annotations) | **GET** /annotations | Find Annotations. +[**mass_delete_annotations**](AnnotationsApi.md#mass_delete_annotations) | **POST** /annotations/mass-delete | Delete multiple annotations. +[**patch_annotation**](AnnotationsApi.md#patch_annotation) | **PATCH** /annotations/{annotation_id} | Patch Annotation. +[**post_annotation**](AnnotationsApi.md#post_annotation) | **POST** /annotations | Create Annotation. +[**post_graphite_annotation**](AnnotationsApi.md#post_graphite_annotation) | **POST** /annotations/graphite | Create Annotation in Graphite format. +[**update_annotation**](AnnotationsApi.md#update_annotation) | **PUT** /annotations/{annotation_id} | Update Annotation. + + + +## delete_annotation_by_id + +> models::SuccessResponseBody delete_annotation_by_id(annotation_id) +Delete Annotation By ID. + +Deletes the annotation that matches the specified ID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**annotation_id** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_annotation_by_id + +> models::Annotation get_annotation_by_id(annotation_id) +Get Annotation by ID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**annotation_id** | **String** | | [required] | + +### Return type + +[**models::Annotation**](Annotation.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_annotation_tags + +> models::GetAnnotationTagsResponse get_annotation_tags(tag, limit) +Find Annotations Tags. + +Find all the event tags created in the annotations. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**tag** | Option<**String**> | Tag is a string that you can use to filter tags. | | +**limit** | Option<**String**> | Max limit for results returned. | |[default to 100] + +### Return type + +[**models::GetAnnotationTagsResponse**](GetAnnotationTagsResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_annotations + +> Vec get_annotations(from, to, user_id, alert_id, dashboard_id, dashboard_uid, panel_id, limit, tags, r#type, match_any) +Find Annotations. + +Starting in Grafana v6.4 regions annotations are now returned in one entity that now includes the timeEnd property. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**from** | Option<**i64**> | Find annotations created after specific epoch datetime in milliseconds. | | +**to** | Option<**i64**> | Find annotations created before specific epoch datetime in milliseconds. | | +**user_id** | Option<**i64**> | Limit response to annotations created by specific user. | | +**alert_id** | Option<**i64**> | Find annotations for a specified alert. | | +**dashboard_id** | Option<**i64**> | Find annotations that are scoped to a specific dashboard | | +**dashboard_uid** | Option<**String**> | Find annotations that are scoped to a specific dashboard | | +**panel_id** | Option<**i64**> | Find annotations that are scoped to a specific panel | | +**limit** | Option<**i64**> | Max limit for results returned. | | +**tags** | Option<[**Vec**](String.md)> | Use this to filter organization annotations. Organization annotations are annotations from an annotation data source that are not connected specifically to a dashboard or panel. You can filter by multiple tags. | | +**r#type** | Option<**String**> | Return alerts or user created annotations | | +**match_any** | Option<**bool**> | Match any or all tags | | + +### Return type + +[**Vec**](Annotation.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## mass_delete_annotations + +> models::SuccessResponseBody mass_delete_annotations(mass_delete_annotations_cmd) +Delete multiple annotations. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**mass_delete_annotations_cmd** | [**MassDeleteAnnotationsCmd**](MassDeleteAnnotationsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## patch_annotation + +> models::SuccessResponseBody patch_annotation(annotation_id, patch_annotations_cmd) +Patch Annotation. + +Updates one or more properties of an annotation that matches the specified ID. This operation currently supports updating of the `text`, `tags`, `time` and `timeEnd` properties. This is available in Grafana 6.0.0-beta2 and above. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**annotation_id** | **String** | | [required] | +**patch_annotations_cmd** | [**PatchAnnotationsCmd**](PatchAnnotationsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_annotation + +> models::PostAnnotation200Response post_annotation(post_annotations_cmd) +Create Annotation. + +Creates an annotation in the Grafana database. The dashboardId and panelId fields are optional. If they are not specified then an organization annotation is created and can be queried in any dashboard that adds the Grafana annotations data source. When creating a region annotation include the timeEnd property. The format for `time` and `timeEnd` should be epoch numbers in millisecond resolution. The response for this HTTP request is slightly different in versions prior to v6.4. In prior versions you would also get an endId if you where creating a region. But in 6.4 regions are represented using a single event with time and timeEnd properties. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**post_annotations_cmd** | [**PostAnnotationsCmd**](PostAnnotationsCmd.md) | | [required] | + +### Return type + +[**models::PostAnnotation200Response**](postAnnotation_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_graphite_annotation + +> models::PostAnnotation200Response post_graphite_annotation(post_graphite_annotations_cmd) +Create Annotation in Graphite format. + +Creates an annotation by using Graphite-compatible event format. The `when` and `data` fields are optional. If `when` is not specified then the current time will be used as annotation’s timestamp. The `tags` field can also be in prior to Graphite `0.10.0` format (string with multiple tags being separated by a space). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**post_graphite_annotations_cmd** | [**PostGraphiteAnnotationsCmd**](PostGraphiteAnnotationsCmd.md) | | [required] | + +### Return type + +[**models::PostAnnotation200Response**](postAnnotation_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_annotation + +> models::SuccessResponseBody update_annotation(annotation_id, update_annotations_cmd) +Update Annotation. + +Updates all properties of an annotation that matches the specified id. To only update certain property, consider using the Patch Annotation operation. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**annotation_id** | **String** | | [required] | +**update_annotations_cmd** | [**UpdateAnnotationsCmd**](UpdateAnnotationsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/ApiKeyDto.md b/openapi/docs/ApiKeyDto.md new file mode 100755 index 00000000..cc8b3685 --- /dev/null +++ b/openapi/docs/ApiKeyDto.md @@ -0,0 +1,16 @@ +# ApiKeyDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_control** | Option<**std::collections::HashMap**> | Metadata contains user accesses for a given resource Ex: map[string]bool{\"create\":true, \"delete\": true} | [optional] +**expiration** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**last_used_at** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ApiKeysApi.md b/openapi/docs/ApiKeysApi.md new file mode 100755 index 00000000..93ae56bc --- /dev/null +++ b/openapi/docs/ApiKeysApi.md @@ -0,0 +1,101 @@ +# \ApiKeysApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_ap_ikey**](ApiKeysApi.md#add_ap_ikey) | **POST** /auth/keys | Creates an API key. +[**delete_ap_ikey**](ApiKeysApi.md#delete_ap_ikey) | **DELETE** /auth/keys/{id} | Delete API key. +[**get_ap_ikeys**](ApiKeysApi.md#get_ap_ikeys) | **GET** /auth/keys | Get auth keys. + + + +## add_ap_ikey + +> models::NewApiKeyResult add_ap_ikey(add_api_key_command) +Creates an API key. + +Will return details of the created API key. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**add_api_key_command** | [**AddApiKeyCommand**](AddApiKeyCommand.md) | | [required] | + +### Return type + +[**models::NewApiKeyResult**](NewApiKeyResult.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_ap_ikey + +> models::SuccessResponseBody delete_ap_ikey(id) +Delete API key. + +Deletes an API key. Deprecated. See: https://grafana.com/docs/grafana/next/administration/api-keys/#migrate-api-keys-to-grafana-service-accounts-using-the-api. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_ap_ikeys + +> Vec get_ap_ikeys(include_expired) +Get auth keys. + +Will return auth keys. Deprecated: true. Deprecated. Please use GET /api/serviceaccounts and GET /api/serviceaccounts/{id}/tokens instead see https://grafana.com/docs/grafana/next/administration/api-keys/#migrate-api-keys-to-grafana-service-accounts-using-the-api. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**include_expired** | Option<**bool**> | Show expired keys | |[default to false] + +### Return type + +[**Vec**](ApiKeyDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/ApiRuleNode.md b/openapi/docs/ApiRuleNode.md new file mode 100755 index 00000000..662fe402 --- /dev/null +++ b/openapi/docs/ApiRuleNode.md @@ -0,0 +1,17 @@ +# ApiRuleNode + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alert** | Option<**String**> | | [optional] +**annotations** | Option<**std::collections::HashMap**> | | [optional] +**expr** | Option<**String**> | | [optional] +**r#for** | Option<**String**> | | [optional] +**keep_firing_for** | Option<**String**> | | [optional] +**labels** | Option<**std::collections::HashMap**> | | [optional] +**record** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Assignments.md b/openapi/docs/Assignments.md new file mode 100755 index 00000000..c5d2f39e --- /dev/null +++ b/openapi/docs/Assignments.md @@ -0,0 +1,14 @@ +# Assignments + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**built_in_roles** | Option<**bool**> | | [optional] +**service_accounts** | Option<**bool**> | | [optional] +**teams** | Option<**bool**> | | [optional] +**users** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/AttributeTypeAndValue.md b/openapi/docs/AttributeTypeAndValue.md new file mode 100755 index 00000000..30c58697 --- /dev/null +++ b/openapi/docs/AttributeTypeAndValue.md @@ -0,0 +1,12 @@ +# AttributeTypeAndValue + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**r#type** | Option<**Vec**> | | [optional] +**value** | Option<[**serde_json::Value**](.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Authorization.md b/openapi/docs/Authorization.md new file mode 100755 index 00000000..a76789b0 --- /dev/null +++ b/openapi/docs/Authorization.md @@ -0,0 +1,13 @@ +# Authorization + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**credentials** | Option<**String**> | | [optional] +**credentials_file** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/BacktestConfig.md b/openapi/docs/BacktestConfig.md new file mode 100755 index 00000000..f5f62403 --- /dev/null +++ b/openapi/docs/BacktestConfig.md @@ -0,0 +1,20 @@ +# BacktestConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotations** | Option<**std::collections::HashMap**> | | [optional] +**condition** | Option<**String**> | | [optional] +**data** | Option<[**Vec**](AlertQuery.md)> | | [optional] +**r#for** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**from** | Option<**String**> | | [optional] +**interval** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**labels** | Option<**std::collections::HashMap**> | | [optional] +**no_data_state** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**to** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/BasicAuth.md b/openapi/docs/BasicAuth.md new file mode 100755 index 00000000..809ac8c3 --- /dev/null +++ b/openapi/docs/BasicAuth.md @@ -0,0 +1,14 @@ +# BasicAuth + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**password** | Option<**String**> | | [optional] +**password_file** | Option<**String**> | | [optional] +**username** | Option<**String**> | | [optional] +**username_file** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CalculateDashboardDiffRequest.md b/openapi/docs/CalculateDashboardDiffRequest.md new file mode 100755 index 00000000..0e93946b --- /dev/null +++ b/openapi/docs/CalculateDashboardDiffRequest.md @@ -0,0 +1,13 @@ +# CalculateDashboardDiffRequest + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**base** | Option<[**models::CalculateDiffTarget**](CalculateDiffTarget.md)> | | [optional] +**diff_type** | Option<**String**> | The type of diff to return Description: `basic` `json` | [optional] +**new** | Option<[**models::CalculateDiffTarget**](CalculateDiffTarget.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CalculateDiffTarget.md b/openapi/docs/CalculateDiffTarget.md new file mode 100755 index 00000000..3d495144 --- /dev/null +++ b/openapi/docs/CalculateDiffTarget.md @@ -0,0 +1,13 @@ +# CalculateDiffTarget + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard_id** | Option<**i64**> | | [optional] +**unsaved_dashboard** | Option<[**serde_json::Value**](.md)> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Certificate.md b/openapi/docs/Certificate.md new file mode 100755 index 00000000..9ce30d32 --- /dev/null +++ b/openapi/docs/Certificate.md @@ -0,0 +1,53 @@ +# Certificate + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**authority_key_id** | Option<**Vec**> | | [optional] +**basic_constraints_valid** | Option<**bool**> | BasicConstraintsValid indicates whether IsCA, MaxPathLen, and MaxPathLenZero are valid. | [optional] +**crl_distribution_points** | Option<**Vec**> | CRL Distribution Points | [optional] +**dns_names** | Option<**Vec**> | Subject Alternate Name values. (Note that these values may not be valid if invalid values were contained within a parsed certificate. For example, an element of DNSNames may not be a valid DNS domain name.) | [optional] +**email_addresses** | Option<**Vec**> | | [optional] +**excluded_dns_domains** | Option<**Vec**> | | [optional] +**excluded_email_addresses** | Option<**Vec**> | | [optional] +**excluded_ip_ranges** | Option<[**Vec**](IPNet.md)> | | [optional] +**excluded_uri_domains** | Option<**Vec**> | | [optional] +**ext_key_usage** | Option<**Vec**> | | [optional] +**extensions** | Option<[**Vec**](Extension.md)> | Extensions contains raw X.509 extensions. When parsing certificates, this can be used to extract non-critical extensions that are not parsed by this package. When marshaling certificates, the Extensions field is ignored, see ExtraExtensions. | [optional] +**extra_extensions** | Option<[**Vec**](Extension.md)> | ExtraExtensions contains extensions to be copied, raw, into any marshaled certificates. Values override any extensions that would otherwise be produced based on the other fields. The ExtraExtensions field is not populated when parsing certificates, see Extensions. | [optional] +**ip_addresses** | Option<**Vec**> | | [optional] +**is_ca** | Option<**bool**> | | [optional] +**issuer** | Option<[**models::Name**](Name.md)> | | [optional] +**issuing_certificate_url** | Option<**Vec**> | | [optional] +**key_usage** | Option<**i64**> | KeyUsage represents the set of actions that are valid for a given key. It's a bitmap of the KeyUsage* constants. | [optional] +**max_path_len** | Option<**i64**> | MaxPathLen and MaxPathLenZero indicate the presence and value of the BasicConstraints' \"pathLenConstraint\". When parsing a certificate, a positive non-zero MaxPathLen means that the field was specified, -1 means it was unset, and MaxPathLenZero being true mean that the field was explicitly set to zero. The case of MaxPathLen==0 with MaxPathLenZero==false should be treated equivalent to -1 (unset). When generating a certificate, an unset pathLenConstraint can be requested with either MaxPathLen == -1 or using the zero value for both MaxPathLen and MaxPathLenZero. | [optional] +**max_path_len_zero** | Option<**bool**> | MaxPathLenZero indicates that BasicConstraintsValid==true and MaxPathLen==0 should be interpreted as an actual maximum path length of zero. Otherwise, that combination is interpreted as MaxPathLen not being set. | [optional] +**not_before** | Option<**String**> | | [optional] +**ocsp_server** | Option<**Vec**> | RFC 5280, 4.2.2.1 (Authority Information Access) | [optional] +**permitted_dns_domains** | Option<**Vec**> | | [optional] +**permitted_dns_domains_critical** | Option<**bool**> | Name constraints | [optional] +**permitted_email_addresses** | Option<**Vec**> | | [optional] +**permitted_ip_ranges** | Option<[**Vec**](IPNet.md)> | | [optional] +**permitted_uri_domains** | Option<**Vec**> | | [optional] +**policy_identifiers** | Option<[**Vec>**](Vec.md)> | | [optional] +**public_key** | Option<[**serde_json::Value**](.md)> | | [optional] +**public_key_algorithm** | Option<**i64**> | | [optional] +**raw** | Option<**Vec**> | | [optional] +**raw_issuer** | Option<**Vec**> | | [optional] +**raw_subject** | Option<**Vec**> | | [optional] +**raw_subject_public_key_info** | Option<**Vec**> | | [optional] +**raw_tbs_certificate** | Option<**Vec**> | | [optional] +**serial_number** | Option<**String**> | | [optional] +**signature** | Option<**Vec**> | | [optional] +**signature_algorithm** | Option<**i64**> | | [optional] +**subject** | Option<[**models::Name**](Name.md)> | | [optional] +**subject_key_id** | Option<**Vec**> | | [optional] +**uris** | Option<[**Vec**](URL.md)> | | [optional] +**unhandled_critical_extensions** | Option<[**Vec>**](Vec.md)> | UnhandledCriticalExtensions contains a list of extension IDs that were not (fully) processed when parsing. Verify will fail if this slice is non-empty, unless verification is delegated to an OS library which understands all the critical extensions. Users can access these extensions using Extensions and can remove elements from this slice if they believe that they have been handled. | [optional] +**unknown_ext_key_usage** | Option<[**Vec>**](Vec.md)> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ChangeUserPasswordCommand.md b/openapi/docs/ChangeUserPasswordCommand.md new file mode 100755 index 00000000..09cc8986 --- /dev/null +++ b/openapi/docs/ChangeUserPasswordCommand.md @@ -0,0 +1,12 @@ +# ChangeUserPasswordCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**new_password** | Option<**String**> | | [optional] +**old_password** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ClearHelpFlags200Response.md b/openapi/docs/ClearHelpFlags200Response.md new file mode 100755 index 00000000..36d7bd5b --- /dev/null +++ b/openapi/docs/ClearHelpFlags200Response.md @@ -0,0 +1,12 @@ +# ClearHelpFlags200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**help_flags1** | Option<**i64**> | | [optional] +**message** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ClusterStatus.md b/openapi/docs/ClusterStatus.md new file mode 100755 index 00000000..4e002522 --- /dev/null +++ b/openapi/docs/ClusterStatus.md @@ -0,0 +1,13 @@ +# ClusterStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | name | [optional] +**peers** | Option<[**Vec**](peerStatus.md)> | peers | [optional] +**status** | **String** | status | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Config.md b/openapi/docs/Config.md new file mode 100755 index 00000000..e4cacf8e --- /dev/null +++ b/openapi/docs/Config.md @@ -0,0 +1,16 @@ +# Config + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**global** | Option<[**models::GlobalConfig**](GlobalConfig.md)> | | [optional] +**inhibit_rules** | Option<[**Vec**](InhibitRule.md)> | | [optional] +**mute_time_intervals** | Option<[**Vec**](MuteTimeInterval.md)> | MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0. | [optional] +**route** | Option<[**models::Route**](Route.md)> | | [optional] +**templates** | Option<**Vec**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeInterval.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ContactPointExport.md b/openapi/docs/ContactPointExport.md new file mode 100755 index 00000000..e6fa0dd2 --- /dev/null +++ b/openapi/docs/ContactPointExport.md @@ -0,0 +1,13 @@ +# ContactPointExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**receivers** | Option<[**Vec**](ReceiverExport.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CookiePreferences.md b/openapi/docs/CookiePreferences.md new file mode 100755 index 00000000..d1830af9 --- /dev/null +++ b/openapi/docs/CookiePreferences.md @@ -0,0 +1,13 @@ +# CookiePreferences + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**analytics** | Option<[**serde_json::Value**](.md)> | | [optional] +**functional** | Option<[**serde_json::Value**](.md)> | | [optional] +**performance** | Option<[**serde_json::Value**](.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Correlation.md b/openapi/docs/Correlation.md new file mode 100755 index 00000000..efd0ffdd --- /dev/null +++ b/openapi/docs/Correlation.md @@ -0,0 +1,18 @@ +# Correlation + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**config** | Option<[**models::CorrelationConfig**](CorrelationConfig.md)> | | [optional] +**description** | Option<**String**> | Description of the correlation | [optional] +**label** | Option<**String**> | Label identifying the correlation | [optional] +**org_id** | Option<**i64**> | OrgID of the data source the correlation originates from | [optional] +**provisioned** | Option<**bool**> | Provisioned True if the correlation was created during provisioning | [optional] +**source_uid** | Option<**String**> | UID of the data source the correlation originates from | [optional] +**target_uid** | Option<**String**> | UID of the data source the correlation points to | [optional] +**uid** | Option<**String**> | Unique identifier of the correlation | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CorrelationConfig.md b/openapi/docs/CorrelationConfig.md new file mode 100755 index 00000000..e4c1010a --- /dev/null +++ b/openapi/docs/CorrelationConfig.md @@ -0,0 +1,14 @@ +# CorrelationConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**field** | **String** | Field used to attach the correlation link | +**target** | [**serde_json::Value**](.md) | Target data query | +**transformations** | Option<[**Vec**](Transformation.md)> | | [optional] +**r#type** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CorrelationConfigUpdateDto.md b/openapi/docs/CorrelationConfigUpdateDto.md new file mode 100755 index 00000000..9375f777 --- /dev/null +++ b/openapi/docs/CorrelationConfigUpdateDto.md @@ -0,0 +1,14 @@ +# CorrelationConfigUpdateDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**field** | Option<**String**> | Field used to attach the correlation link | [optional] +**target** | Option<[**serde_json::Value**](.md)> | Target data query | [optional] +**transformations** | Option<[**Vec**](Transformation.md)> | Source data transformations | [optional] +**r#type** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CorrelationsApi.md b/openapi/docs/CorrelationsApi.md new file mode 100755 index 00000000..16b16146 --- /dev/null +++ b/openapi/docs/CorrelationsApi.md @@ -0,0 +1,189 @@ +# \CorrelationsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_correlation**](CorrelationsApi.md#create_correlation) | **POST** /datasources/uid/{sourceUID}/correlations | Add correlation. +[**delete_correlation**](CorrelationsApi.md#delete_correlation) | **DELETE** /datasources/uid/{uid}/correlations/{correlationUID} | Delete a correlation. +[**get_correlation**](CorrelationsApi.md#get_correlation) | **GET** /datasources/uid/{sourceUID}/correlations/{correlationUID} | Gets a correlation. +[**get_correlations**](CorrelationsApi.md#get_correlations) | **GET** /datasources/correlations | Gets all correlations. +[**get_correlations_by_source_uid**](CorrelationsApi.md#get_correlations_by_source_uid) | **GET** /datasources/uid/{sourceUID}/correlations | Gets all correlations originating from the given data source. +[**update_correlation**](CorrelationsApi.md#update_correlation) | **PATCH** /datasources/uid/{sourceUID}/correlations/{correlationUID} | Updates a correlation. + + + +## create_correlation + +> models::CreateCorrelationResponseBody create_correlation(source_uid, create_correlation_command) +Add correlation. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**source_uid** | **String** | | [required] | +**create_correlation_command** | [**CreateCorrelationCommand**](CreateCorrelationCommand.md) | | [required] | + +### Return type + +[**models::CreateCorrelationResponseBody**](CreateCorrelationResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_correlation + +> models::DeleteCorrelationResponseBody delete_correlation(uid, correlation_uid) +Delete a correlation. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | +**correlation_uid** | **String** | | [required] | + +### Return type + +[**models::DeleteCorrelationResponseBody**](DeleteCorrelationResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_correlation + +> models::Correlation get_correlation(source_uid, correlation_uid) +Gets a correlation. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**source_uid** | **String** | | [required] | +**correlation_uid** | **String** | | [required] | + +### Return type + +[**models::Correlation**](Correlation.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_correlations + +> Vec get_correlations(limit, page, source_uid) +Gets all correlations. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**limit** | Option<**i64**> | Limit the maximum number of correlations to return per page | |[default to 100] +**page** | Option<**i64**> | Page index for starting fetching correlations | |[default to 1] +**source_uid** | Option<[**Vec**](String.md)> | Source datasource UID filter to be applied to correlations | | + +### Return type + +[**Vec**](Correlation.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_correlations_by_source_uid + +> Vec get_correlations_by_source_uid(source_uid) +Gets all correlations originating from the given data source. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**source_uid** | **String** | | [required] | + +### Return type + +[**Vec**](Correlation.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_correlation + +> models::UpdateCorrelationResponseBody update_correlation(source_uid, correlation_uid, update_correlation_command) +Updates a correlation. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**source_uid** | **String** | | [required] | +**correlation_uid** | **String** | | [required] | +**update_correlation_command** | Option<[**UpdateCorrelationCommand**](UpdateCorrelationCommand.md)> | | | + +### Return type + +[**models::UpdateCorrelationResponseBody**](UpdateCorrelationResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/CreateCorrelationCommand.md b/openapi/docs/CreateCorrelationCommand.md new file mode 100755 index 00000000..70fc7594 --- /dev/null +++ b/openapi/docs/CreateCorrelationCommand.md @@ -0,0 +1,15 @@ +# CreateCorrelationCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**config** | Option<[**models::CorrelationConfig**](CorrelationConfig.md)> | | [optional] +**description** | Option<**String**> | Optional description of the correlation | [optional] +**label** | Option<**String**> | Optional label identifying the correlation | [optional] +**provisioned** | Option<**bool**> | True if correlation was created with provisioning. This makes it read-only. | [optional] +**target_uid** | Option<**String**> | Target data source UID to which the correlation is created. required if config.type = query | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateCorrelationResponseBody.md b/openapi/docs/CreateCorrelationResponseBody.md new file mode 100755 index 00000000..c5ab7972 --- /dev/null +++ b/openapi/docs/CreateCorrelationResponseBody.md @@ -0,0 +1,12 @@ +# CreateCorrelationResponseBody + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**message** | Option<**String**> | | [optional] +**result** | Option<[**models::Correlation**](Correlation.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateDashboardSnapshot200Response.md b/openapi/docs/CreateDashboardSnapshot200Response.md new file mode 100755 index 00000000..68c66fa3 --- /dev/null +++ b/openapi/docs/CreateDashboardSnapshot200Response.md @@ -0,0 +1,15 @@ +# CreateDashboardSnapshot200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**delete_key** | Option<**String**> | Unique key used to delete the snapshot. It is different from the key so that only the creator can delete the snapshot. | [optional] +**delete_url** | Option<**String**> | | [optional] +**id** | Option<**i64**> | Snapshot id | [optional] +**key** | Option<**String**> | Unique key | [optional] +**url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateDashboardSnapshotCommand.md b/openapi/docs/CreateDashboardSnapshotCommand.md new file mode 100755 index 00000000..6b7c3809 --- /dev/null +++ b/openapi/docs/CreateDashboardSnapshotCommand.md @@ -0,0 +1,18 @@ +# CreateDashboardSnapshotCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_version** | Option<**String**> | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources +optional | [optional] +**dashboard** | [**models::Unstructured**](Unstructured.md) | | +**delete_key** | Option<**String**> | Unique key used to delete the snapshot. It is different from the `key` so that only the creator can delete the snapshot. Required if `external` is `true`. | [optional] +**expires** | Option<**i64**> | When the snapshot should expire in seconds in seconds. Default is never to expire. | [optional][default to 0] +**external** | Option<**bool**> | these are passed when storing an external snapshot ref Save the snapshot on an external server rather than locally. | [optional][default to false] +**key** | Option<**String**> | Define the unique key. Required if `external` is `true`. | [optional] +**kind** | Option<**String**> | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +optional | [optional] +**name** | Option<**String**> | Snapshot name | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateFolderCommand.md b/openapi/docs/CreateFolderCommand.md new file mode 100755 index 00000000..a62553d3 --- /dev/null +++ b/openapi/docs/CreateFolderCommand.md @@ -0,0 +1,14 @@ +# CreateFolderCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | Option<**String**> | | [optional] +**parent_uid** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateLibraryElementCommand.md b/openapi/docs/CreateLibraryElementCommand.md new file mode 100755 index 00000000..ca5aeae7 --- /dev/null +++ b/openapi/docs/CreateLibraryElementCommand.md @@ -0,0 +1,16 @@ +# CreateLibraryElementCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder_id** | Option<**i64**> | ID of the folder where the library element is stored. Deprecated: use FolderUID instead | [optional] +**folder_uid** | Option<**String**> | UID of the folder where the library element is stored. | [optional] +**kind** | Option<**i64**> | Kind of element to create, Use 1 for library panels or 2 for c. Description: 1 - library panels 2 - library variables | [optional] +**model** | Option<[**serde_json::Value**](.md)> | The JSON model for the library element. | [optional] +**name** | Option<**String**> | Name of the library element. | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateOrUpdateReportConfig.md b/openapi/docs/CreateOrUpdateReportConfig.md new file mode 100755 index 00000000..118d361e --- /dev/null +++ b/openapi/docs/CreateOrUpdateReportConfig.md @@ -0,0 +1,22 @@ +# CreateOrUpdateReportConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboards** | Option<[**Vec**](ReportDashboard.md)> | | [optional] +**enable_csv** | Option<**bool**> | | [optional] +**enable_dashboard_url** | Option<**bool**> | | [optional] +**formats** | Option<**Vec**> | | [optional] +**message** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**options** | Option<[**models::ReportOptions**](ReportOptions.md)> | | [optional] +**recipients** | Option<**String**> | | [optional] +**reply_to** | Option<**String**> | | [optional] +**scale_factor** | Option<**i64**> | | [optional] +**schedule** | Option<[**models::ReportSchedule**](ReportSchedule.md)> | | [optional] +**state** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateOrg200Response.md b/openapi/docs/CreateOrg200Response.md new file mode 100755 index 00000000..a0b13cc7 --- /dev/null +++ b/openapi/docs/CreateOrg200Response.md @@ -0,0 +1,12 @@ +# CreateOrg200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**message** | **String** | Message Message of the created org. | +**org_id** | **i64** | ID Identifier of the created org. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateOrgCommand.md b/openapi/docs/CreateOrgCommand.md new file mode 100755 index 00000000..a892b576 --- /dev/null +++ b/openapi/docs/CreateOrgCommand.md @@ -0,0 +1,11 @@ +# CreateOrgCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreatePlaylistCommand.md b/openapi/docs/CreatePlaylistCommand.md new file mode 100755 index 00000000..0e674ef2 --- /dev/null +++ b/openapi/docs/CreatePlaylistCommand.md @@ -0,0 +1,13 @@ +# CreatePlaylistCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**interval** | Option<**String**> | | [optional] +**items** | Option<[**Vec**](PlaylistItem.md)> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateQueryInQueryHistoryCommand.md b/openapi/docs/CreateQueryInQueryHistoryCommand.md new file mode 100755 index 00000000..f9bf80f6 --- /dev/null +++ b/openapi/docs/CreateQueryInQueryHistoryCommand.md @@ -0,0 +1,12 @@ +# CreateQueryInQueryHistoryCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**datasource_uid** | Option<**String**> | UID of the data source for which are queries stored. | [optional] +**queries** | [**serde_json::Value**](.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateReport200Response.md b/openapi/docs/CreateReport200Response.md new file mode 100755 index 00000000..a34b9dec --- /dev/null +++ b/openapi/docs/CreateReport200Response.md @@ -0,0 +1,12 @@ +# CreateReport200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**message** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateRoleForm.md b/openapi/docs/CreateRoleForm.md new file mode 100755 index 00000000..6b3b7c60 --- /dev/null +++ b/openapi/docs/CreateRoleForm.md @@ -0,0 +1,19 @@ +# CreateRoleForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | Option<**String**> | | [optional] +**display_name** | Option<**String**> | | [optional] +**global** | Option<**bool**> | | [optional] +**group** | Option<**String**> | | [optional] +**hidden** | Option<**bool**> | | [optional] +**name** | Option<**String**> | | [optional] +**permissions** | Option<[**Vec**](Permission.md)> | | [optional] +**uid** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateServiceAccountForm.md b/openapi/docs/CreateServiceAccountForm.md new file mode 100755 index 00000000..aa6bbd2c --- /dev/null +++ b/openapi/docs/CreateServiceAccountForm.md @@ -0,0 +1,13 @@ +# CreateServiceAccountForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**is_disabled** | Option<**bool**> | | [optional] +**name** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateTeam200Response.md b/openapi/docs/CreateTeam200Response.md new file mode 100755 index 00000000..732777f1 --- /dev/null +++ b/openapi/docs/CreateTeam200Response.md @@ -0,0 +1,12 @@ +# CreateTeam200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**message** | Option<**String**> | | [optional] +**team_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/CreateTeamCommand.md b/openapi/docs/CreateTeamCommand.md new file mode 100755 index 00000000..875607fe --- /dev/null +++ b/openapi/docs/CreateTeamCommand.md @@ -0,0 +1,12 @@ +# CreateTeamCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**email** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardAclInfoDto.md b/openapi/docs/DashboardAclInfoDto.md new file mode 100755 index 00000000..4658320b --- /dev/null +++ b/openapi/docs/DashboardAclInfoDto.md @@ -0,0 +1,32 @@ +# DashboardAclInfoDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**created** | Option<**String**> | | [optional] +**dashboard_id** | Option<**i64**> | | [optional] +**folder_id** | Option<**i64**> | Deprecated: use FolderUID instead | [optional] +**folder_uid** | Option<**String**> | | [optional] +**inherited** | Option<**bool**> | | [optional] +**is_folder** | Option<**bool**> | | [optional] +**permission** | Option<**i64**> | | [optional] +**permission_name** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] +**slug** | Option<**String**> | | [optional] +**team** | Option<**String**> | | [optional] +**team_avatar_url** | Option<**String**> | | [optional] +**team_email** | Option<**String**> | | [optional] +**team_id** | Option<**i64**> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**user_avatar_url** | Option<**String**> | | [optional] +**user_email** | Option<**String**> | | [optional] +**user_id** | Option<**i64**> | | [optional] +**user_login** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardAclUpdateItem.md b/openapi/docs/DashboardAclUpdateItem.md new file mode 100755 index 00000000..e4a12f6b --- /dev/null +++ b/openapi/docs/DashboardAclUpdateItem.md @@ -0,0 +1,14 @@ +# DashboardAclUpdateItem + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**permission** | Option<**i64**> | | [optional] +**role** | Option<**String**> | | [optional] +**team_id** | Option<**i64**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardCreateCommand.md b/openapi/docs/DashboardCreateCommand.md new file mode 100755 index 00000000..d271e15e --- /dev/null +++ b/openapi/docs/DashboardCreateCommand.md @@ -0,0 +1,16 @@ +# DashboardCreateCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_version** | Option<**String**> | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources +optional | [optional] +**dashboard** | [**models::Unstructured**](Unstructured.md) | | +**expires** | Option<**i64**> | When the snapshot should expire in seconds in seconds. Default is never to expire. | [optional][default to 0] +**external** | Option<**bool**> | these are passed when storing an external snapshot ref Save the snapshot on an external server rather than locally. | [optional][default to false] +**kind** | Option<**String**> | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +optional | [optional] +**name** | Option<**String**> | Snapshot name | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardFullWithMeta.md b/openapi/docs/DashboardFullWithMeta.md new file mode 100755 index 00000000..b58aa9c3 --- /dev/null +++ b/openapi/docs/DashboardFullWithMeta.md @@ -0,0 +1,12 @@ +# DashboardFullWithMeta + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard** | Option<[**serde_json::Value**](.md)> | | [optional] +**meta** | Option<[**models::DashboardMeta**](DashboardMeta.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardMeta.md b/openapi/docs/DashboardMeta.md new file mode 100755 index 00000000..a392e7b5 --- /dev/null +++ b/openapi/docs/DashboardMeta.md @@ -0,0 +1,37 @@ +# DashboardMeta + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotations_permissions** | Option<[**models::AnnotationPermission**](AnnotationPermission.md)> | | [optional] +**can_admin** | Option<**bool**> | | [optional] +**can_delete** | Option<**bool**> | | [optional] +**can_edit** | Option<**bool**> | | [optional] +**can_save** | Option<**bool**> | | [optional] +**can_star** | Option<**bool**> | | [optional] +**created** | Option<**String**> | | [optional] +**created_by** | Option<**String**> | | [optional] +**expires** | Option<**String**> | | [optional] +**folder_id** | Option<**i64**> | Deprecated: use FolderUID instead | [optional] +**folder_title** | Option<**String**> | | [optional] +**folder_uid** | Option<**String**> | | [optional] +**folder_url** | Option<**String**> | | [optional] +**has_acl** | Option<**bool**> | | [optional] +**is_folder** | Option<**bool**> | | [optional] +**is_snapshot** | Option<**bool**> | | [optional] +**is_starred** | Option<**bool**> | | [optional] +**provisioned** | Option<**bool**> | | [optional] +**provisioned_external_id** | Option<**String**> | | [optional] +**public_dashboard_enabled** | Option<**bool**> | | [optional] +**public_dashboard_uid** | Option<**String**> | | [optional] +**slug** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] +**updated_by** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardPermissionsApi.md b/openapi/docs/DashboardPermissionsApi.md new file mode 100755 index 00000000..23bcbd7c --- /dev/null +++ b/openapi/docs/DashboardPermissionsApi.md @@ -0,0 +1,132 @@ +# \DashboardPermissionsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_dashboard_permissions_list_by_id**](DashboardPermissionsApi.md#get_dashboard_permissions_list_by_id) | **GET** /dashboards/id/{DashboardID}/permissions | Gets all existing permissions for the given dashboard. +[**get_dashboard_permissions_list_by_uid**](DashboardPermissionsApi.md#get_dashboard_permissions_list_by_uid) | **GET** /dashboards/uid/{uid}/permissions | Gets all existing permissions for the given dashboard. +[**update_dashboard_permissions_by_id**](DashboardPermissionsApi.md#update_dashboard_permissions_by_id) | **POST** /dashboards/id/{DashboardID}/permissions | Updates permissions for a dashboard. +[**update_dashboard_permissions_by_uid**](DashboardPermissionsApi.md#update_dashboard_permissions_by_uid) | **POST** /dashboards/uid/{uid}/permissions | Updates permissions for a dashboard. + + + +## get_dashboard_permissions_list_by_id + +> Vec get_dashboard_permissions_list_by_id(dashboard_id) +Gets all existing permissions for the given dashboard. + +Please refer to [updated API](#/dashboard_permissions/getDashboardPermissionsListByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | **i64** | | [required] | + +### Return type + +[**Vec**](DashboardACLInfoDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_dashboard_permissions_list_by_uid + +> Vec get_dashboard_permissions_list_by_uid(uid) +Gets all existing permissions for the given dashboard. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**Vec**](DashboardACLInfoDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_dashboard_permissions_by_id + +> models::SuccessResponseBody update_dashboard_permissions_by_id(dashboard_id, update_dashboard_acl_command) +Updates permissions for a dashboard. + +Please refer to [updated API](#/dashboard_permissions/updateDashboardPermissionsByUID) instead This operation will remove existing permissions if they’re not included in the request. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | **i64** | | [required] | +**update_dashboard_acl_command** | [**UpdateDashboardAclCommand**](UpdateDashboardAclCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_dashboard_permissions_by_uid + +> models::SuccessResponseBody update_dashboard_permissions_by_uid(uid, update_dashboard_acl_command) +Updates permissions for a dashboard. + +This operation will remove existing permissions if they’re not included in the request. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | +**update_dashboard_acl_command** | [**UpdateDashboardAclCommand**](UpdateDashboardAclCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/DashboardPublicApi.md b/openapi/docs/DashboardPublicApi.md new file mode 100755 index 00000000..a8f26a03 --- /dev/null +++ b/openapi/docs/DashboardPublicApi.md @@ -0,0 +1,258 @@ +# \DashboardPublicApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_public_dashboard**](DashboardPublicApi.md#create_public_dashboard) | **POST** /dashboards/uid/{dashboardUid}/public-dashboards | +[**delete_public_dashboard**](DashboardPublicApi.md#delete_public_dashboard) | **DELETE** /dashboards/uid/{dashboardUid}/public-dashboards/{uid} | +[**get_public_annotations**](DashboardPublicApi.md#get_public_annotations) | **GET** /public/dashboards/{accessToken}/annotations | +[**get_public_dashboard**](DashboardPublicApi.md#get_public_dashboard) | **GET** /dashboards/uid/{dashboardUid}/public-dashboards | +[**list_public_dashboards**](DashboardPublicApi.md#list_public_dashboards) | **GET** /dashboards/public-dashboards | +[**query_public_dashboard**](DashboardPublicApi.md#query_public_dashboard) | **POST** /public/dashboards/{accessToken}/panels/{panelId}/query | +[**update_public_dashboard**](DashboardPublicApi.md#update_public_dashboard) | **PATCH** /dashboards/uid/{dashboardUid}/public-dashboards/{uid} | +[**view_public_dashboard**](DashboardPublicApi.md#view_public_dashboard) | **GET** /public/dashboards/{accessToken} | + + + +## create_public_dashboard + +> models::PublicDashboard create_public_dashboard(dashboard_uid, public_dashboard_dto) + + +Create public dashboard for a dashboard + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_uid** | **String** | | [required] | +**public_dashboard_dto** | [**PublicDashboardDto**](PublicDashboardDto.md) | | [required] | + +### Return type + +[**models::PublicDashboard**](PublicDashboard.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_public_dashboard + +> models::SuccessResponseBody delete_public_dashboard(dashboard_uid, uid) + + +Delete public dashboard for a dashboard + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_uid** | **String** | | [required] | +**uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_public_annotations + +> Vec get_public_annotations(access_token) + + +Get annotations for a public dashboard + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**access_token** | **String** | | [required] | + +### Return type + +[**Vec**](AnnotationEvent.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_public_dashboard + +> models::PublicDashboard get_public_dashboard(dashboard_uid) + + +Get public dashboard by dashboardUid + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_uid** | **String** | | [required] | + +### Return type + +[**models::PublicDashboard**](PublicDashboard.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_public_dashboards + +> models::PublicDashboardListResponseWithPagination list_public_dashboards() + + +Get list of public dashboards + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::PublicDashboardListResponseWithPagination**](PublicDashboardListResponseWithPagination.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## query_public_dashboard + +> models::QueryDataResponse query_public_dashboard(access_token, panel_id) + + +Get results for a given panel on a public dashboard + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**access_token** | **String** | | [required] | +**panel_id** | **i64** | | [required] | + +### Return type + +[**models::QueryDataResponse**](QueryDataResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_public_dashboard + +> models::PublicDashboard update_public_dashboard(dashboard_uid, uid, public_dashboard_dto) + + +Update public dashboard for a dashboard + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_uid** | **String** | | [required] | +**uid** | **String** | | [required] | +**public_dashboard_dto** | [**PublicDashboardDto**](PublicDashboardDto.md) | | [required] | + +### Return type + +[**models::PublicDashboard**](PublicDashboard.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## view_public_dashboard + +> models::DashboardFullWithMeta view_public_dashboard(access_token) + + +Get public dashboard for view + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**access_token** | **String** | | [required] | + +### Return type + +[**models::DashboardFullWithMeta**](DashboardFullWithMeta.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/DashboardRedirect.md b/openapi/docs/DashboardRedirect.md new file mode 100755 index 00000000..e494dcb9 --- /dev/null +++ b/openapi/docs/DashboardRedirect.md @@ -0,0 +1,11 @@ +# DashboardRedirect + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**redirect_uri** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardSnapshotDto.md b/openapi/docs/DashboardSnapshotDto.md new file mode 100755 index 00000000..c30f2f62 --- /dev/null +++ b/openapi/docs/DashboardSnapshotDto.md @@ -0,0 +1,17 @@ +# DashboardSnapshotDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**created** | Option<**String**> | | [optional] +**expires** | Option<**String**> | | [optional] +**external** | Option<**bool**> | | [optional] +**external_url** | Option<**String**> | | [optional] +**key** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardTagCloudItem.md b/openapi/docs/DashboardTagCloudItem.md new file mode 100755 index 00000000..df87f75c --- /dev/null +++ b/openapi/docs/DashboardTagCloudItem.md @@ -0,0 +1,12 @@ +# DashboardTagCloudItem + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**count** | Option<**i64**> | | [optional] +**term** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardVersionMeta.md b/openapi/docs/DashboardVersionMeta.md new file mode 100755 index 00000000..a803d324 --- /dev/null +++ b/openapi/docs/DashboardVersionMeta.md @@ -0,0 +1,20 @@ +# DashboardVersionMeta + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**created** | Option<**String**> | | [optional] +**created_by** | Option<**String**> | | [optional] +**dashboard_id** | Option<**i64**> | | [optional] +**data** | Option<[**serde_json::Value**](.md)> | | [optional] +**id** | Option<**i64**> | | [optional] +**message** | Option<**String**> | | [optional] +**parent_version** | Option<**i64**> | | [optional] +**restored_from** | Option<**i64**> | | [optional] +**uid** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DashboardVersionsApi.md b/openapi/docs/DashboardVersionsApi.md new file mode 100755 index 00000000..6d68c03b --- /dev/null +++ b/openapi/docs/DashboardVersionsApi.md @@ -0,0 +1,194 @@ +# \DashboardVersionsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_dashboard_version_by_id**](DashboardVersionsApi.md#get_dashboard_version_by_id) | **GET** /dashboards/id/{DashboardID}/versions/{DashboardVersionID} | Get a specific dashboard version. +[**get_dashboard_version_by_uid**](DashboardVersionsApi.md#get_dashboard_version_by_uid) | **GET** /dashboards/uid/{uid}/versions/{DashboardVersionID} | Get a specific dashboard version using UID. +[**get_dashboard_versions_by_id**](DashboardVersionsApi.md#get_dashboard_versions_by_id) | **GET** /dashboards/id/{DashboardID}/versions | Gets all existing versions for the dashboard. +[**get_dashboard_versions_by_uid**](DashboardVersionsApi.md#get_dashboard_versions_by_uid) | **GET** /dashboards/uid/{uid}/versions | Gets all existing versions for the dashboard using UID. +[**restore_dashboard_version_by_id**](DashboardVersionsApi.md#restore_dashboard_version_by_id) | **POST** /dashboards/id/{DashboardID}/restore | Restore a dashboard to a given dashboard version. +[**restore_dashboard_version_by_uid**](DashboardVersionsApi.md#restore_dashboard_version_by_uid) | **POST** /dashboards/uid/{uid}/restore | Restore a dashboard to a given dashboard version using UID. + + + +## get_dashboard_version_by_id + +> models::DashboardVersionMeta get_dashboard_version_by_id(dashboard_id, dashboard_version_id) +Get a specific dashboard version. + +Please refer to [updated API](#/dashboard_versions/getDashboardVersionByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | **i64** | | [required] | +**dashboard_version_id** | **i64** | | [required] | + +### Return type + +[**models::DashboardVersionMeta**](DashboardVersionMeta.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_dashboard_version_by_uid + +> models::DashboardVersionMeta get_dashboard_version_by_uid(dashboard_version_id, uid) +Get a specific dashboard version using UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_version_id** | **i64** | | [required] | +**uid** | **String** | | [required] | + +### Return type + +[**models::DashboardVersionMeta**](DashboardVersionMeta.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_dashboard_versions_by_id + +> Vec get_dashboard_versions_by_id(dashboard_id) +Gets all existing versions for the dashboard. + +Please refer to [updated API](#/dashboard_versions/getDashboardVersionsByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | **i64** | | [required] | + +### Return type + +[**Vec**](DashboardVersionMeta.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_dashboard_versions_by_uid + +> Vec get_dashboard_versions_by_uid(uid, limit, start) +Gets all existing versions for the dashboard using UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | +**limit** | Option<**i64**> | Maximum number of results to return | |[default to 0] +**start** | Option<**i64**> | Version to start from when returning queries | |[default to 0] + +### Return type + +[**Vec**](DashboardVersionMeta.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## restore_dashboard_version_by_id + +> models::PostDashboard200Response restore_dashboard_version_by_id(dashboard_id, restore_dashboard_version_command) +Restore a dashboard to a given dashboard version. + +Please refer to [updated API](#/dashboard_versions/restoreDashboardVersionByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | **i64** | | [required] | +**restore_dashboard_version_command** | [**RestoreDashboardVersionCommand**](RestoreDashboardVersionCommand.md) | | [required] | + +### Return type + +[**models::PostDashboard200Response**](postDashboard_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## restore_dashboard_version_by_uid + +> models::PostDashboard200Response restore_dashboard_version_by_uid(uid, restore_dashboard_version_command) +Restore a dashboard to a given dashboard version using UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | +**restore_dashboard_version_command** | [**RestoreDashboardVersionCommand**](RestoreDashboardVersionCommand.md) | | [required] | + +### Return type + +[**models::PostDashboard200Response**](postDashboard_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/DashboardsApi.md b/openapi/docs/DashboardsApi.md new file mode 100755 index 00000000..485ee2e0 --- /dev/null +++ b/openapi/docs/DashboardsApi.md @@ -0,0 +1,211 @@ +# \DashboardsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**calculate_dashboard_diff**](DashboardsApi.md#calculate_dashboard_diff) | **POST** /dashboards/calculate-diff | Perform diff on two dashboards. +[**delete_dashboard_by_uid**](DashboardsApi.md#delete_dashboard_by_uid) | **DELETE** /dashboards/uid/{uid} | Delete dashboard by uid. +[**get_dashboard_by_uid**](DashboardsApi.md#get_dashboard_by_uid) | **GET** /dashboards/uid/{uid} | Get dashboard by uid. +[**get_dashboard_tags**](DashboardsApi.md#get_dashboard_tags) | **GET** /dashboards/tags | Get all dashboards tags of an organisation. +[**get_home_dashboard**](DashboardsApi.md#get_home_dashboard) | **GET** /dashboards/home | Get home dashboard. +[**import_dashboard**](DashboardsApi.md#import_dashboard) | **POST** /dashboards/import | Import dashboard. +[**post_dashboard**](DashboardsApi.md#post_dashboard) | **POST** /dashboards/db | Create / Update dashboard + + + +## calculate_dashboard_diff + +> Vec calculate_dashboard_diff(calculate_dashboard_diff_request) +Perform diff on two dashboards. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**calculate_dashboard_diff_request** | [**CalculateDashboardDiffRequest**](CalculateDashboardDiffRequest.md) | | [required] | + +### Return type + +**Vec** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_dashboard_by_uid + +> models::DeleteDashboardByUid200Response delete_dashboard_by_uid(uid) +Delete dashboard by uid. + +Will delete the dashboard given the specified unique identifier (uid). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**models::DeleteDashboardByUid200Response**](deleteDashboardByUID_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_dashboard_by_uid + +> models::DashboardFullWithMeta get_dashboard_by_uid(uid) +Get dashboard by uid. + +Will return the dashboard given the dashboard unique identifier (uid). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**models::DashboardFullWithMeta**](DashboardFullWithMeta.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_dashboard_tags + +> Vec get_dashboard_tags() +Get all dashboards tags of an organisation. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](DashboardTagCloudItem.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_home_dashboard + +> models::GetHomeDashboardResponse get_home_dashboard() +Get home dashboard. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::GetHomeDashboardResponse**](GetHomeDashboardResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## import_dashboard + +> models::ImportDashboardResponse import_dashboard(import_dashboard_request) +Import dashboard. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**import_dashboard_request** | [**ImportDashboardRequest**](ImportDashboardRequest.md) | | [required] | + +### Return type + +[**models::ImportDashboardResponse**](ImportDashboardResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_dashboard + +> models::PostDashboard200Response post_dashboard(save_dashboard_command) +Create / Update dashboard + +Creates a new dashboard or updates an existing dashboard. Note: This endpoint is not intended for creating folders, use `POST /api/folders` for that. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**save_dashboard_command** | [**SaveDashboardCommand**](SaveDashboardCommand.md) | | [required] | + +### Return type + +[**models::PostDashboard200Response**](postDashboard_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/DataLink.md b/openapi/docs/DataLink.md new file mode 100755 index 00000000..374601a5 --- /dev/null +++ b/openapi/docs/DataLink.md @@ -0,0 +1,14 @@ +# DataLink + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**internal** | Option<[**models::InternalDataLink**](InternalDataLink.md)> | | [optional] +**target_blank** | Option<**bool**> | | [optional] +**title** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DataResponse.md b/openapi/docs/DataResponse.md new file mode 100755 index 00000000..50a1ba33 --- /dev/null +++ b/openapi/docs/DataResponse.md @@ -0,0 +1,14 @@ +# DataResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**error** | Option<**String**> | Error is a property to be set if the corresponding DataQuery has an error. | [optional] +**error_source** | Option<**String**> | ErrorSource type defines the source of the error | [optional] +**frames** | Option<[**Vec**](Frame.md)> | It is the main data container within a backend.DataResponse. There should be no `nil` entries in the Frames slice (making them pointers was a mistake). | [optional] +**status** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DataSource.md b/openapi/docs/DataSource.md new file mode 100755 index 00000000..ba8d9bab --- /dev/null +++ b/openapi/docs/DataSource.md @@ -0,0 +1,29 @@ +# DataSource + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access** | Option<**String**> | | [optional] +**access_control** | Option<**std::collections::HashMap**> | Metadata contains user accesses for a given resource Ex: map[string]bool{\"create\":true, \"delete\": true} | [optional] +**basic_auth** | Option<**bool**> | | [optional] +**basic_auth_user** | Option<**String**> | | [optional] +**database** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_default** | Option<**bool**> | | [optional] +**json_data** | Option<[**serde_json::Value**](.md)> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**read_only** | Option<**bool**> | | [optional] +**secure_json_fields** | Option<**std::collections::HashMap**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**type_logo_url** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**user** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] +**with_credentials** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DataSourceListItemDto.md b/openapi/docs/DataSourceListItemDto.md new file mode 100755 index 00000000..cffc37c1 --- /dev/null +++ b/openapi/docs/DataSourceListItemDto.md @@ -0,0 +1,25 @@ +# DataSourceListItemDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access** | Option<**String**> | | [optional] +**basic_auth** | Option<**bool**> | | [optional] +**database** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_default** | Option<**bool**> | | [optional] +**json_data** | Option<[**serde_json::Value**](.md)> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**read_only** | Option<**bool**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**type_logo_url** | Option<**String**> | | [optional] +**type_name** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**user** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DataSourceRef.md b/openapi/docs/DataSourceRef.md new file mode 100755 index 00000000..4bf9b56d --- /dev/null +++ b/openapi/docs/DataSourceRef.md @@ -0,0 +1,12 @@ +# DataSourceRef + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**r#type** | Option<**String**> | The plugin type-id | [optional] +**uid** | Option<**String**> | Specific datasource instance | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DatasourcesApi.md b/openapi/docs/DatasourcesApi.md new file mode 100755 index 00000000..a7c504e5 --- /dev/null +++ b/openapi/docs/DatasourcesApi.md @@ -0,0 +1,664 @@ +# \DatasourcesApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_data_source**](DatasourcesApi.md#add_data_source) | **POST** /datasources | Create a data source. +[**call_datasource_resource_by_id**](DatasourcesApi.md#call_datasource_resource_by_id) | **GET** /datasources/{id}/resources/{datasource_proxy_route} | Fetch data source resources by Id. +[**call_datasource_resource_with_uid**](DatasourcesApi.md#call_datasource_resource_with_uid) | **GET** /datasources/uid/{uid}/resources/{datasource_proxy_route} | Fetch data source resources. +[**check_datasource_health_by_id**](DatasourcesApi.md#check_datasource_health_by_id) | **GET** /datasources/{id}/health | Sends a health check request to the plugin datasource identified by the ID. +[**check_datasource_health_with_uid**](DatasourcesApi.md#check_datasource_health_with_uid) | **GET** /datasources/uid/{uid}/health | Sends a health check request to the plugin datasource identified by the UID. +[**datasource_proxy_delet_ecalls**](DatasourcesApi.md#datasource_proxy_delet_ecalls) | **DELETE** /datasources/proxy/{id}/{datasource_proxy_route} | Data source proxy DELETE calls. +[**datasource_proxy_deleteby_ui_dcalls**](DatasourcesApi.md#datasource_proxy_deleteby_ui_dcalls) | **DELETE** /datasources/proxy/uid/{uid}/{datasource_proxy_route} | Data source proxy DELETE calls. +[**datasource_proxy_ge_tcalls**](DatasourcesApi.md#datasource_proxy_ge_tcalls) | **GET** /datasources/proxy/{id}/{datasource_proxy_route} | Data source proxy GET calls. +[**datasource_proxy_getby_ui_dcalls**](DatasourcesApi.md#datasource_proxy_getby_ui_dcalls) | **GET** /datasources/proxy/uid/{uid}/{datasource_proxy_route} | Data source proxy GET calls. +[**datasource_proxy_pos_tcalls**](DatasourcesApi.md#datasource_proxy_pos_tcalls) | **POST** /datasources/proxy/{id}/{datasource_proxy_route} | Data source proxy POST calls. +[**datasource_proxy_postby_ui_dcalls**](DatasourcesApi.md#datasource_proxy_postby_ui_dcalls) | **POST** /datasources/proxy/uid/{uid}/{datasource_proxy_route} | Data source proxy POST calls. +[**delete_data_source_by_id**](DatasourcesApi.md#delete_data_source_by_id) | **DELETE** /datasources/{id} | Delete an existing data source by id. +[**delete_data_source_by_name**](DatasourcesApi.md#delete_data_source_by_name) | **DELETE** /datasources/name/{name} | Delete an existing data source by name. +[**delete_data_source_by_uid**](DatasourcesApi.md#delete_data_source_by_uid) | **DELETE** /datasources/uid/{uid} | Delete an existing data source by UID. +[**get_data_source_by_id**](DatasourcesApi.md#get_data_source_by_id) | **GET** /datasources/{id} | Get a single data source by Id. +[**get_data_source_by_name**](DatasourcesApi.md#get_data_source_by_name) | **GET** /datasources/name/{name} | Get a single data source by Name. +[**get_data_source_by_uid**](DatasourcesApi.md#get_data_source_by_uid) | **GET** /datasources/uid/{uid} | Get a single data source by UID. +[**get_data_source_id_by_name**](DatasourcesApi.md#get_data_source_id_by_name) | **GET** /datasources/id/{name} | Get data source Id by Name. +[**get_data_sources**](DatasourcesApi.md#get_data_sources) | **GET** /datasources | Get all data sources. +[**update_data_source_by_id**](DatasourcesApi.md#update_data_source_by_id) | **PUT** /datasources/{id} | Update an existing data source by its sequential ID. +[**update_data_source_by_uid**](DatasourcesApi.md#update_data_source_by_uid) | **PUT** /datasources/uid/{uid} | Update an existing data source. + + + +## add_data_source + +> models::AddDataSource200Response add_data_source(add_data_source_command) +Create a data source. + +By defining `password` and `basicAuthPassword` under secureJsonData property Grafana encrypts them securely as an encrypted blob in the database. The response then lists the encrypted fields under secureJsonFields. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:create` + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**add_data_source_command** | [**AddDataSourceCommand**](AddDataSourceCommand.md) | | [required] | + +### Return type + +[**models::AddDataSource200Response**](addDataSource_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## call_datasource_resource_by_id + +> models::SuccessResponseBody call_datasource_resource_by_id(datasource_proxy_route, id) +Fetch data source resources by Id. + +Please refer to [updated API](#/datasources/callDatasourceResourceWithUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**datasource_proxy_route** | **String** | | [required] | +**id** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## call_datasource_resource_with_uid + +> models::SuccessResponseBody call_datasource_resource_with_uid(datasource_proxy_route, uid) +Fetch data source resources. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**datasource_proxy_route** | **String** | | [required] | +**uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## check_datasource_health_by_id + +> models::SuccessResponseBody check_datasource_health_by_id(id) +Sends a health check request to the plugin datasource identified by the ID. + +Please refer to [updated API](#/datasources/checkDatasourceHealthWithUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## check_datasource_health_with_uid + +> models::SuccessResponseBody check_datasource_health_with_uid(uid) +Sends a health check request to the plugin datasource identified by the UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## datasource_proxy_delet_ecalls + +> datasource_proxy_delet_ecalls(id, datasource_proxy_route) +Data source proxy DELETE calls. + +Proxies all calls to the actual data source. Please refer to [updated API](#/datasources/datasourceProxyDELETEByUIDcalls) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **String** | | [required] | +**datasource_proxy_route** | **String** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## datasource_proxy_deleteby_ui_dcalls + +> datasource_proxy_deleteby_ui_dcalls(uid, datasource_proxy_route) +Data source proxy DELETE calls. + +Proxies all calls to the actual data source. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | +**datasource_proxy_route** | **String** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## datasource_proxy_ge_tcalls + +> datasource_proxy_ge_tcalls(datasource_proxy_route, id) +Data source proxy GET calls. + +Proxies all calls to the actual data source. Please refer to [updated API](#/datasources/datasourceProxyGETByUIDcalls) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**datasource_proxy_route** | **String** | | [required] | +**id** | **String** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## datasource_proxy_getby_ui_dcalls + +> datasource_proxy_getby_ui_dcalls(datasource_proxy_route, uid) +Data source proxy GET calls. + +Proxies all calls to the actual data source. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**datasource_proxy_route** | **String** | | [required] | +**uid** | **String** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## datasource_proxy_pos_tcalls + +> datasource_proxy_pos_tcalls(datasource_proxy_route, id, body) +Data source proxy POST calls. + +Proxies all calls to the actual data source. The data source should support POST methods for the specific path and role as defined Please refer to [updated API](#/datasources/datasourceProxyPOSTByUIDcalls) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**datasource_proxy_route** | **String** | | [required] | +**id** | **String** | | [required] | +**body** | Option<**serde_json::Value**> | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## datasource_proxy_postby_ui_dcalls + +> datasource_proxy_postby_ui_dcalls(datasource_proxy_route, uid, body) +Data source proxy POST calls. + +Proxies all calls to the actual data source. The data source should support POST methods for the specific path and role as defined + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**datasource_proxy_route** | **String** | | [required] | +**uid** | **String** | | [required] | +**body** | Option<**serde_json::Value**> | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_data_source_by_id + +> models::SuccessResponseBody delete_data_source_by_id(id) +Delete an existing data source by id. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:delete` and scopes: `datasources:*`, `datasources:id:*` and `datasources:id:1` (single data source). Please refer to [updated API](#/datasources/deleteDataSourceByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_data_source_by_name + +> models::DeleteDataSourceByName200Response delete_data_source_by_name(name) +Delete an existing data source by name. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:delete` and scopes: `datasources:*`, `datasources:name:*` and `datasources:name:test_datasource` (single data source). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | | [required] | + +### Return type + +[**models::DeleteDataSourceByName200Response**](deleteDataSourceByName_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_data_source_by_uid + +> models::SuccessResponseBody delete_data_source_by_uid(uid) +Delete an existing data source by UID. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:delete` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:kLtEtcRGk` (single data source). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_data_source_by_id + +> models::DataSource get_data_source_by_id(id) +Get a single data source by Id. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:id:*` and `datasources:id:1` (single data source). Please refer to [updated API](#/datasources/getDataSourceByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **String** | | [required] | + +### Return type + +[**models::DataSource**](DataSource.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_data_source_by_name + +> models::DataSource get_data_source_by_name(name) +Get a single data source by Name. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:name:*` and `datasources:name:test_datasource` (single data source). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | | [required] | + +### Return type + +[**models::DataSource**](DataSource.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_data_source_by_uid + +> models::DataSource get_data_source_by_uid(uid) +Get a single data source by UID. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:kLtEtcRGk` (single data source). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**models::DataSource**](DataSource.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_data_source_id_by_name + +> models::GetDataSourceIdByName200Response get_data_source_id_by_name(name) +Get data source Id by Name. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:name:*` and `datasources:name:test_datasource` (single data source). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | | [required] | + +### Return type + +[**models::GetDataSourceIdByName200Response**](getDataSourceIdByName_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_data_sources + +> Vec get_data_sources() +Get all data sources. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scope: `datasources:*`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](DataSourceListItemDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_data_source_by_id + +> models::AddDataSource200Response update_data_source_by_id(id, update_data_source_command) +Update an existing data source by its sequential ID. + +Similar to creating a data source, `password` and `basicAuthPassword` should be defined under secureJsonData in order to be stored securely as an encrypted blob in the database. Then, the encrypted fields are listed under secureJsonFields section in the response. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:write` and scopes: `datasources:*`, `datasources:id:*` and `datasources:id:1` (single data source). Please refer to [updated API](#/datasources/updateDataSourceByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **String** | | [required] | +**update_data_source_command** | [**UpdateDataSourceCommand**](UpdateDataSourceCommand.md) | | [required] | + +### Return type + +[**models::AddDataSource200Response**](addDataSource_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_data_source_by_uid + +> models::AddDataSource200Response update_data_source_by_uid(uid, update_data_source_command) +Update an existing data source. + +Similar to creating a data source, `password` and `basicAuthPassword` should be defined under secureJsonData in order to be stored securely as an encrypted blob in the database. Then, the encrypted fields are listed under secureJsonFields section in the response. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:write` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:1` (single data source). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | +**update_data_source_command** | [**UpdateDataSourceCommand**](UpdateDataSourceCommand.md) | | [required] | + +### Return type + +[**models::AddDataSource200Response**](addDataSource_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/DeleteCorrelationResponseBody.md b/openapi/docs/DeleteCorrelationResponseBody.md new file mode 100755 index 00000000..d83c29a3 --- /dev/null +++ b/openapi/docs/DeleteCorrelationResponseBody.md @@ -0,0 +1,11 @@ +# DeleteCorrelationResponseBody + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**message** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DeleteDashboardByUid200Response.md b/openapi/docs/DeleteDashboardByUid200Response.md new file mode 100755 index 00000000..da7e0c25 --- /dev/null +++ b/openapi/docs/DeleteDashboardByUid200Response.md @@ -0,0 +1,13 @@ +# DeleteDashboardByUid200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **i64** | ID Identifier of the deleted dashboard. | +**message** | **String** | Message Message of the deleted dashboard. | +**title** | **String** | Title Title of the deleted dashboard. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DeleteDataSourceByName200Response.md b/openapi/docs/DeleteDataSourceByName200Response.md new file mode 100755 index 00000000..f4e44dbd --- /dev/null +++ b/openapi/docs/DeleteDataSourceByName200Response.md @@ -0,0 +1,12 @@ +# DeleteDataSourceByName200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **i64** | ID Identifier of the deleted data source. | +**message** | **String** | Message Message of the deleted dashboard. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DeleteFolder200Response.md b/openapi/docs/DeleteFolder200Response.md new file mode 100755 index 00000000..e313eeb0 --- /dev/null +++ b/openapi/docs/DeleteFolder200Response.md @@ -0,0 +1,13 @@ +# DeleteFolder200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **i64** | ID Identifier of the deleted folder. | +**message** | **String** | Message Message of the deleted folder. | +**title** | **String** | Title of the deleted folder. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DeleteTokenCommand.md b/openapi/docs/DeleteTokenCommand.md new file mode 100755 index 00000000..a8abb97f --- /dev/null +++ b/openapi/docs/DeleteTokenCommand.md @@ -0,0 +1,11 @@ +# DeleteTokenCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**instance** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Description.md b/openapi/docs/Description.md new file mode 100755 index 00000000..8e36eb51 --- /dev/null +++ b/openapi/docs/Description.md @@ -0,0 +1,12 @@ +# Description + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**assignments** | Option<[**models::Assignments**](Assignments.md)> | | [optional] +**permissions** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DeviceDto.md b/openapi/docs/DeviceDto.md new file mode 100755 index 00000000..78b66cd5 --- /dev/null +++ b/openapi/docs/DeviceDto.md @@ -0,0 +1,17 @@ +# DeviceDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**avatar_url** | Option<**String**> | | [optional] +**client_ip** | Option<**String**> | | [optional] +**created_at** | Option<**String**> | | [optional] +**device_id** | Option<**String**> | | [optional] +**last_seen_at** | Option<**String**> | | [optional] +**updated_at** | Option<**String**> | | [optional] +**user_agent** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DeviceSearchHitDto.md b/openapi/docs/DeviceSearchHitDto.md new file mode 100755 index 00000000..4c21eb26 --- /dev/null +++ b/openapi/docs/DeviceSearchHitDto.md @@ -0,0 +1,16 @@ +# DeviceSearchHitDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**client_ip** | Option<**String**> | | [optional] +**created_at** | Option<**String**> | | [optional] +**device_id** | Option<**String**> | | [optional] +**last_seen_at** | Option<**String**> | | [optional] +**updated_at** | Option<**String**> | | [optional] +**user_agent** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DevicesApi.md b/openapi/docs/DevicesApi.md new file mode 100755 index 00000000..92fd9921 --- /dev/null +++ b/openapi/docs/DevicesApi.md @@ -0,0 +1,60 @@ +# \DevicesApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**list_devices**](DevicesApi.md#list_devices) | **GET** /stats | Lists all devices within the last 30 days +[**search_devices**](DevicesApi.md#search_devices) | **POST** /search | Lists all devices within the last 30 days + + + +## list_devices + +> Vec list_devices() +Lists all devices within the last 30 days + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](deviceDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_devices + +> models::SearchDeviceQueryResult search_devices() +Lists all devices within the last 30 days + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SearchDeviceQueryResult**](SearchDeviceQueryResult.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/DiscordConfig.md b/openapi/docs/DiscordConfig.md new file mode 100755 index 00000000..2e40b39f --- /dev/null +++ b/openapi/docs/DiscordConfig.md @@ -0,0 +1,16 @@ +# DiscordConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**title** | Option<**String**> | | [optional] +**webhook_url** | Option<[**models::Url**](URL.md)> | | [optional] +**webhook_url_file** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DiscoveryBase.md b/openapi/docs/DiscoveryBase.md new file mode 100755 index 00000000..dda1acb8 --- /dev/null +++ b/openapi/docs/DiscoveryBase.md @@ -0,0 +1,13 @@ +# DiscoveryBase + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**error** | Option<**String**> | | [optional] +**error_type** | Option<**String**> | | [optional] +**status** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/DsApi.md b/openapi/docs/DsApi.md new file mode 100755 index 00000000..a4752748 --- /dev/null +++ b/openapi/docs/DsApi.md @@ -0,0 +1,39 @@ +# \DsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**query_metrics_with_expressions**](DsApi.md#query_metrics_with_expressions) | **POST** /ds/query | DataSource query metrics with expressions. + + + +## query_metrics_with_expressions + +> models::QueryDataResponse query_metrics_with_expressions(metric_request) +DataSource query metrics with expressions. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:query`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**metric_request** | [**MetricRequest**](MetricRequest.md) | | [required] | + +### Return type + +[**models::QueryDataResponse**](QueryDataResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/EmailConfig.md b/openapi/docs/EmailConfig.md new file mode 100755 index 00000000..56507d7f --- /dev/null +++ b/openapi/docs/EmailConfig.md @@ -0,0 +1,25 @@ +# EmailConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**auth_identity** | Option<**String**> | | [optional] +**auth_password** | Option<**String**> | | [optional] +**auth_password_file** | Option<**String**> | | [optional] +**auth_secret** | Option<**String**> | | [optional] +**auth_username** | Option<**String**> | | [optional] +**from** | Option<**String**> | | [optional] +**headers** | Option<**std::collections::HashMap**> | | [optional] +**hello** | Option<**String**> | | [optional] +**html** | Option<**String**> | | [optional] +**require_tls** | Option<**bool**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**smarthost** | Option<[**models::HostPort**](HostPort.md)> | | [optional] +**text** | Option<**String**> | | [optional] +**tls_config** | Option<[**models::TlsConfig**](TLSConfig.md)> | | [optional] +**to** | Option<**String**> | Email address to notify. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/EmailDto.md b/openapi/docs/EmailDto.md new file mode 100755 index 00000000..d2a5e54a --- /dev/null +++ b/openapi/docs/EmailDto.md @@ -0,0 +1,12 @@ +# EmailDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**recipient** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/EmbeddedContactPoint.md b/openapi/docs/EmbeddedContactPoint.md new file mode 100755 index 00000000..1d6cddeb --- /dev/null +++ b/openapi/docs/EmbeddedContactPoint.md @@ -0,0 +1,16 @@ +# EmbeddedContactPoint + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**disable_resolve_message** | Option<**bool**> | | [optional] +**name** | Option<**String**> | Name is used as grouping key in the UI. Contact points with the same name will be grouped in the UI. | [optional] +**provenance** | Option<**String**> | | [optional][readonly] +**settings** | [**serde_json::Value**](.md) | | +**r#type** | **String** | | +**uid** | Option<**String**> | UID is the unique identifier of the contact point. The UID can be set by the user. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/EnterpriseApi.md b/openapi/docs/EnterpriseApi.md new file mode 100755 index 00000000..83a6c946 --- /dev/null +++ b/openapi/docs/EnterpriseApi.md @@ -0,0 +1,1651 @@ +# \EnterpriseApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_team_group_api**](EnterpriseApi.md#add_team_group_api) | **POST** /teams/{teamId}/groups | Add External Group. +[**add_team_role**](EnterpriseApi.md#add_team_role) | **POST** /access-control/teams/{teamId}/roles | Add team role. +[**add_user_role**](EnterpriseApi.md#add_user_role) | **POST** /access-control/users/{userId}/roles | Add a user role assignment. +[**admin_provisioning_reload_access_control**](EnterpriseApi.md#admin_provisioning_reload_access_control) | **POST** /admin/provisioning/access-control/reload | You need to have a permission with action `provisioning:reload` with scope `provisioners:accesscontrol`. +[**create_recording_rule**](EnterpriseApi.md#create_recording_rule) | **POST** /recording-rules | Create a recording rule that is then registered and started. +[**create_recording_rule_write_target**](EnterpriseApi.md#create_recording_rule_write_target) | **POST** /recording-rules/writer | Create a remote write target. +[**create_report**](EnterpriseApi.md#create_report) | **POST** /reports | Create a report. +[**create_role**](EnterpriseApi.md#create_role) | **POST** /access-control/roles | Create a new custom role. +[**delete_license_token**](EnterpriseApi.md#delete_license_token) | **DELETE** /licensing/token | Remove license from database. +[**delete_recording_rule**](EnterpriseApi.md#delete_recording_rule) | **DELETE** /recording-rules/{recordingRuleID} | Delete removes the rule from the registry and stops it. +[**delete_recording_rule_write_target**](EnterpriseApi.md#delete_recording_rule_write_target) | **DELETE** /recording-rules/writer | Delete the remote write target. +[**delete_report**](EnterpriseApi.md#delete_report) | **DELETE** /reports/{id} | Delete a report. +[**delete_role**](EnterpriseApi.md#delete_role) | **DELETE** /access-control/roles/{roleUID} | Delete a custom role. +[**get_access_control_status**](EnterpriseApi.md#get_access_control_status) | **GET** /access-control/status | Get status. +[**get_custom_permissions_csv**](EnterpriseApi.md#get_custom_permissions_csv) | **GET** /licensing/custom-permissions-csv | Get custom permissions report in CSV format. +[**get_custom_permissions_report**](EnterpriseApi.md#get_custom_permissions_report) | **GET** /licensing/custom-permissions | Get custom permissions report. +[**get_license_token**](EnterpriseApi.md#get_license_token) | **GET** /licensing/token | Get license token. +[**get_metadata**](EnterpriseApi.md#get_metadata) | **GET** /saml/metadata | It exposes the SP (Grafana's) metadata for the IdP's consumption. +[**get_recording_rule_write_target**](EnterpriseApi.md#get_recording_rule_write_target) | **GET** /recording-rules/writer | Return the prometheus remote write target. +[**get_report**](EnterpriseApi.md#get_report) | **GET** /reports/{id} | Get a report. +[**get_report_settings**](EnterpriseApi.md#get_report_settings) | **GET** /reports/settings | Get settings. +[**get_reports**](EnterpriseApi.md#get_reports) | **GET** /reports | List reports. +[**get_role**](EnterpriseApi.md#get_role) | **GET** /access-control/roles/{roleUID} | Get a role. +[**get_role_assignments**](EnterpriseApi.md#get_role_assignments) | **GET** /access-control/roles/{roleUID}/assignments | Get role assignments. +[**get_saml_logout**](EnterpriseApi.md#get_saml_logout) | **GET** /logout/saml | GetLogout initiates single logout process. +[**get_slo**](EnterpriseApi.md#get_slo) | **GET** /saml/slo | It performs Single Logout (SLO) callback. +[**get_status**](EnterpriseApi.md#get_status) | **GET** /licensing/check | Check license availability. +[**get_sync_status**](EnterpriseApi.md#get_sync_status) | **GET** /admin/ldap-sync-status | Returns the current state of the LDAP background sync integration. +[**get_team_groups_api**](EnterpriseApi.md#get_team_groups_api) | **GET** /teams/{teamId}/groups | Get External Groups. +[**list_recording_rules**](EnterpriseApi.md#list_recording_rules) | **GET** /recording-rules | Lists all rules in the database: active or deleted. +[**list_roles**](EnterpriseApi.md#list_roles) | **GET** /access-control/roles | Get all roles. +[**list_team_roles**](EnterpriseApi.md#list_team_roles) | **GET** /access-control/teams/{teamId}/roles | Get team roles. +[**list_teams_roles**](EnterpriseApi.md#list_teams_roles) | **POST** /access-control/teams/roles/search | List roles assigned to multiple teams. +[**list_user_roles**](EnterpriseApi.md#list_user_roles) | **GET** /access-control/users/{userId}/roles | List roles assigned to a user. +[**list_users_roles**](EnterpriseApi.md#list_users_roles) | **POST** /access-control/users/roles/search | List roles assigned to multiple users. +[**post_acs**](EnterpriseApi.md#post_acs) | **POST** /saml/acs | It performs Assertion Consumer Service (ACS). +[**post_license_token**](EnterpriseApi.md#post_license_token) | **POST** /licensing/token | Create license token. +[**post_renew_license_token**](EnterpriseApi.md#post_renew_license_token) | **POST** /licensing/token/renew | Manually force license refresh. +[**post_slo**](EnterpriseApi.md#post_slo) | **POST** /saml/slo | It performs Single Logout (SLO) callback. +[**refresh_license_stats**](EnterpriseApi.md#refresh_license_stats) | **GET** /licensing/refresh-stats | Refresh license stats. +[**remove_team_group_api_query**](EnterpriseApi.md#remove_team_group_api_query) | **DELETE** /teams/{teamId}/groups | Remove External Group. +[**remove_team_role**](EnterpriseApi.md#remove_team_role) | **DELETE** /access-control/teams/{teamId}/roles/{roleUID} | Remove team role. +[**remove_user_role**](EnterpriseApi.md#remove_user_role) | **DELETE** /access-control/users/{userId}/roles/{roleUID} | Remove a user role assignment. +[**render_report_pdfs**](EnterpriseApi.md#render_report_pdfs) | **GET** /reports/render/pdfs | Render report for multiple dashboards. +[**save_report_settings**](EnterpriseApi.md#save_report_settings) | **POST** /reports/settings | Save settings. +[**search_result**](EnterpriseApi.md#search_result) | **POST** /access-control/assignments/search | Debug permissions. +[**send_report**](EnterpriseApi.md#send_report) | **POST** /reports/email | Send a report. +[**send_test_email**](EnterpriseApi.md#send_test_email) | **POST** /reports/test-email | Send test report via email. +[**set_role_assignments**](EnterpriseApi.md#set_role_assignments) | **PUT** /access-control/roles/{roleUID}/assignments | Set role assignments. +[**set_team_roles**](EnterpriseApi.md#set_team_roles) | **PUT** /access-control/teams/{teamId}/roles | Update team role. +[**set_user_roles**](EnterpriseApi.md#set_user_roles) | **PUT** /access-control/users/{userId}/roles | Set user role assignments. +[**test_create_recording_rule**](EnterpriseApi.md#test_create_recording_rule) | **POST** /recording-rules/test | Test a recording rule. +[**update_recording_rule**](EnterpriseApi.md#update_recording_rule) | **PUT** /recording-rules | Update the active status of a rule. +[**update_report**](EnterpriseApi.md#update_report) | **PUT** /reports/{id} | Update a report. +[**update_role**](EnterpriseApi.md#update_role) | **PUT** /access-control/roles/{roleUID} | Update a custom role. + + + +## add_team_group_api + +> models::SuccessResponseBody add_team_group_api(team_id, team_group_mapping) +Add External Group. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | +**team_group_mapping** | [**TeamGroupMapping**](TeamGroupMapping.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## add_team_role + +> models::SuccessResponseBody add_team_role(team_id, add_team_role_command) +Add team role. + +You need to have a permission with action `teams.roles:add` and scope `permissions:type:delegate`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | +**add_team_role_command** | [**AddTeamRoleCommand**](AddTeamRoleCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## add_user_role + +> models::SuccessResponseBody add_user_role(user_id, add_user_role_command) +Add a user role assignment. + +Assign a role to a specific user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:add` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only assign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign a role which will allow to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**add_user_role_command** | [**AddUserRoleCommand**](AddUserRoleCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## admin_provisioning_reload_access_control + +> models::ErrorResponseBody admin_provisioning_reload_access_control() +You need to have a permission with action `provisioning:reload` with scope `provisioners:accesscontrol`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ErrorResponseBody**](ErrorResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_recording_rule + +> models::RecordingRuleJson create_recording_rule(recording_rule_json) +Create a recording rule that is then registered and started. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_json** | [**RecordingRuleJson**](RecordingRuleJson.md) | | [required] | + +### Return type + +[**models::RecordingRuleJson**](RecordingRuleJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_recording_rule_write_target + +> models::PrometheusRemoteWriteTargetJson create_recording_rule_write_target(prometheus_remote_write_target_json) +Create a remote write target. + +It returns a 422 if there is not an existing prometheus data source configured. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**prometheus_remote_write_target_json** | [**PrometheusRemoteWriteTargetJson**](PrometheusRemoteWriteTargetJson.md) | | [required] | + +### Return type + +[**models::PrometheusRemoteWriteTargetJson**](PrometheusRemoteWriteTargetJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_report + +> models::CreateReport200Response create_report(create_or_update_report_config) +Create a report. + +Available to org admins only and with a valid license. You need to have a permission with action `reports.admin:create`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_or_update_report_config** | [**CreateOrUpdateReportConfig**](CreateOrUpdateReportConfig.md) | | [required] | + +### Return type + +[**models::CreateReport200Response**](createReport_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_role + +> models::RoleDto create_role(create_role_form) +Create a new custom role. + +Creates a new custom role and maps given permissions to that role. Note that roles with the same prefix as Fixed Roles can’t be created. You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to create a custom role which allows to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_role_form** | [**CreateRoleForm**](CreateRoleForm.md) | | [required] | + +### Return type + +[**models::RoleDto**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_license_token + +> models::ErrorResponseBody delete_license_token(delete_token_command) +Remove license from database. + +Removes the license stored in the Grafana database. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:delete`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**delete_token_command** | [**DeleteTokenCommand**](DeleteTokenCommand.md) | | [required] | + +### Return type + +[**models::ErrorResponseBody**](ErrorResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_recording_rule + +> models::SuccessResponseBody delete_recording_rule(recording_rule_id) +Delete removes the rule from the registry and stops it. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_recording_rule_write_target + +> models::SuccessResponseBody delete_recording_rule_write_target() +Delete the remote write target. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_report + +> models::SuccessResponseBody delete_report(id) +Delete a report. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.delete` with scope `reports:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_role + +> models::SuccessResponseBody delete_role(role_uid, force, global) +Delete a custom role. + +Delete a role with the given UID, and it’s permissions. If the role is assigned to a built-in role, the deletion operation will fail, unless force query param is set to true, and in that case all assignments will also be deleted. You need to have a permission with action `roles:delete` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only delete a custom role with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to delete a custom role which allows to do that. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**force** | Option<**bool**> | | | +**global** | Option<**bool**> | | | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_access_control_status + +> i64 get_access_control_status() +Get status. + +Returns an indicator to check if fine-grained access control is enabled or not. You need to have a permission with action `status:accesscontrol` and scope `services:accesscontrol`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**i64** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_custom_permissions_csv + +> get_custom_permissions_csv() +Get custom permissions report in CSV format. + +You need to have a permission with action `licensing.reports:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_custom_permissions_report + +> get_custom_permissions_report() +Get custom permissions report. + +You need to have a permission with action `licensing.reports:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_license_token + +> models::Token get_license_token() +Get license token. + +You need to have a permission with action `licensing:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::Token**](Token.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_metadata + +> Vec get_metadata() +It exposes the SP (Grafana's) metadata for the IdP's consumption. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**Vec** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_recording_rule_write_target + +> models::PrometheusRemoteWriteTargetJson get_recording_rule_write_target() +Return the prometheus remote write target. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::PrometheusRemoteWriteTargetJson**](PrometheusRemoteWriteTargetJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_report + +> models::Report get_report(id) +Get a report. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **i64** | | [required] | + +### Return type + +[**models::Report**](Report.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_report_settings + +> models::ReportSettings get_report_settings() +Get settings. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:read`x. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ReportSettings**](ReportSettings.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_reports + +> Vec get_reports() +List reports. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:*`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](Report.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_role + +> models::RoleDto get_role(role_uid) +Get a role. + +Get a role for the given UID. You need to have a permission with action `roles:read` and scope `roles:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | + +### Return type + +[**models::RoleDto**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_role_assignments + +> models::RoleAssignmentsDto get_role_assignments(role_uid) +Get role assignments. + +Get role assignments for the role with the given UID. You need to have a permission with action `teams.roles:list` and scope `teams:id:*` and `users.roles:list` and scope `users:id:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | + +### Return type + +[**models::RoleAssignmentsDto**](RoleAssignmentsDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_saml_logout + +> get_saml_logout() +GetLogout initiates single logout process. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_slo + +> get_slo() +It performs Single Logout (SLO) callback. + +There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_status + +> get_status() +Check license availability. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_sync_status + +> models::ActiveSyncStatusDto get_sync_status() +Returns the current state of the LDAP background sync integration. + +You need to have a permission with action `ldap.status:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ActiveSyncStatusDto**](ActiveSyncStatusDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_team_groups_api + +> Vec get_team_groups_api(team_id) +Get External Groups. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | + +### Return type + +[**Vec**](TeamGroupDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_recording_rules + +> Vec list_recording_rules() +Lists all rules in the database: active or deleted. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](RecordingRuleJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_roles + +> Vec list_roles(delegatable) +Get all roles. + +Gets all existing roles. The response contains all global and organization local roles, for the organization which user is signed in. You need to have a permission with action `roles:read` and scope `roles:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**delegatable** | Option<**bool**> | | | + +### Return type + +[**Vec**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_team_roles + +> models::SuccessResponseBody list_team_roles(team_id) +Get team roles. + +You need to have a permission with action `teams.roles:read` and scope `teams:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_teams_roles + +> std::collections::HashMap> list_teams_roles(roles_search_query) +List roles assigned to multiple teams. + +Lists the roles that have been directly assigned to the given teams. You need to have a permission with action `teams.roles:read` and scope `teams:id:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**roles_search_query** | [**RolesSearchQuery**](RolesSearchQuery.md) | | [required] | + +### Return type + +[**std::collections::HashMap>**](Vec.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_user_roles + +> Vec list_user_roles(user_id) +List roles assigned to a user. + +Lists the roles that have been directly assigned to a given user. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**Vec**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_users_roles + +> std::collections::HashMap> list_users_roles(roles_search_query) +List roles assigned to multiple users. + +Lists the roles that have been directly assigned to the given users. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**roles_search_query** | [**RolesSearchQuery**](RolesSearchQuery.md) | | [required] | + +### Return type + +[**std::collections::HashMap>**](Vec.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_acs + +> post_acs(relay_state) +It performs Assertion Consumer Service (ACS). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**relay_state** | Option<**String**> | | | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_license_token + +> models::Token post_license_token(delete_token_command) +Create license token. + +You need to have a permission with action `licensing:update`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**delete_token_command** | [**DeleteTokenCommand**](DeleteTokenCommand.md) | | [required] | + +### Return type + +[**models::Token**](Token.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_renew_license_token + +> post_renew_license_token(body) +Manually force license refresh. + +Manually ask license issuer for a new token. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:update`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**body** | **serde_json::Value** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_slo + +> post_slo(saml_request, saml_response) +It performs Single Logout (SLO) callback. + +There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**saml_request** | Option<**String**> | | | +**saml_response** | Option<**String**> | | | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## refresh_license_stats + +> models::ActiveUserStats refresh_license_stats() +Refresh license stats. + +You need to have a permission with action `licensing:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ActiveUserStats**](ActiveUserStats.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_team_group_api_query + +> models::SuccessResponseBody remove_team_group_api_query(team_id, group_id) +Remove External Group. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | +**group_id** | Option<**String**> | | | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_team_role + +> models::SuccessResponseBody remove_team_role(role_uid, team_id) +Remove team role. + +You need to have a permission with action `teams.roles:remove` and scope `permissions:type:delegate`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**team_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_user_role + +> models::SuccessResponseBody remove_user_role(role_uid, user_id, global) +Remove a user role assignment. + +Revoke a role from a user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:remove` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to unassign a role which will allow to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**user_id** | **i64** | | [required] | +**global** | Option<**bool**> | A flag indicating if the assignment is global or not. If set to false, the default org ID of the authenticated user will be used from the request to remove assignment. | | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## render_report_pdfs + +> Vec render_report_pdfs(dashboard_id, orientation, layout, title, scale_factor, include_tables) +Render report for multiple dashboards. + +Available to all users and with a valid license. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | Option<**String**> | | | +**orientation** | Option<**String**> | | | +**layout** | Option<**String**> | | | +**title** | Option<**String**> | | | +**scale_factor** | Option<**String**> | | | +**include_tables** | Option<**String**> | | | + +### Return type + +**Vec** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## save_report_settings + +> models::SuccessResponseBody save_report_settings(report_settings) +Save settings. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:write`xx. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**report_settings** | [**ReportSettings**](ReportSettings.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_result + +> models::SearchResult search_result() +Debug permissions. + +Returns the result of the search through access-control role assignments. You need to have a permission with action `teams.roles:read` on scope `teams:*` and a permission with action `users.roles:read` on scope `users:*`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SearchResult**](SearchResult.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## send_report + +> models::SuccessResponseBody send_report(report_email) +Send a report. + +Generate and send a report. This API waits for the report to be generated before returning. We recommend that you set the client’s timeout to at least 60 seconds. Available to org admins only and with a valid license. Only available in Grafana Enterprise v7.0+. This API endpoint is experimental and may be deprecated in a future release. On deprecation, a migration strategy will be provided and the endpoint will remain functional until the next major release of Grafana. You need to have a permission with action `reports:send`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**report_email** | [**ReportEmail**](ReportEmail.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## send_test_email + +> models::SuccessResponseBody send_test_email(create_or_update_report_config) +Send test report via email. + +Available to org admins only and with a valid license. You need to have a permission with action `reports:send`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_or_update_report_config** | [**CreateOrUpdateReportConfig**](CreateOrUpdateReportConfig.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_role_assignments + +> models::RoleAssignmentsDto set_role_assignments(role_uid, set_role_assignments_command) +Set role assignments. + +Set role assignments for the role with the given UID. You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate`, and `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**set_role_assignments_command** | [**SetRoleAssignmentsCommand**](SetRoleAssignmentsCommand.md) | | [required] | + +### Return type + +[**models::RoleAssignmentsDto**](RoleAssignmentsDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_team_roles + +> models::SuccessResponseBody set_team_roles(team_id) +Update team role. + +You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate` for each. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_user_roles + +> models::SuccessResponseBody set_user_roles(user_id, set_user_roles_command) +Set user role assignments. + +Update the user’s role assignments to match the provided set of UIDs. This will remove any assigned roles that aren’t in the request and add roles that are in the set but are not already assigned to the user. If you want to add or remove a single role, consider using Add a user role assignment or Remove a user role assignment instead. You need to have a permission with action `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate` for each. `permissions:type:delegate` scope ensures that users can only assign or unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign or unassign a role which will allow to do that. This is done to prevent escalation of privileges. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**set_user_roles_command** | [**SetUserRolesCommand**](SetUserRolesCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## test_create_recording_rule + +> models::SuccessResponseBody test_create_recording_rule(recording_rule_json) +Test a recording rule. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_json** | [**RecordingRuleJson**](RecordingRuleJson.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_recording_rule + +> models::RecordingRuleJson update_recording_rule(recording_rule_json) +Update the active status of a rule. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_json** | [**RecordingRuleJson**](RecordingRuleJson.md) | | [required] | + +### Return type + +[**models::RecordingRuleJson**](RecordingRuleJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_report + +> models::SuccessResponseBody update_report(id, create_or_update_report_config) +Update a report. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.admin:write` with scope `reports:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **i64** | | [required] | +**create_or_update_report_config** | [**CreateOrUpdateReportConfig**](CreateOrUpdateReportConfig.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_role + +> models::RoleDto update_role(role_uid, update_role_command) +Update a custom role. + +You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**role_uid** | **String** | | [required] | +**update_role_command** | [**UpdateRoleCommand**](UpdateRoleCommand.md) | | [required] | + +### Return type + +[**models::RoleDto**](RoleDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/EnumFieldConfig.md b/openapi/docs/EnumFieldConfig.md new file mode 100755 index 00000000..1e711718 --- /dev/null +++ b/openapi/docs/EnumFieldConfig.md @@ -0,0 +1,14 @@ +# EnumFieldConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**color** | Option<**Vec**> | Color is the color value for a given index (empty is undefined) | [optional] +**description** | Option<**Vec**> | Description of the enum state | [optional] +**icon** | Option<**Vec**> | Icon supports setting an icon for a given index value | [optional] +**text** | Option<**Vec**> | Value is the string display value for a given index | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ErrorResponseBody.md b/openapi/docs/ErrorResponseBody.md new file mode 100755 index 00000000..6ec6c14a --- /dev/null +++ b/openapi/docs/ErrorResponseBody.md @@ -0,0 +1,13 @@ +# ErrorResponseBody + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**error** | Option<**String**> | Error An optional detailed description of the actual error. Only included if running in developer mode. | [optional] +**message** | **String** | a human readable version of the error | +**status** | Option<**String**> | Status An optional status to denote the cause of the error. For example, a 412 Precondition Failed error may include additional information of why that error happened. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/EvalAlertConditionCommand.md b/openapi/docs/EvalAlertConditionCommand.md new file mode 100755 index 00000000..35d08953 --- /dev/null +++ b/openapi/docs/EvalAlertConditionCommand.md @@ -0,0 +1,13 @@ +# EvalAlertConditionCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**condition** | Option<**String**> | | [optional] +**data** | Option<[**Vec**](AlertQuery.md)> | | [optional] +**now** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/EvalQueriesPayload.md b/openapi/docs/EvalQueriesPayload.md new file mode 100755 index 00000000..8ee30b04 --- /dev/null +++ b/openapi/docs/EvalQueriesPayload.md @@ -0,0 +1,13 @@ +# EvalQueriesPayload + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**condition** | Option<**String**> | | [optional] +**data** | Option<[**Vec**](AlertQuery.md)> | | [optional] +**now** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ExtendedReceiver.md b/openapi/docs/ExtendedReceiver.md new file mode 100755 index 00000000..527c783f --- /dev/null +++ b/openapi/docs/ExtendedReceiver.md @@ -0,0 +1,19 @@ +# ExtendedReceiver + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**email_configs** | Option<[**models::EmailConfig**](EmailConfig.md)> | | [optional] +**grafana_managed_receiver** | Option<[**models::PostableGrafanaReceiver**](PostableGrafanaReceiver.md)> | | [optional] +**opsgenie_configs** | Option<[**models::OpsGenieConfig**](OpsGenieConfig.md)> | | [optional] +**pagerduty_configs** | Option<[**models::PagerdutyConfig**](PagerdutyConfig.md)> | | [optional] +**pushover_configs** | Option<[**models::PushoverConfig**](PushoverConfig.md)> | | [optional] +**slack_configs** | Option<[**models::SlackConfig**](SlackConfig.md)> | | [optional] +**victorops_configs** | Option<[**models::VictorOpsConfig**](VictorOpsConfig.md)> | | [optional] +**webhook_configs** | Option<[**models::WebhookConfig**](WebhookConfig.md)> | | [optional] +**wechat_configs** | Option<[**models::WechatConfig**](WechatConfig.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Extension.md b/openapi/docs/Extension.md new file mode 100755 index 00000000..8cbb1346 --- /dev/null +++ b/openapi/docs/Extension.md @@ -0,0 +1,13 @@ +# Extension + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**critical** | Option<**bool**> | | [optional] +**id** | Option<**Vec**> | | [optional] +**value** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FailedUser.md b/openapi/docs/FailedUser.md new file mode 100755 index 00000000..fca78021 --- /dev/null +++ b/openapi/docs/FailedUser.md @@ -0,0 +1,12 @@ +# FailedUser + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**error** | Option<**String**> | | [optional] +**login** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Field.md b/openapi/docs/Field.md new file mode 100755 index 00000000..99e82003 --- /dev/null +++ b/openapi/docs/Field.md @@ -0,0 +1,13 @@ +# Field + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**config** | Option<[**models::FieldConfig**](FieldConfig.md)> | | [optional] +**labels** | Option<**std::collections::HashMap**> | Labels are used to add metadata to an object. The JSON will always be sorted keys | [optional] +**name** | Option<**String**> | Name is default identifier of the field. The name does not have to be unique, but the combination of name and Labels should be unique for proper behavior in all situations. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FieldConfig.md b/openapi/docs/FieldConfig.md new file mode 100755 index 00000000..d3a37fcf --- /dev/null +++ b/openapi/docs/FieldConfig.md @@ -0,0 +1,28 @@ +# FieldConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**color** | Option<[**serde_json::Value**](.md)> | Map values to a display color NOTE: this interface is under development in the frontend... so simple map for now | [optional] +**custom** | Option<[**serde_json::Value**](.md)> | Panel Specific Values | [optional] +**decimals** | Option<**i32**> | | [optional] +**description** | Option<**String**> | Description is human readable field metadata | [optional] +**display_name** | Option<**String**> | DisplayName overrides Grafana default naming, should not be used from a data source | [optional] +**display_name_from_ds** | Option<**String**> | DisplayNameFromDS overrides Grafana default naming strategy. | [optional] +**filterable** | Option<**bool**> | Filterable indicates if the Field's data can be filtered by additional calls. | [optional] +**interval** | Option<**f64**> | Interval indicates the expected regular step between values in the series. When an interval exists, consumers can identify \"missing\" values when the expected value is not present. The grafana timeseries visualization will render disconnected values when missing values are found it the time field. The interval uses the same units as the values. For time.Time, this is defined in milliseconds. | [optional] +**links** | Option<[**Vec**](DataLink.md)> | The behavior when clicking on a result | [optional] +**mappings** | Option<[**Vec**](serde_json::Value.md)> | | [optional] +**max** | Option<**f64**> | ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. | [optional] +**min** | Option<**f64**> | ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. | [optional] +**no_value** | Option<**String**> | Alternative to empty string | [optional] +**path** | Option<**String**> | Path is an explicit path to the field in the datasource. When the frame meta includes a path, this will default to `${frame.meta.path}/${field.name} When defined, this value can be used as an identifier within the datasource scope, and may be used as an identifier to update values in a subsequent request | [optional] +**thresholds** | Option<[**models::ThresholdsConfig**](ThresholdsConfig.md)> | | [optional] +**r#type** | Option<[**models::FieldTypeConfig**](FieldTypeConfig.md)> | | [optional] +**unit** | Option<**String**> | Numeric Options | [optional] +**writeable** | Option<**bool**> | Writeable indicates that the datasource knows how to update this value | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FieldTypeConfig.md b/openapi/docs/FieldTypeConfig.md new file mode 100755 index 00000000..dd3d6553 --- /dev/null +++ b/openapi/docs/FieldTypeConfig.md @@ -0,0 +1,11 @@ +# FieldTypeConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**r#enum** | Option<[**models::EnumFieldConfig**](EnumFieldConfig.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FindTagsResult.md b/openapi/docs/FindTagsResult.md new file mode 100755 index 00000000..00807b13 --- /dev/null +++ b/openapi/docs/FindTagsResult.md @@ -0,0 +1,11 @@ +# FindTagsResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**tags** | Option<[**Vec**](TagsDTO.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FloatHistogram.md b/openapi/docs/FloatHistogram.md new file mode 100755 index 00000000..691f21e6 --- /dev/null +++ b/openapi/docs/FloatHistogram.md @@ -0,0 +1,18 @@ +# FloatHistogram + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**count** | Option<**f64**> | Total number of observations. Must be zero or positive. | [optional] +**counter_reset_hint** | Option<**i32**> | or alternatively that we are dealing with a gauge histogram, where counter resets do not apply. | [optional] +**positive_buckets** | Option<**Vec**> | Observation counts in buckets. Each represents an absolute count and must be zero or positive. | [optional] +**positive_spans** | Option<[**Vec**](Span.md)> | Spans for positive and negative buckets (see Span below). | [optional] +**schema** | Option<**i32**> | Currently valid schema numbers are -4 <= n <= 8. They are all for base-2 bucket schemas, where 1 is a bucket boundary in each case, and then each power of two is divided into 2^n logarithmic buckets. Or in other words, each bucket boundary is the previous boundary times 2^(2^-n). | [optional] +**sum** | Option<**f64**> | Sum of observations. This is also used as the stale marker. | [optional] +**zero_count** | Option<**f64**> | Observations falling into the zero bucket. Must be zero or positive. | [optional] +**zero_threshold** | Option<**f64**> | Width of the zero bucket. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Folder.md b/openapi/docs/Folder.md new file mode 100755 index 00000000..870530ed --- /dev/null +++ b/openapi/docs/Folder.md @@ -0,0 +1,28 @@ +# Folder + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_control** | Option<**std::collections::HashMap**> | Metadata contains user accesses for a given resource Ex: map[string]bool{\"create\":true, \"delete\": true} | [optional] +**can_admin** | Option<**bool**> | | [optional] +**can_delete** | Option<**bool**> | | [optional] +**can_edit** | Option<**bool**> | | [optional] +**can_save** | Option<**bool**> | | [optional] +**created** | Option<**String**> | | [optional] +**created_by** | Option<**String**> | | [optional] +**has_acl** | Option<**bool**> | | [optional] +**id** | Option<**i64**> | Deprecated: use UID instead | [optional] +**org_id** | Option<**i64**> | | [optional] +**parent_uid** | Option<**String**> | only used if nested folders are enabled | [optional] +**parents** | Option<[**Vec**](Folder.md)> | the parent folders starting from the root going down | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] +**updated_by** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FolderPermissionsApi.md b/openapi/docs/FolderPermissionsApi.md new file mode 100755 index 00000000..91ad5dfb --- /dev/null +++ b/openapi/docs/FolderPermissionsApi.md @@ -0,0 +1,67 @@ +# \FolderPermissionsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_folder_permission_list**](FolderPermissionsApi.md#get_folder_permission_list) | **GET** /folders/{folder_uid}/permissions | Gets all existing permissions for the folder with the given `uid`. +[**update_folder_permissions**](FolderPermissionsApi.md#update_folder_permissions) | **POST** /folders/{folder_uid}/permissions | Updates permissions for a folder. This operation will remove existing permissions if they’re not included in the request. + + + +## get_folder_permission_list + +> Vec get_folder_permission_list(folder_uid) +Gets all existing permissions for the folder with the given `uid`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | + +### Return type + +[**Vec**](DashboardACLInfoDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_folder_permissions + +> models::SuccessResponseBody update_folder_permissions(folder_uid, update_dashboard_acl_command) +Updates permissions for a folder. This operation will remove existing permissions if they’re not included in the request. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**update_dashboard_acl_command** | [**UpdateDashboardAclCommand**](UpdateDashboardAclCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/FolderSearchHit.md b/openapi/docs/FolderSearchHit.md new file mode 100755 index 00000000..f040753e --- /dev/null +++ b/openapi/docs/FolderSearchHit.md @@ -0,0 +1,14 @@ +# FolderSearchHit + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**parent_uid** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FoldersApi.md b/openapi/docs/FoldersApi.md new file mode 100755 index 00000000..fa21500d --- /dev/null +++ b/openapi/docs/FoldersApi.md @@ -0,0 +1,254 @@ +# \FoldersApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_folder**](FoldersApi.md#create_folder) | **POST** /folders | Create folder. +[**delete_folder**](FoldersApi.md#delete_folder) | **DELETE** /folders/{folder_uid} | Delete folder. +[**get_folder_by_id**](FoldersApi.md#get_folder_by_id) | **GET** /folders/id/{folder_id} | Get folder by id. +[**get_folder_by_uid**](FoldersApi.md#get_folder_by_uid) | **GET** /folders/{folder_uid} | Get folder by uid. +[**get_folder_descendant_counts**](FoldersApi.md#get_folder_descendant_counts) | **GET** /folders/{folder_uid}/counts | Gets the count of each descendant of a folder by kind. The folder is identified by UID. +[**get_folders**](FoldersApi.md#get_folders) | **GET** /folders | Get all folders. +[**move_folder**](FoldersApi.md#move_folder) | **POST** /folders/{folder_uid}/move | Move folder. +[**update_folder**](FoldersApi.md#update_folder) | **PUT** /folders/{folder_uid} | Update folder. + + + +## create_folder + +> models::Folder create_folder(create_folder_command) +Create folder. + +If nested folders are enabled then it additionally expects the parent folder UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_folder_command** | [**CreateFolderCommand**](CreateFolderCommand.md) | | [required] | + +### Return type + +[**models::Folder**](Folder.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_folder + +> models::DeleteFolder200Response delete_folder(folder_uid, force_delete_rules) +Delete folder. + +Deletes an existing folder identified by UID along with all dashboards (and their alerts) stored in the folder. This operation cannot be reverted. If nested folders are enabled then it also deletes all the subfolders. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**force_delete_rules** | Option<**bool**> | If `true` any Grafana 8 Alerts under this folder will be deleted. Set to `false` so that the request will fail if the folder contains any Grafana 8 Alerts. | |[default to false] + +### Return type + +[**models::DeleteFolder200Response**](deleteFolder_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_folder_by_id + +> models::Folder get_folder_by_id(folder_id) +Get folder by id. + +Returns the folder identified by id. This is deprecated. Please refer to [updated API](#/folders/getFolderByUID) instead + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_id** | **i64** | | [required] | + +### Return type + +[**models::Folder**](Folder.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_folder_by_uid + +> models::Folder get_folder_by_uid(folder_uid) +Get folder by uid. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | + +### Return type + +[**models::Folder**](Folder.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_folder_descendant_counts + +> std::collections::HashMap get_folder_descendant_counts(folder_uid) +Gets the count of each descendant of a folder by kind. The folder is identified by UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | + +### Return type + +**std::collections::HashMap** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_folders + +> Vec get_folders(limit, page, parent_uid, permission) +Get all folders. + +It returns all folders that the authenticated user has permission to view. If nested folders are enabled, it expects an additional query parameter with the parent folder UID and returns the immediate subfolders that the authenticated user has permission to view. If the parameter is not supplied then it returns immediate subfolders under the root that the authenticated user has permission to view. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**limit** | Option<**i64**> | Limit the maximum number of folders to return | |[default to 1000] +**page** | Option<**i64**> | Page index for starting fetching folders | |[default to 1] +**parent_uid** | Option<**String**> | The parent folder UID | | +**permission** | Option<**String**> | Set to `Edit` to return folders that the user can edit | |[default to View] + +### Return type + +[**Vec**](FolderSearchHit.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## move_folder + +> models::Folder move_folder(folder_uid, move_folder_command) +Move folder. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**move_folder_command** | [**MoveFolderCommand**](MoveFolderCommand.md) | | [required] | + +### Return type + +[**models::Folder**](Folder.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_folder + +> models::Folder update_folder(folder_uid, update_folder_command) +Update folder. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**update_folder_command** | [**UpdateFolderCommand**](UpdateFolderCommand.md) | To change the unique identifier (uid), provide another one. To overwrite an existing folder with newer version, set `overwrite` to `true`. Provide the current version to safelly update the folder: if the provided version differs from the stored one the request will fail, unless `overwrite` is `true`. | [required] | + +### Return type + +[**models::Folder**](Folder.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/ForbiddenError.md b/openapi/docs/ForbiddenError.md new file mode 100755 index 00000000..8101e994 --- /dev/null +++ b/openapi/docs/ForbiddenError.md @@ -0,0 +1,11 @@ +# ForbiddenError + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**body** | Option<[**models::PublicError**](PublicError.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Frame.md b/openapi/docs/Frame.md new file mode 100755 index 00000000..29bdaf1b --- /dev/null +++ b/openapi/docs/Frame.md @@ -0,0 +1,14 @@ +# Frame + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**fields** | Option<[**Vec**](Field.md)> | Fields are the columns of a frame. All Fields must be of the same the length when marshalling the Frame for transmission. There should be no `nil` entries in the Fields slice (making them pointers was a mistake). | [optional] +**meta** | Option<[**models::FrameMeta**](FrameMeta.md)> | | [optional] +**name** | Option<**String**> | Name is used in some Grafana visualizations. | [optional] +**ref_id** | Option<**String**> | RefID is a property that can be set to match a Frame to its originating query. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/FrameMeta.md b/openapi/docs/FrameMeta.md new file mode 100755 index 00000000..eb17e835 --- /dev/null +++ b/openapi/docs/FrameMeta.md @@ -0,0 +1,23 @@ +# FrameMeta + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**channel** | Option<**String**> | Channel is the path to a stream in grafana live that has real-time updates for this data. | [optional] +**custom** | Option<[**serde_json::Value**](.md)> | Custom datasource specific values. | [optional] +**data_topic** | Option<**String**> | nolint:revive | [optional] +**executed_query_string** | Option<**String**> | ExecutedQueryString is the raw query sent to the underlying system. All macros and templating have been applied. When metadata contains this value, it will be shown in the query inspector. | [optional] +**notices** | Option<[**Vec**](Notice.md)> | Notices provide additional information about the data in the Frame that Grafana can display to the user in the user interface. | [optional] +**path** | Option<**String**> | Path is a browsable path on the datasource. | [optional] +**path_separator** | Option<**String**> | PathSeparator defines the separator pattern to decode a hierarchy. The default separator is '/'. | [optional] +**preferred_visualisation_plugin_id** | Option<**String**> | PreferredVisualizationPluginId sets the panel plugin id to use to render the data when using Explore. If the plugin cannot be found will fall back to PreferredVisualization. | [optional] +**preferred_visualisation_type** | Option<**String**> | | [optional] +**stats** | Option<[**Vec**](QueryStat.md)> | Stats is an array of query result statistics. | [optional] +**r#type** | Option<**String**> | A FrameType string, when present in a frame's metadata, asserts that the frame's structure conforms to the FrameType's specification. This property is currently optional, so FrameType may be FrameTypeUnknown even if the properties of the Frame correspond to a defined FrameType. +enum | [optional] +**type_version** | Option<**Vec**> | | [optional] +**unique_row_id_fields** | Option<**Vec**> | Array of field indices which values create a unique id for each row. Ideally this should be globally unique ID but that isn't guarantied. Should help with keeping track and deduplicating rows in visualizations, especially with streaming data with frequent updates. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GenericPublicError.md b/openapi/docs/GenericPublicError.md new file mode 100755 index 00000000..07bbaccd --- /dev/null +++ b/openapi/docs/GenericPublicError.md @@ -0,0 +1,11 @@ +# GenericPublicError + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**body** | Option<[**models::PublicError**](PublicError.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GetAnnotationTagsResponse.md b/openapi/docs/GetAnnotationTagsResponse.md new file mode 100755 index 00000000..71aa0212 --- /dev/null +++ b/openapi/docs/GetAnnotationTagsResponse.md @@ -0,0 +1,11 @@ +# GetAnnotationTagsResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**models::FindTagsResult**](FindTagsResult.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GetCurrentOrgApi.md b/openapi/docs/GetCurrentOrgApi.md new file mode 100755 index 00000000..6a617e46 --- /dev/null +++ b/openapi/docs/GetCurrentOrgApi.md @@ -0,0 +1,36 @@ +# \GetCurrentOrgApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_current_org_quota**](GetCurrentOrgApi.md#get_current_org_quota) | **GET** /org/quotas | Fetch Organization quota. + + + +## get_current_org_quota + +> Vec get_current_org_quota() +Fetch Organization quota. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `orgs.quotas:read` and scope `org:id:1` (orgIDScope). + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](QuotaDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/GetDataSourceIdByName200Response.md b/openapi/docs/GetDataSourceIdByName200Response.md new file mode 100755 index 00000000..516db316 --- /dev/null +++ b/openapi/docs/GetDataSourceIdByName200Response.md @@ -0,0 +1,11 @@ +# GetDataSourceIdByName200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **i64** | ID Identifier of the data source. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GetHomeDashboardResponse.md b/openapi/docs/GetHomeDashboardResponse.md new file mode 100755 index 00000000..c03b375b --- /dev/null +++ b/openapi/docs/GetHomeDashboardResponse.md @@ -0,0 +1,13 @@ +# GetHomeDashboardResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard** | Option<[**serde_json::Value**](.md)> | | [optional] +**meta** | Option<[**models::DashboardMeta**](DashboardMeta.md)> | | [optional] +**redirect_uri** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GetSharingOptions200Response.md b/openapi/docs/GetSharingOptions200Response.md new file mode 100755 index 00000000..6d600c00 --- /dev/null +++ b/openapi/docs/GetSharingOptions200Response.md @@ -0,0 +1,13 @@ +# GetSharingOptions200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**external_enabled** | Option<**bool**> | | [optional] +**external_snapshot_name** | Option<**String**> | | [optional] +**external_snapshot_url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableAlert.md b/openapi/docs/GettableAlert.md new file mode 100755 index 00000000..64888c7e --- /dev/null +++ b/openapi/docs/GettableAlert.md @@ -0,0 +1,19 @@ +# GettableAlert + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotations** | **std::collections::HashMap** | LabelSet label set | +**ends_at** | **String** | ends at | +**fingerprint** | **String** | fingerprint | +**generator_url** | Option<**String**> | generator URL Format: uri | [optional] +**labels** | **std::collections::HashMap** | LabelSet label set | +**receivers** | [**Vec**](receiver.md) | receivers | +**starts_at** | **String** | starts at | +**status** | [**models::AlertStatus**](alertStatus.md) | | +**updated_at** | **String** | updated at | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableAlertmanagers.md b/openapi/docs/GettableAlertmanagers.md new file mode 100755 index 00000000..731bfa84 --- /dev/null +++ b/openapi/docs/GettableAlertmanagers.md @@ -0,0 +1,12 @@ +# GettableAlertmanagers + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | Option<[**models::AlertManagersResult**](AlertManagersResult.md)> | | [optional] +**status** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableApiAlertingConfig.md b/openapi/docs/GettableApiAlertingConfig.md new file mode 100755 index 00000000..c33dea8d --- /dev/null +++ b/openapi/docs/GettableApiAlertingConfig.md @@ -0,0 +1,18 @@ +# GettableApiAlertingConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**global** | Option<[**models::GlobalConfig**](GlobalConfig.md)> | | [optional] +**inhibit_rules** | Option<[**Vec**](InhibitRule.md)> | | [optional] +**mute_time_provenances** | Option<**std::collections::HashMap**> | | [optional] +**mute_time_intervals** | Option<[**Vec**](MuteTimeInterval.md)> | MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0. | [optional] +**receivers** | Option<[**Vec**](GettableApiReceiver.md)> | Override with our superset receiver type | [optional] +**route** | Option<[**models::Route**](Route.md)> | | [optional] +**templates** | Option<**Vec**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeInterval.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableApiReceiver.md b/openapi/docs/GettableApiReceiver.md new file mode 100755 index 00000000..6ea537d3 --- /dev/null +++ b/openapi/docs/GettableApiReceiver.md @@ -0,0 +1,25 @@ +# GettableApiReceiver + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**discord_configs** | Option<[**Vec**](DiscordConfig.md)> | | [optional] +**email_configs** | Option<[**Vec**](EmailConfig.md)> | | [optional] +**grafana_managed_receiver_configs** | Option<[**Vec**](GettableGrafanaReceiver.md)> | | [optional] +**msteams_configs** | Option<[**Vec**](MSTeamsConfig.md)> | | [optional] +**name** | Option<**String**> | A unique identifier for this receiver. | [optional] +**opsgenie_configs** | Option<[**Vec**](OpsGenieConfig.md)> | | [optional] +**pagerduty_configs** | Option<[**Vec**](PagerdutyConfig.md)> | | [optional] +**pushover_configs** | Option<[**Vec**](PushoverConfig.md)> | | [optional] +**slack_configs** | Option<[**Vec**](SlackConfig.md)> | | [optional] +**sns_configs** | Option<[**Vec**](SNSConfig.md)> | | [optional] +**telegram_configs** | Option<[**Vec**](TelegramConfig.md)> | | [optional] +**victorops_configs** | Option<[**Vec**](VictorOpsConfig.md)> | | [optional] +**webex_configs** | Option<[**Vec**](WebexConfig.md)> | | [optional] +**webhook_configs** | Option<[**Vec**](WebhookConfig.md)> | | [optional] +**wechat_configs** | Option<[**Vec**](WechatConfig.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableExtendedRuleNode.md b/openapi/docs/GettableExtendedRuleNode.md new file mode 100755 index 00000000..ec498fbc --- /dev/null +++ b/openapi/docs/GettableExtendedRuleNode.md @@ -0,0 +1,18 @@ +# GettableExtendedRuleNode + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alert** | Option<**String**> | | [optional] +**annotations** | Option<**std::collections::HashMap**> | | [optional] +**expr** | Option<**String**> | | [optional] +**r#for** | Option<**String**> | | [optional] +**grafana_alert** | Option<[**models::GettableGrafanaRule**](GettableGrafanaRule.md)> | | [optional] +**keep_firing_for** | Option<**String**> | | [optional] +**labels** | Option<**std::collections::HashMap**> | | [optional] +**record** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableGrafanaReceiver.md b/openapi/docs/GettableGrafanaReceiver.md new file mode 100755 index 00000000..e57e66a2 --- /dev/null +++ b/openapi/docs/GettableGrafanaReceiver.md @@ -0,0 +1,17 @@ +# GettableGrafanaReceiver + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**disable_resolve_message** | Option<**bool**> | | [optional] +**name** | Option<**String**> | | [optional] +**provenance** | Option<**String**> | | [optional] +**secure_fields** | Option<**std::collections::HashMap**> | | [optional] +**settings** | Option<[**serde_json::Value**](.md)> | | [optional] +**r#type** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableGrafanaReceivers.md b/openapi/docs/GettableGrafanaReceivers.md new file mode 100755 index 00000000..00625455 --- /dev/null +++ b/openapi/docs/GettableGrafanaReceivers.md @@ -0,0 +1,11 @@ +# GettableGrafanaReceivers + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**grafana_managed_receiver_configs** | Option<[**Vec**](GettableGrafanaReceiver.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableGrafanaRule.md b/openapi/docs/GettableGrafanaRule.md new file mode 100755 index 00000000..77de3a56 --- /dev/null +++ b/openapi/docs/GettableGrafanaRule.md @@ -0,0 +1,26 @@ +# GettableGrafanaRule + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**condition** | Option<**String**> | | [optional] +**data** | Option<[**Vec**](AlertQuery.md)> | | [optional] +**exec_err_state** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**interval_seconds** | Option<**i64**> | | [optional] +**is_paused** | Option<**bool**> | | [optional] +**namespace_uid** | Option<**String**> | | [optional] +**no_data_state** | Option<**String**> | | [optional] +**notification_settings** | Option<[**models::AlertRuleNotificationSettings**](AlertRuleNotificationSettings.md)> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**provenance** | Option<**String**> | | [optional] +**rule_group** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableHistoricUserConfig.md b/openapi/docs/GettableHistoricUserConfig.md new file mode 100755 index 00000000..b5a0603a --- /dev/null +++ b/openapi/docs/GettableHistoricUserConfig.md @@ -0,0 +1,15 @@ +# GettableHistoricUserConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alertmanager_config** | Option<[**models::GettableApiAlertingConfig**](GettableApiAlertingConfig.md)> | | [optional] +**id** | Option<**i64**> | | [optional] +**last_applied** | Option<**String**> | | [optional] +**template_file_provenances** | Option<**std::collections::HashMap**> | | [optional] +**template_files** | Option<**std::collections::HashMap**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableNGalertConfig.md b/openapi/docs/GettableNGalertConfig.md new file mode 100755 index 00000000..6c53e09f --- /dev/null +++ b/openapi/docs/GettableNGalertConfig.md @@ -0,0 +1,11 @@ +# GettableNGalertConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alertmanagers_choice** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableRuleGroupConfig.md b/openapi/docs/GettableRuleGroupConfig.md new file mode 100755 index 00000000..9088fd55 --- /dev/null +++ b/openapi/docs/GettableRuleGroupConfig.md @@ -0,0 +1,14 @@ +# GettableRuleGroupConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**interval** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**name** | Option<**String**> | | [optional] +**rules** | Option<[**Vec**](GettableExtendedRuleNode.md)> | | [optional] +**source_tenants** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableSilence.md b/openapi/docs/GettableSilence.md new file mode 100755 index 00000000..538e947c --- /dev/null +++ b/openapi/docs/GettableSilence.md @@ -0,0 +1,18 @@ +# GettableSilence + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**comment** | **String** | comment | +**created_by** | **String** | created by | +**ends_at** | **String** | ends at | +**id** | **String** | id | +**matchers** | [**Vec**](matcher.md) | Matchers matchers | +**starts_at** | **String** | starts at | +**status** | [**models::SilenceStatus**](silenceStatus.md) | | +**updated_at** | **String** | updated at | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableStatus.md b/openapi/docs/GettableStatus.md new file mode 100755 index 00000000..7f5d9297 --- /dev/null +++ b/openapi/docs/GettableStatus.md @@ -0,0 +1,14 @@ +# GettableStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**cluster** | [**models::ClusterStatus**](clusterStatus.md) | | +**config** | [**models::PostableApiAlertingConfig**](PostableApiAlertingConfig.md) | | +**uptime** | **String** | uptime | +**version_info** | [**models::VersionInfo**](versionInfo.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableTimeIntervals.md b/openapi/docs/GettableTimeIntervals.md new file mode 100755 index 00000000..91b9deb0 --- /dev/null +++ b/openapi/docs/GettableTimeIntervals.md @@ -0,0 +1,13 @@ +# GettableTimeIntervals + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**provenance** | Option<**String**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeIntervalItem.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GettableUserConfig.md b/openapi/docs/GettableUserConfig.md new file mode 100755 index 00000000..8464c931 --- /dev/null +++ b/openapi/docs/GettableUserConfig.md @@ -0,0 +1,13 @@ +# GettableUserConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alertmanager_config** | Option<[**models::GettableApiAlertingConfig**](GettableApiAlertingConfig.md)> | | [optional] +**template_file_provenances** | Option<**std::collections::HashMap**> | | [optional] +**template_files** | Option<**std::collections::HashMap**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/GlobalConfig.md b/openapi/docs/GlobalConfig.md new file mode 100755 index 00000000..cc94b7ea --- /dev/null +++ b/openapi/docs/GlobalConfig.md @@ -0,0 +1,35 @@ +# GlobalConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**opsgenie_api_key** | Option<**String**> | | [optional] +**opsgenie_api_key_file** | Option<**String**> | | [optional] +**opsgenie_api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**pagerduty_url** | Option<[**models::Url**](URL.md)> | | [optional] +**resolve_timeout** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**slack_api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**slack_api_url_file** | Option<**String**> | | [optional] +**smtp_auth_identity** | Option<**String**> | | [optional] +**smtp_auth_password** | Option<**String**> | | [optional] +**smtp_auth_password_file** | Option<**String**> | | [optional] +**smtp_auth_secret** | Option<**String**> | | [optional] +**smtp_auth_username** | Option<**String**> | | [optional] +**smtp_from** | Option<**String**> | | [optional] +**smtp_hello** | Option<**String**> | | [optional] +**smtp_require_tls** | Option<**bool**> | | [optional] +**smtp_smarthost** | Option<[**models::HostPort**](HostPort.md)> | | [optional] +**telegram_api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**victorops_api_key** | Option<**String**> | | [optional] +**victorops_api_key_file** | Option<**String**> | | [optional] +**victorops_api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**webex_api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**wechat_api_corp_id** | Option<**String**> | | [optional] +**wechat_api_secret** | Option<**String**> | | [optional] +**wechat_api_url** | Option<[**models::Url**](URL.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Hit.md b/openapi/docs/Hit.md new file mode 100755 index 00000000..bcbd8ca6 --- /dev/null +++ b/openapi/docs/Hit.md @@ -0,0 +1,25 @@ +# Hit + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder_id** | Option<**i64**> | Deprecated: use FolderUID instead | [optional] +**folder_title** | Option<**String**> | | [optional] +**folder_uid** | Option<**String**> | | [optional] +**folder_url** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_starred** | Option<**bool**> | | [optional] +**slug** | Option<**String**> | | [optional] +**sort_meta** | Option<**i64**> | | [optional] +**sort_meta_name** | Option<**String**> | | [optional] +**tags** | Option<**Vec**> | | [optional] +**title** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**uri** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/HostPort.md b/openapi/docs/HostPort.md new file mode 100755 index 00000000..69e11854 --- /dev/null +++ b/openapi/docs/HostPort.md @@ -0,0 +1,12 @@ +# HostPort + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**host** | Option<**String**> | | [optional] +**port** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/HttpClientConfig.md b/openapi/docs/HttpClientConfig.md new file mode 100755 index 00000000..fc20421e --- /dev/null +++ b/openapi/docs/HttpClientConfig.md @@ -0,0 +1,22 @@ +# HttpClientConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**authorization** | Option<[**models::Authorization**](Authorization.md)> | | [optional] +**basic_auth** | Option<[**models::BasicAuth**](BasicAuth.md)> | | [optional] +**bearer_token** | Option<**String**> | | [optional] +**bearer_token_file** | Option<**String**> | The bearer token file for the targets. Deprecated in favour of Authorization.CredentialsFile. | [optional] +**enable_http2** | Option<**bool**> | EnableHTTP2 specifies whether the client should configure HTTP2. The omitempty flag is not set, because it would be hidden from the marshalled configuration when set to false. | [optional] +**follow_redirects** | Option<**bool**> | FollowRedirects specifies whether the client should follow HTTP 3xx redirects. The omitempty flag is not set, because it would be hidden from the marshalled configuration when set to false. | [optional] +**no_proxy** | Option<**String**> | NoProxy contains addresses that should not use a proxy. | [optional] +**oauth2** | Option<[**models::OAuth2**](OAuth2.md)> | | [optional] +**proxy_connect_header** | Option<[**std::collections::HashMap>**](Vec.md)> | | [optional] +**proxy_from_environment** | Option<**bool**> | ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function to determine proxies. | [optional] +**proxy_url** | Option<[**models::Url**](URL.md)> | | [optional] +**tls_config** | Option<[**models::TlsConfig**](TLSConfig.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ImportDashboardInput.md b/openapi/docs/ImportDashboardInput.md new file mode 100755 index 00000000..8f0c0f88 --- /dev/null +++ b/openapi/docs/ImportDashboardInput.md @@ -0,0 +1,14 @@ +# ImportDashboardInput + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**plugin_id** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**value** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ImportDashboardRequest.md b/openapi/docs/ImportDashboardRequest.md new file mode 100755 index 00000000..d4241826 --- /dev/null +++ b/openapi/docs/ImportDashboardRequest.md @@ -0,0 +1,17 @@ +# ImportDashboardRequest + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard** | Option<[**serde_json::Value**](.md)> | | [optional] +**folder_id** | Option<**i64**> | Deprecated: use FolderUID instead | [optional] +**folder_uid** | Option<**String**> | | [optional] +**inputs** | Option<[**Vec**](ImportDashboardInput.md)> | | [optional] +**overwrite** | Option<**bool**> | | [optional] +**path** | Option<**String**> | | [optional] +**plugin_id** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ImportDashboardResponse.md b/openapi/docs/ImportDashboardResponse.md new file mode 100755 index 00000000..626e3563 --- /dev/null +++ b/openapi/docs/ImportDashboardResponse.md @@ -0,0 +1,25 @@ +# ImportDashboardResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard_id** | Option<**i64**> | | [optional] +**description** | Option<**String**> | | [optional] +**folder_id** | Option<**i64**> | Deprecated: use FolderUID instead | [optional] +**folder_uid** | Option<**String**> | | [optional] +**imported** | Option<**bool**> | | [optional] +**imported_revision** | Option<**i64**> | | [optional] +**imported_uri** | Option<**String**> | | [optional] +**imported_url** | Option<**String**> | | [optional] +**path** | Option<**String**> | | [optional] +**plugin_id** | Option<**String**> | | [optional] +**removed** | Option<**bool**> | | [optional] +**revision** | Option<**i64**> | | [optional] +**slug** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/InhibitRule.md b/openapi/docs/InhibitRule.md new file mode 100755 index 00000000..56cefa75 --- /dev/null +++ b/openapi/docs/InhibitRule.md @@ -0,0 +1,17 @@ +# InhibitRule + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**equal** | Option<**Vec**> | | [optional] +**source_match** | Option<**std::collections::HashMap**> | SourceMatch defines a set of labels that have to equal the given value for source alerts. Deprecated. Remove before v1.0 release. | [optional] +**source_match_re** | Option<**std::collections::HashMap**> | | [optional] +**source_matchers** | Option<[**Vec**](Matcher.md)> | Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. | [optional] +**target_match** | Option<**std::collections::HashMap**> | TargetMatch defines a set of labels that have to equal the given value for target alerts. Deprecated. Remove before v1.0 release. | [optional] +**target_match_re** | Option<**std::collections::HashMap**> | | [optional] +**target_matchers** | Option<[**Vec**](Matcher.md)> | Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Integration.md b/openapi/docs/Integration.md new file mode 100755 index 00000000..79486b4a --- /dev/null +++ b/openapi/docs/Integration.md @@ -0,0 +1,15 @@ +# Integration + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**last_notify_attempt** | Option<**String**> | A timestamp indicating the last attempt to deliver a notification regardless of the outcome. Format: date-time | [optional] +**last_notify_attempt_duration** | Option<**String**> | Duration of the last attempt to deliver a notification in humanized format (`1s` or `15ms`, etc). | [optional] +**last_notify_attempt_error** | Option<**String**> | Error string for the last attempt to deliver a notification. Empty if the last attempt was successful. | [optional] +**name** | **String** | name | +**send_resolved** | **bool** | send resolved | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/InternalDataLink.md b/openapi/docs/InternalDataLink.md new file mode 100755 index 00000000..36352604 --- /dev/null +++ b/openapi/docs/InternalDataLink.md @@ -0,0 +1,16 @@ +# InternalDataLink + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**datasource_name** | Option<**String**> | | [optional] +**datasource_uid** | Option<**String**> | | [optional] +**panels_state** | Option<[**serde_json::Value**](.md)> | This is an object constructed with the keys as the values of the enum VisType and the value being a bag of properties | [optional] +**query** | Option<[**serde_json::Value**](.md)> | | [optional] +**time_range** | Option<[**models::TimeRange**](TimeRange.md)> | | [optional] +**transformations** | Option<[**Vec**](LinkTransformationConfig.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/IpNet.md b/openapi/docs/IpNet.md new file mode 100755 index 00000000..d87b9d5a --- /dev/null +++ b/openapi/docs/IpNet.md @@ -0,0 +1,12 @@ +# IpNet + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**ip** | Option<**String**> | | [optional] +**mask** | Option<**Vec**> | See type IPNet and func ParseCIDR for details. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/JsonWebKey.md b/openapi/docs/JsonWebKey.md new file mode 100755 index 00000000..15b1f42a --- /dev/null +++ b/openapi/docs/JsonWebKey.md @@ -0,0 +1,18 @@ +# JsonWebKey + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**algorithm** | Option<**String**> | Key algorithm, parsed from `alg` header. | [optional] +**certificate_thumbprint_sha1** | Option<**Vec**> | X.509 certificate thumbprint (SHA-1), parsed from `x5t` header. | [optional] +**certificate_thumbprint_sha256** | Option<**Vec**> | X.509 certificate thumbprint (SHA-256), parsed from `x5t#S256` header. | [optional] +**certificates** | Option<[**Vec**](Certificate.md)> | X.509 certificate chain, parsed from `x5c` header. | [optional] +**certificates_url** | Option<[**models::Url**](URL.md)> | | [optional] +**key** | Option<[**serde_json::Value**](.md)> | Key is the Go in-memory representation of this key. It must have one of these types: ed25519.PublicKey ed25519.PrivateKey ecdsa.PublicKey ecdsa.PrivateKey rsa.PublicKey rsa.PrivateKey []byte (a symmetric key) When marshaling this JSONWebKey into JSON, the \"kty\" header parameter will be automatically set based on the type of this field. | [optional] +**key_id** | Option<**String**> | Key identifier, parsed from `kid` header. | [optional] +**r#use** | Option<**String**> | Key use, parsed from `use` header. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Label.md b/openapi/docs/Label.md new file mode 100755 index 00000000..3106783b --- /dev/null +++ b/openapi/docs/Label.md @@ -0,0 +1,11 @@ +# Label + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LdapDebugApi.md b/openapi/docs/LdapDebugApi.md new file mode 100755 index 00000000..d23a7c23 --- /dev/null +++ b/openapi/docs/LdapDebugApi.md @@ -0,0 +1,36 @@ +# \LdapDebugApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_sync_status**](LdapDebugApi.md#get_sync_status) | **GET** /admin/ldap-sync-status | Returns the current state of the LDAP background sync integration. + + + +## get_sync_status + +> models::ActiveSyncStatusDto get_sync_status() +Returns the current state of the LDAP background sync integration. + +You need to have a permission with action `ldap.status:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ActiveSyncStatusDto**](ActiveSyncStatusDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/LibraryElementArrayResponse.md b/openapi/docs/LibraryElementArrayResponse.md new file mode 100755 index 00000000..95c76c96 --- /dev/null +++ b/openapi/docs/LibraryElementArrayResponse.md @@ -0,0 +1,11 @@ +# LibraryElementArrayResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**Vec**](LibraryElementDTO.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementConnectionDto.md b/openapi/docs/LibraryElementConnectionDto.md new file mode 100755 index 00000000..eb6384dd --- /dev/null +++ b/openapi/docs/LibraryElementConnectionDto.md @@ -0,0 +1,17 @@ +# LibraryElementConnectionDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**connection_id** | Option<**i64**> | | [optional] +**connection_uid** | Option<**String**> | | [optional] +**created** | Option<**String**> | | [optional] +**created_by** | Option<[**models::LibraryElementDtoMetaUser**](LibraryElementDTOMetaUser.md)> | | [optional] +**element_id** | Option<**i64**> | | [optional] +**id** | Option<**i64**> | | [optional] +**kind** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementConnectionsResponse.md b/openapi/docs/LibraryElementConnectionsResponse.md new file mode 100755 index 00000000..58d356d3 --- /dev/null +++ b/openapi/docs/LibraryElementConnectionsResponse.md @@ -0,0 +1,11 @@ +# LibraryElementConnectionsResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**Vec**](LibraryElementConnectionDTO.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementDto.md b/openapi/docs/LibraryElementDto.md new file mode 100755 index 00000000..d69f3a63 --- /dev/null +++ b/openapi/docs/LibraryElementDto.md @@ -0,0 +1,23 @@ +# LibraryElementDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | Option<**String**> | | [optional] +**folder_id** | Option<**i64**> | Deprecated: use FolderUID instead | [optional] +**folder_uid** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**kind** | Option<**i64**> | | [optional] +**meta** | Option<[**models::LibraryElementDtoMeta**](LibraryElementDTOMeta.md)> | | [optional] +**model** | Option<[**serde_json::Value**](.md)> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**schema_version** | Option<**i64**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementDtoMeta.md b/openapi/docs/LibraryElementDtoMeta.md new file mode 100755 index 00000000..d4ba0c06 --- /dev/null +++ b/openapi/docs/LibraryElementDtoMeta.md @@ -0,0 +1,17 @@ +# LibraryElementDtoMeta + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**connected_dashboards** | Option<**i64**> | | [optional] +**created** | Option<**String**> | | [optional] +**created_by** | Option<[**models::LibraryElementDtoMetaUser**](LibraryElementDTOMetaUser.md)> | | [optional] +**folder_name** | Option<**String**> | | [optional] +**folder_uid** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] +**updated_by** | Option<[**models::LibraryElementDtoMetaUser**](LibraryElementDTOMetaUser.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementDtoMetaUser.md b/openapi/docs/LibraryElementDtoMetaUser.md new file mode 100755 index 00000000..47ae82f7 --- /dev/null +++ b/openapi/docs/LibraryElementDtoMetaUser.md @@ -0,0 +1,13 @@ +# LibraryElementDtoMetaUser + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**avatar_url** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementResponse.md b/openapi/docs/LibraryElementResponse.md new file mode 100755 index 00000000..dd9eff8d --- /dev/null +++ b/openapi/docs/LibraryElementResponse.md @@ -0,0 +1,11 @@ +# LibraryElementResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**models::LibraryElementDto**](LibraryElementDTO.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementSearchResponse.md b/openapi/docs/LibraryElementSearchResponse.md new file mode 100755 index 00000000..b22b1d0a --- /dev/null +++ b/openapi/docs/LibraryElementSearchResponse.md @@ -0,0 +1,11 @@ +# LibraryElementSearchResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**models::LibraryElementSearchResult**](LibraryElementSearchResult.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementSearchResult.md b/openapi/docs/LibraryElementSearchResult.md new file mode 100755 index 00000000..272f5bc3 --- /dev/null +++ b/openapi/docs/LibraryElementSearchResult.md @@ -0,0 +1,14 @@ +# LibraryElementSearchResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**elements** | Option<[**Vec**](LibraryElementDTO.md)> | | [optional] +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**total_count** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/LibraryElementsApi.md b/openapi/docs/LibraryElementsApi.md new file mode 100755 index 00000000..fe576bc4 --- /dev/null +++ b/openapi/docs/LibraryElementsApi.md @@ -0,0 +1,233 @@ +# \LibraryElementsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_library_element**](LibraryElementsApi.md#create_library_element) | **POST** /library-elements | Create library element. +[**delete_library_element_by_uid**](LibraryElementsApi.md#delete_library_element_by_uid) | **DELETE** /library-elements/{library_element_uid} | Delete library element. +[**get_library_element_by_name**](LibraryElementsApi.md#get_library_element_by_name) | **GET** /library-elements/name/{library_element_name} | Get library element by name. +[**get_library_element_by_uid**](LibraryElementsApi.md#get_library_element_by_uid) | **GET** /library-elements/{library_element_uid} | Get library element by UID. +[**get_library_element_connections**](LibraryElementsApi.md#get_library_element_connections) | **GET** /library-elements/{library_element_uid}/connections/ | Get library element connections. +[**get_library_elements**](LibraryElementsApi.md#get_library_elements) | **GET** /library-elements | Get all library elements. +[**update_library_element**](LibraryElementsApi.md#update_library_element) | **PATCH** /library-elements/{library_element_uid} | Update library element. + + + +## create_library_element + +> models::LibraryElementResponse create_library_element(create_library_element_command) +Create library element. + +Creates a new library element. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_library_element_command** | [**CreateLibraryElementCommand**](CreateLibraryElementCommand.md) | | [required] | + +### Return type + +[**models::LibraryElementResponse**](LibraryElementResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_library_element_by_uid + +> models::SuccessResponseBody delete_library_element_by_uid(library_element_uid) +Delete library element. + +Deletes an existing library element as specified by the UID. This operation cannot be reverted. You cannot delete a library element that is connected. This operation cannot be reverted. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**library_element_uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_library_element_by_name + +> models::LibraryElementArrayResponse get_library_element_by_name(library_element_name) +Get library element by name. + +Returns a library element with the given name. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**library_element_name** | **String** | | [required] | + +### Return type + +[**models::LibraryElementArrayResponse**](LibraryElementArrayResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_library_element_by_uid + +> models::LibraryElementResponse get_library_element_by_uid(library_element_uid) +Get library element by UID. + +Returns a library element with the given UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**library_element_uid** | **String** | | [required] | + +### Return type + +[**models::LibraryElementResponse**](LibraryElementResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_library_element_connections + +> models::LibraryElementConnectionsResponse get_library_element_connections(library_element_uid) +Get library element connections. + +Returns a list of connections for a library element based on the UID specified. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**library_element_uid** | **String** | | [required] | + +### Return type + +[**models::LibraryElementConnectionsResponse**](LibraryElementConnectionsResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_library_elements + +> models::LibraryElementSearchResponse get_library_elements(search_string, kind, sort_direction, type_filter, exclude_uid, folder_filter, per_page, page) +Get all library elements. + +Returns a list of all library elements the authenticated user has permission to view. Use the `perPage` query parameter to control the maximum number of library elements returned; the default limit is `100`. You can also use the `page` query parameter to fetch library elements from any page other than the first one. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**search_string** | Option<**String**> | Part of the name or description searched for. | | +**kind** | Option<**i64**> | Kind of element to search for. | | +**sort_direction** | Option<**String**> | Sort order of elements. | | +**type_filter** | Option<**String**> | A comma separated list of types to filter the elements by | | +**exclude_uid** | Option<**String**> | Element UID to exclude from search results. | | +**folder_filter** | Option<**String**> | A comma separated list of folder ID(s) to filter the elements by. | | +**per_page** | Option<**i64**> | The number of results per page. | |[default to 100] +**page** | Option<**i64**> | The page for a set of records, given that only perPage records are returned at a time. Numbering starts at 1. | |[default to 1] + +### Return type + +[**models::LibraryElementSearchResponse**](LibraryElementSearchResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_library_element + +> models::LibraryElementResponse update_library_element(library_element_uid, patch_library_element_command) +Update library element. + +Updates an existing library element identified by uid. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**library_element_uid** | **String** | | [required] | +**patch_library_element_command** | [**PatchLibraryElementCommand**](PatchLibraryElementCommand.md) | | [required] | + +### Return type + +[**models::LibraryElementResponse**](LibraryElementResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/LicensingApi.md b/openapi/docs/LicensingApi.md new file mode 100755 index 00000000..25556c2c --- /dev/null +++ b/openapi/docs/LicensingApi.md @@ -0,0 +1,239 @@ +# \LicensingApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**delete_license_token**](LicensingApi.md#delete_license_token) | **DELETE** /licensing/token | Remove license from database. +[**get_custom_permissions_csv**](LicensingApi.md#get_custom_permissions_csv) | **GET** /licensing/custom-permissions-csv | Get custom permissions report in CSV format. +[**get_custom_permissions_report**](LicensingApi.md#get_custom_permissions_report) | **GET** /licensing/custom-permissions | Get custom permissions report. +[**get_license_token**](LicensingApi.md#get_license_token) | **GET** /licensing/token | Get license token. +[**get_status**](LicensingApi.md#get_status) | **GET** /licensing/check | Check license availability. +[**post_license_token**](LicensingApi.md#post_license_token) | **POST** /licensing/token | Create license token. +[**post_renew_license_token**](LicensingApi.md#post_renew_license_token) | **POST** /licensing/token/renew | Manually force license refresh. +[**refresh_license_stats**](LicensingApi.md#refresh_license_stats) | **GET** /licensing/refresh-stats | Refresh license stats. + + + +## delete_license_token + +> models::ErrorResponseBody delete_license_token(delete_token_command) +Remove license from database. + +Removes the license stored in the Grafana database. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:delete`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**delete_token_command** | [**DeleteTokenCommand**](DeleteTokenCommand.md) | | [required] | + +### Return type + +[**models::ErrorResponseBody**](ErrorResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_custom_permissions_csv + +> get_custom_permissions_csv() +Get custom permissions report in CSV format. + +You need to have a permission with action `licensing.reports:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_custom_permissions_report + +> get_custom_permissions_report() +Get custom permissions report. + +You need to have a permission with action `licensing.reports:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_license_token + +> models::Token get_license_token() +Get license token. + +You need to have a permission with action `licensing:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::Token**](Token.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_status + +> get_status() +Check license availability. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_license_token + +> models::Token post_license_token(delete_token_command) +Create license token. + +You need to have a permission with action `licensing:update`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**delete_token_command** | [**DeleteTokenCommand**](DeleteTokenCommand.md) | | [required] | + +### Return type + +[**models::Token**](Token.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_renew_license_token + +> post_renew_license_token(body) +Manually force license refresh. + +Manually ask license issuer for a new token. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:update`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**body** | **serde_json::Value** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## refresh_license_stats + +> models::ActiveUserStats refresh_license_stats() +Refresh license stats. + +You need to have a permission with action `licensing:read`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ActiveUserStats**](ActiveUserStats.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/LinkTransformationConfig.md b/openapi/docs/LinkTransformationConfig.md new file mode 100755 index 00000000..b62dc05d --- /dev/null +++ b/openapi/docs/LinkTransformationConfig.md @@ -0,0 +1,14 @@ +# LinkTransformationConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**expression** | Option<**String**> | | [optional] +**field** | Option<**String**> | | [optional] +**map_value** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ListAllProvidersSettings200ResponseInner.md b/openapi/docs/ListAllProvidersSettings200ResponseInner.md new file mode 100755 index 00000000..dcaf183b --- /dev/null +++ b/openapi/docs/ListAllProvidersSettings200ResponseInner.md @@ -0,0 +1,14 @@ +# ListAllProvidersSettings200ResponseInner + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**String**> | | [optional] +**provider** | Option<**String**> | | [optional] +**settings** | Option<[**serde_json::Value**](.md)> | | [optional] +**source** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ListSortOptions200Response.md b/openapi/docs/ListSortOptions200Response.md new file mode 100755 index 00000000..e39dbb6e --- /dev/null +++ b/openapi/docs/ListSortOptions200Response.md @@ -0,0 +1,14 @@ +# ListSortOptions200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | Option<**String**> | | [optional] +**display_name** | Option<**String**> | | [optional] +**meta** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/MassDeleteAnnotationsCmd.md b/openapi/docs/MassDeleteAnnotationsCmd.md new file mode 100755 index 00000000..699d79f6 --- /dev/null +++ b/openapi/docs/MassDeleteAnnotationsCmd.md @@ -0,0 +1,14 @@ +# MassDeleteAnnotationsCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotation_id** | Option<**i64**> | | [optional] +**dashboard_id** | Option<**i64**> | | [optional] +**dashboard_uid** | Option<**String**> | | [optional] +**panel_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Matcher.md b/openapi/docs/Matcher.md new file mode 100755 index 00000000..c6bb04e6 --- /dev/null +++ b/openapi/docs/Matcher.md @@ -0,0 +1,14 @@ +# Matcher + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**is_equal** | Option<**bool**> | is equal | [optional] +**is_regex** | **bool** | is regex | +**name** | **String** | name | +**value** | **String** | value | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/MetricRequest.md b/openapi/docs/MetricRequest.md new file mode 100755 index 00000000..34a2d7a4 --- /dev/null +++ b/openapi/docs/MetricRequest.md @@ -0,0 +1,14 @@ +# MetricRequest + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**debug** | Option<**bool**> | | [optional] +**from** | **String** | From Start time in epoch timestamps in milliseconds or relative using Grafana time units. | +**queries** | [**Vec**](serde_json::Value.md) | queries.refId – Specifies an identifier of the query. Is optional and default to “A”. queries.datasourceId – Specifies the data source to be queried. Each query in the request must have an unique datasourceId. queries.maxDataPoints - Species maximum amount of data points that dashboard panel can render. Is optional and default to 100. queries.intervalMs - Specifies the time interval in milliseconds of time series. Is optional and defaults to 1000. | +**to** | **String** | To End time in epoch timestamps in milliseconds or relative using Grafana time units. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/MoveFolderCommand.md b/openapi/docs/MoveFolderCommand.md new file mode 100755 index 00000000..655e7417 --- /dev/null +++ b/openapi/docs/MoveFolderCommand.md @@ -0,0 +1,11 @@ +# MoveFolderCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**parent_uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/MsTeamsConfig.md b/openapi/docs/MsTeamsConfig.md new file mode 100755 index 00000000..e9ab2531 --- /dev/null +++ b/openapi/docs/MsTeamsConfig.md @@ -0,0 +1,17 @@ +# MsTeamsConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**summary** | Option<**String**> | | [optional] +**text** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**webhook_url** | Option<[**models::Url**](URL.md)> | | [optional] +**webhook_url_file** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/MuteTimeInterval.md b/openapi/docs/MuteTimeInterval.md new file mode 100755 index 00000000..e8154b45 --- /dev/null +++ b/openapi/docs/MuteTimeInterval.md @@ -0,0 +1,12 @@ +# MuteTimeInterval + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeInterval.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/MuteTimeIntervalExport.md b/openapi/docs/MuteTimeIntervalExport.md new file mode 100755 index 00000000..0b3d4e62 --- /dev/null +++ b/openapi/docs/MuteTimeIntervalExport.md @@ -0,0 +1,13 @@ +# MuteTimeIntervalExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeInterval.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Name.md b/openapi/docs/Name.md new file mode 100755 index 00000000..696c8523 --- /dev/null +++ b/openapi/docs/Name.md @@ -0,0 +1,16 @@ +# Name + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**country** | Option<**Vec**> | | [optional] +**extra_names** | Option<[**Vec**](AttributeTypeAndValue.md)> | ExtraNames contains attributes to be copied, raw, into any marshaled distinguished names. Values override any attributes with the same OID. The ExtraNames field is not populated when parsing, see Names. | [optional] +**locality** | Option<**Vec**> | | [optional] +**names** | Option<[**Vec**](AttributeTypeAndValue.md)> | Names contains all parsed attributes. When parsing distinguished names, this can be used to extract non-standard attributes that are not parsed by this package. When marshaling to RDNSequences, the Names field is ignored, see ExtraNames. | [optional] +**serial_number** | Option<**String**> | | [optional] +**street_address** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/NewApiKeyResult.md b/openapi/docs/NewApiKeyResult.md new file mode 100755 index 00000000..09bc53b3 --- /dev/null +++ b/openapi/docs/NewApiKeyResult.md @@ -0,0 +1,13 @@ +# NewApiKeyResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**key** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Notice.md b/openapi/docs/Notice.md new file mode 100755 index 00000000..d810d7bb --- /dev/null +++ b/openapi/docs/Notice.md @@ -0,0 +1,14 @@ +# Notice + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**inspect** | Option<**i64**> | | [optional] +**link** | Option<**String**> | Link is an optional link for display in the user interface and can be an absolute URL or a path relative to Grafana's root url. | [optional] +**severity** | Option<**i64**> | | [optional] +**text** | Option<**String**> | Text is freeform descriptive text for the notice. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/NotificationPolicyExport.md b/openapi/docs/NotificationPolicyExport.md new file mode 100755 index 00000000..782b3b4e --- /dev/null +++ b/openapi/docs/NotificationPolicyExport.md @@ -0,0 +1,23 @@ +# NotificationPolicyExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**r#continue** | Option<**bool**> | | [optional] +**group_by** | Option<**Vec**> | | [optional] +**group_interval** | Option<**String**> | | [optional] +**group_wait** | Option<**String**> | | [optional] +**r#match** | Option<**std::collections::HashMap**> | Deprecated. Remove before v1.0 release. | [optional] +**match_re** | Option<**std::collections::HashMap**> | | [optional] +**matchers** | Option<[**Vec**](Matcher.md)> | Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. | [optional] +**mute_time_intervals** | Option<**Vec**> | | [optional] +**object_matchers** | Option<[**Vec>**](Vec.md)> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**receiver** | Option<**String**> | | [optional] +**repeat_interval** | Option<**String**> | | [optional] +**routes** | Option<[**Vec**](RouteExport.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/NotificationTemplate.md b/openapi/docs/NotificationTemplate.md new file mode 100755 index 00000000..7cc6cf6f --- /dev/null +++ b/openapi/docs/NotificationTemplate.md @@ -0,0 +1,13 @@ +# NotificationTemplate + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**provenance** | Option<**String**> | | [optional] +**template** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/NotificationTemplateContent.md b/openapi/docs/NotificationTemplateContent.md new file mode 100755 index 00000000..e540acbb --- /dev/null +++ b/openapi/docs/NotificationTemplateContent.md @@ -0,0 +1,11 @@ +# NotificationTemplateContent + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**template** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/NotifierConfig.md b/openapi/docs/NotifierConfig.md new file mode 100755 index 00000000..b479fd5c --- /dev/null +++ b/openapi/docs/NotifierConfig.md @@ -0,0 +1,11 @@ +# NotifierConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**send_resolved** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/OAuth2.md b/openapi/docs/OAuth2.md new file mode 100755 index 00000000..4fef5e73 --- /dev/null +++ b/openapi/docs/OAuth2.md @@ -0,0 +1,21 @@ +# OAuth2 + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**tls_config** | Option<[**models::TlsConfig**](TLSConfig.md)> | | [optional] +**client_id** | Option<**String**> | | [optional] +**client_secret** | Option<**String**> | | [optional] +**client_secret_file** | Option<**String**> | | [optional] +**endpoint_params** | Option<**std::collections::HashMap**> | | [optional] +**no_proxy** | Option<**String**> | NoProxy contains addresses that should not use a proxy. | [optional] +**proxy_connect_header** | Option<[**std::collections::HashMap>**](Vec.md)> | | [optional] +**proxy_from_environment** | Option<**bool**> | ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function to determine proxies. | [optional] +**proxy_url** | Option<[**models::Url**](URL.md)> | | [optional] +**scopes** | Option<**Vec**> | | [optional] +**token_url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/OpsGenieConfig.md b/openapi/docs/OpsGenieConfig.md new file mode 100755 index 00000000..3aaea6e5 --- /dev/null +++ b/openapi/docs/OpsGenieConfig.md @@ -0,0 +1,26 @@ +# OpsGenieConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**actions** | Option<**String**> | | [optional] +**api_key** | Option<**String**> | | [optional] +**api_key_file** | Option<**String**> | | [optional] +**api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**description** | Option<**String**> | | [optional] +**details** | Option<**std::collections::HashMap**> | | [optional] +**entity** | Option<**String**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message** | Option<**String**> | | [optional] +**note** | Option<**String**> | | [optional] +**priority** | Option<**String**> | | [optional] +**responders** | Option<[**Vec**](OpsGenieConfigResponder.md)> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**source** | Option<**String**> | | [optional] +**tags** | Option<**String**> | | [optional] +**update_alerts** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/OpsGenieConfigResponder.md b/openapi/docs/OpsGenieConfigResponder.md new file mode 100755 index 00000000..d21bf450 --- /dev/null +++ b/openapi/docs/OpsGenieConfigResponder.md @@ -0,0 +1,14 @@ +# OpsGenieConfigResponder + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**String**> | One of those 3 should be filled. | [optional] +**name** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | team, user, escalation, schedule etc. | [optional] +**username** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/OrgApi.md b/openapi/docs/OrgApi.md new file mode 100755 index 00000000..46ed5a0d --- /dev/null +++ b/openapi/docs/OrgApi.md @@ -0,0 +1,246 @@ +# \OrgApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_org_user_to_current_org**](OrgApi.md#add_org_user_to_current_org) | **POST** /org/users | Add a new user to the current organization. +[**get_current_org**](OrgApi.md#get_current_org) | **GET** /org | Get current Organization. +[**get_org_users_for_current_org**](OrgApi.md#get_org_users_for_current_org) | **GET** /org/users | Get all users within the current organization. +[**get_org_users_for_current_org_lookup**](OrgApi.md#get_org_users_for_current_org_lookup) | **GET** /org/users/lookup | Get all users within the current organization (lookup) +[**remove_org_user_for_current_org**](OrgApi.md#remove_org_user_for_current_org) | **DELETE** /org/users/{user_id} | Delete user in current organization. +[**update_current_org**](OrgApi.md#update_current_org) | **PUT** /org | Update current Organization. +[**update_current_org_address**](OrgApi.md#update_current_org_address) | **PUT** /org/address | Update current Organization's address. +[**update_org_user_for_current_org**](OrgApi.md#update_org_user_for_current_org) | **PATCH** /org/users/{user_id} | Updates the given user. + + + +## add_org_user_to_current_org + +> models::SuccessResponseBody add_org_user_to_current_org(add_org_user_command) +Add a new user to the current organization. + +Adds a global user to the current organization. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:add` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**add_org_user_command** | [**AddOrgUserCommand**](AddOrgUserCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_current_org + +> models::OrgDetailsDto get_current_org() +Get current Organization. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::OrgDetailsDto**](OrgDetailsDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_org_users_for_current_org + +> Vec get_org_users_for_current_org() +Get all users within the current organization. + +Returns all org users within the current organization. Accessible to users with org admin role. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:read` with scope `users:*`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](OrgUserDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_org_users_for_current_org_lookup + +> Vec get_org_users_for_current_org_lookup(query, limit) +Get all users within the current organization (lookup) + +Returns all org users within the current organization, but with less detailed information. Accessible to users with org admin role, admin in any folder or admin of any team. Mainly used by Grafana UI for providing list of users when adding team members and when editing folder/dashboard permissions. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query** | Option<**String**> | | | +**limit** | Option<**i64**> | | | + +### Return type + +[**Vec**](UserLookupDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_org_user_for_current_org + +> models::SuccessResponseBody remove_org_user_for_current_org(user_id) +Delete user in current organization. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:remove` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_current_org + +> models::SuccessResponseBody update_current_org(update_org_form) +Update current Organization. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**update_org_form** | [**UpdateOrgForm**](UpdateOrgForm.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_current_org_address + +> models::SuccessResponseBody update_current_org_address(update_org_address_form) +Update current Organization's address. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**update_org_address_form** | [**UpdateOrgAddressForm**](UpdateOrgAddressForm.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_org_user_for_current_org + +> models::SuccessResponseBody update_org_user_for_current_org(user_id, update_org_user_command) +Updates the given user. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users.role:update` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**update_org_user_command** | [**UpdateOrgUserCommand**](UpdateOrgUserCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/OrgDetailsDto.md b/openapi/docs/OrgDetailsDto.md new file mode 100755 index 00000000..1d0b847a --- /dev/null +++ b/openapi/docs/OrgDetailsDto.md @@ -0,0 +1,13 @@ +# OrgDetailsDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**address** | Option<[**models::Address**](Address.md)> | | [optional] +**id** | Option<**i64**> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/OrgDto.md b/openapi/docs/OrgDto.md new file mode 100755 index 00000000..70cc85a1 --- /dev/null +++ b/openapi/docs/OrgDto.md @@ -0,0 +1,12 @@ +# OrgDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/OrgInvitesApi.md b/openapi/docs/OrgInvitesApi.md new file mode 100755 index 00000000..e880cd7b --- /dev/null +++ b/openapi/docs/OrgInvitesApi.md @@ -0,0 +1,92 @@ +# \OrgInvitesApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_org_invite**](OrgInvitesApi.md#add_org_invite) | **POST** /org/invites | Add invite. +[**get_pending_org_invites**](OrgInvitesApi.md#get_pending_org_invites) | **GET** /org/invites | Get pending invites. +[**revoke_invite**](OrgInvitesApi.md#revoke_invite) | **DELETE** /org/invites/{invitation_code}/revoke | Revoke invite. + + + +## add_org_invite + +> models::SuccessResponseBody add_org_invite(add_invite_form) +Add invite. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**add_invite_form** | [**AddInviteForm**](AddInviteForm.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_pending_org_invites + +> Vec get_pending_org_invites() +Get pending invites. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](TempUserDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## revoke_invite + +> models::SuccessResponseBody revoke_invite(invitation_code) +Revoke invite. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**invitation_code** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/OrgPreferencesApi.md b/openapi/docs/OrgPreferencesApi.md new file mode 100755 index 00000000..6dc2967c --- /dev/null +++ b/openapi/docs/OrgPreferencesApi.md @@ -0,0 +1,92 @@ +# \OrgPreferencesApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_org_preferences**](OrgPreferencesApi.md#get_org_preferences) | **GET** /org/preferences | Get Current Org Prefs. +[**patch_org_preferences**](OrgPreferencesApi.md#patch_org_preferences) | **PATCH** /org/preferences | Patch Current Org Prefs. +[**update_org_preferences**](OrgPreferencesApi.md#update_org_preferences) | **PUT** /org/preferences | Update Current Org Prefs. + + + +## get_org_preferences + +> models::Preferences get_org_preferences() +Get Current Org Prefs. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::Preferences**](Preferences.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## patch_org_preferences + +> models::SuccessResponseBody patch_org_preferences(patch_prefs_cmd) +Patch Current Org Prefs. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**patch_prefs_cmd** | [**PatchPrefsCmd**](PatchPrefsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_org_preferences + +> models::SuccessResponseBody update_org_preferences(update_prefs_cmd) +Update Current Org Prefs. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**update_prefs_cmd** | [**UpdatePrefsCmd**](UpdatePrefsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/OrgUserDto.md b/openapi/docs/OrgUserDto.md new file mode 100755 index 00000000..b35a463d --- /dev/null +++ b/openapi/docs/OrgUserDto.md @@ -0,0 +1,23 @@ +# OrgUserDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_control** | Option<**std::collections::HashMap**> | | [optional] +**auth_labels** | Option<**Vec**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**email** | Option<**String**> | | [optional] +**is_disabled** | Option<**bool**> | | [optional] +**is_externally_synced** | Option<**bool**> | | [optional] +**last_seen_at** | Option<**String**> | | [optional] +**last_seen_at_age** | Option<**String**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**role** | Option<**String**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/OrgsApi.md b/openapi/docs/OrgsApi.md new file mode 100755 index 00000000..029a69ff --- /dev/null +++ b/openapi/docs/OrgsApi.md @@ -0,0 +1,441 @@ +# \OrgsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_org_user**](OrgsApi.md#add_org_user) | **POST** /orgs/{org_id}/users | Add a new user to the current organization. +[**create_org**](OrgsApi.md#create_org) | **POST** /orgs | Create Organization. +[**delete_org_by_id**](OrgsApi.md#delete_org_by_id) | **DELETE** /orgs/{org_id} | Delete Organization. +[**get_org_by_id**](OrgsApi.md#get_org_by_id) | **GET** /orgs/{org_id} | Get Organization by ID. +[**get_org_by_name**](OrgsApi.md#get_org_by_name) | **GET** /orgs/name/{org_name} | Get Organization by ID. +[**get_org_quota**](OrgsApi.md#get_org_quota) | **GET** /orgs/{org_id}/quotas | Fetch Organization quota. +[**get_org_users**](OrgsApi.md#get_org_users) | **GET** /orgs/{org_id}/users | Get Users in Organization. +[**remove_org_user**](OrgsApi.md#remove_org_user) | **DELETE** /orgs/{org_id}/users/{user_id} | Delete user in current organization. +[**search_org_users**](OrgsApi.md#search_org_users) | **GET** /orgs/{org_id}/users/search | Search Users in Organization. +[**search_orgs**](OrgsApi.md#search_orgs) | **GET** /orgs | Search all Organizations. +[**update_org**](OrgsApi.md#update_org) | **PUT** /orgs/{org_id} | Update Organization. +[**update_org_address**](OrgsApi.md#update_org_address) | **PUT** /orgs/{org_id}/address | Update Organization's address. +[**update_org_quota**](OrgsApi.md#update_org_quota) | **PUT** /orgs/{org_id}/quotas/{quota_target} | Update user quota. +[**update_org_user**](OrgsApi.md#update_org_user) | **PATCH** /orgs/{org_id}/users/{user_id} | Update Users in Organization. + + + +## add_org_user + +> models::SuccessResponseBody add_org_user(org_id, add_org_user_command) +Add a new user to the current organization. + +Adds a global user to the current organization. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:add` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | +**add_org_user_command** | [**AddOrgUserCommand**](AddOrgUserCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_org + +> models::CreateOrg200Response create_org(create_org_command) +Create Organization. + +Only works if [users.allow_org_create](https://grafana.com/docs/grafana/latest/administration/configuration/#allow_org_create) is set. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_org_command** | [**CreateOrgCommand**](CreateOrgCommand.md) | | [required] | + +### Return type + +[**models::CreateOrg200Response**](createOrg_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_org_by_id + +> models::SuccessResponseBody delete_org_by_id(org_id) +Delete Organization. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_org_by_id + +> models::OrgDetailsDto get_org_by_id(org_id) +Get Organization by ID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | + +### Return type + +[**models::OrgDetailsDto**](OrgDetailsDTO.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_org_by_name + +> models::OrgDetailsDto get_org_by_name(org_name) +Get Organization by ID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_name** | **String** | | [required] | + +### Return type + +[**models::OrgDetailsDto**](OrgDetailsDTO.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_org_quota + +> Vec get_org_quota(org_id) +Fetch Organization quota. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `orgs.quotas:read` and scope `org:id:1` (orgIDScope). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | + +### Return type + +[**Vec**](QuotaDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_org_users + +> Vec get_org_users(org_id) +Get Users in Organization. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:read` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | + +### Return type + +[**Vec**](OrgUserDTO.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_org_user + +> models::SuccessResponseBody remove_org_user(org_id, user_id) +Delete user in current organization. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:remove` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_org_users + +> models::SearchOrgUsersQueryResult search_org_users(org_id) +Search Users in Organization. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:read` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | + +### Return type + +[**models::SearchOrgUsersQueryResult**](SearchOrgUsersQueryResult.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_orgs + +> Vec search_orgs(page, perpage, name, query) +Search all Organizations. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**page** | Option<**i64**> | | |[default to 1] +**perpage** | Option<**i64**> | Number of items per page The totalCount field in the response can be used for pagination list E.g. if totalCount is equal to 100 teams and the perpage parameter is set to 10 then there are 10 pages of teams. | |[default to 1000] +**name** | Option<**String**> | | | +**query** | Option<**String**> | If set it will return results where the query value is contained in the name field. Query values with spaces need to be URL encoded. | | + +### Return type + +[**Vec**](OrgDTO.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_org + +> models::SuccessResponseBody update_org(org_id, update_org_form) +Update Organization. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | +**update_org_form** | [**UpdateOrgForm**](UpdateOrgForm.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_org_address + +> models::SuccessResponseBody update_org_address(org_id, update_org_address_form) +Update Organization's address. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | +**update_org_address_form** | [**UpdateOrgAddressForm**](UpdateOrgAddressForm.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_org_quota + +> models::SuccessResponseBody update_org_quota(quota_target, org_id, update_quota_cmd) +Update user quota. + +If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `orgs.quotas:write` and scope `org:id:1` (orgIDScope). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**quota_target** | **String** | | [required] | +**org_id** | **i64** | | [required] | +**update_quota_cmd** | [**UpdateQuotaCmd**](UpdateQuotaCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_org_user + +> models::SuccessResponseBody update_org_user(org_id, user_id, update_org_user_command) +Update Users in Organization. + +If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users.role:update` with scope `users:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | +**user_id** | **i64** | | [required] | +**update_org_user_command** | [**UpdateOrgUserCommand**](UpdateOrgUserCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/PagerdutyConfig.md b/openapi/docs/PagerdutyConfig.md new file mode 100755 index 00000000..7f73c05b --- /dev/null +++ b/openapi/docs/PagerdutyConfig.md @@ -0,0 +1,28 @@ +# PagerdutyConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**class** | Option<**String**> | | [optional] +**client** | Option<**String**> | | [optional] +**client_url** | Option<**String**> | | [optional] +**component** | Option<**String**> | | [optional] +**description** | Option<**String**> | | [optional] +**details** | Option<**std::collections::HashMap**> | | [optional] +**group** | Option<**String**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**images** | Option<[**Vec**](PagerdutyImage.md)> | | [optional] +**links** | Option<[**Vec**](PagerdutyLink.md)> | | [optional] +**routing_key** | Option<**String**> | | [optional] +**routing_key_file** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**service_key** | Option<**String**> | | [optional] +**service_key_file** | Option<**String**> | | [optional] +**severity** | Option<**String**> | | [optional] +**source** | Option<**String**> | | [optional] +**url** | Option<[**models::Url**](URL.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PagerdutyImage.md b/openapi/docs/PagerdutyImage.md new file mode 100755 index 00000000..8e1a1da1 --- /dev/null +++ b/openapi/docs/PagerdutyImage.md @@ -0,0 +1,13 @@ +# PagerdutyImage + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alt** | Option<**String**> | | [optional] +**href** | Option<**String**> | | [optional] +**src** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PagerdutyLink.md b/openapi/docs/PagerdutyLink.md new file mode 100755 index 00000000..f2e8f0f3 --- /dev/null +++ b/openapi/docs/PagerdutyLink.md @@ -0,0 +1,12 @@ +# PagerdutyLink + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**href** | Option<**String**> | | [optional] +**text** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PatchAnnotationsCmd.md b/openapi/docs/PatchAnnotationsCmd.md new file mode 100755 index 00000000..3b22f5d8 --- /dev/null +++ b/openapi/docs/PatchAnnotationsCmd.md @@ -0,0 +1,16 @@ +# PatchAnnotationsCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | Option<[**serde_json::Value**](.md)> | | [optional] +**id** | Option<**i64**> | | [optional] +**tags** | Option<**Vec**> | | [optional] +**text** | Option<**String**> | | [optional] +**time** | Option<**i64**> | | [optional] +**time_end** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PatchLibraryElementCommand.md b/openapi/docs/PatchLibraryElementCommand.md new file mode 100755 index 00000000..abf751f8 --- /dev/null +++ b/openapi/docs/PatchLibraryElementCommand.md @@ -0,0 +1,17 @@ +# PatchLibraryElementCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder_id** | Option<**i64**> | ID of the folder where the library element is stored. Deprecated: use FolderUID instead | [optional] +**folder_uid** | Option<**String**> | UID of the folder where the library element is stored. | [optional] +**kind** | Option<**i64**> | Kind of element to create, Use 1 for library panels or 2 for c. Description: 1 - library panels 2 - library variables | [optional] +**model** | Option<[**serde_json::Value**](.md)> | The JSON model for the library element. | [optional] +**name** | Option<**String**> | Name of the library element. | [optional] +**uid** | Option<**String**> | | [optional] +**version** | Option<**i64**> | Version of the library element you are updating. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PatchPrefsCmd.md b/openapi/docs/PatchPrefsCmd.md new file mode 100755 index 00000000..7e789444 --- /dev/null +++ b/openapi/docs/PatchPrefsCmd.md @@ -0,0 +1,18 @@ +# PatchPrefsCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**cookies** | Option<**Vec**> | | [optional] +**home_dashboard_id** | Option<**i64**> | The numerical :id of a favorited dashboard | [optional][default to 0] +**home_dashboard_uid** | Option<**String**> | | [optional] +**language** | Option<**String**> | | [optional] +**query_history** | Option<[**models::QueryHistoryPreference**](QueryHistoryPreference.md)> | | [optional] +**theme** | Option<**String**> | | [optional] +**timezone** | Option<**String**> | | [optional] +**week_start** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PatchQueryCommentInQueryHistoryCommand.md b/openapi/docs/PatchQueryCommentInQueryHistoryCommand.md new file mode 100755 index 00000000..00ff4a45 --- /dev/null +++ b/openapi/docs/PatchQueryCommentInQueryHistoryCommand.md @@ -0,0 +1,11 @@ +# PatchQueryCommentInQueryHistoryCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**comment** | Option<**String**> | Updated comment | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PeerStatus.md b/openapi/docs/PeerStatus.md new file mode 100755 index 00000000..b3756eb9 --- /dev/null +++ b/openapi/docs/PeerStatus.md @@ -0,0 +1,12 @@ +# PeerStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**address** | **String** | address | +**name** | **String** | name | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Permission.md b/openapi/docs/Permission.md new file mode 100755 index 00000000..d39055a4 --- /dev/null +++ b/openapi/docs/Permission.md @@ -0,0 +1,14 @@ +# Permission + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**action** | Option<**String**> | | [optional] +**created** | Option<**String**> | | [optional] +**scope** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Playlist.md b/openapi/docs/Playlist.md new file mode 100755 index 00000000..dcc57134 --- /dev/null +++ b/openapi/docs/Playlist.md @@ -0,0 +1,14 @@ +# Playlist + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**interval** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PlaylistDashboard.md b/openapi/docs/PlaylistDashboard.md new file mode 100755 index 00000000..53998c2f --- /dev/null +++ b/openapi/docs/PlaylistDashboard.md @@ -0,0 +1,16 @@ +# PlaylistDashboard + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**order** | Option<**i64**> | | [optional] +**slug** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**uri** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PlaylistDto.md b/openapi/docs/PlaylistDto.md new file mode 100755 index 00000000..35610412 --- /dev/null +++ b/openapi/docs/PlaylistDto.md @@ -0,0 +1,14 @@ +# PlaylistDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**interval** | Option<**String**> | Interval sets the time between switching views in a playlist. | [optional] +**items** | Option<[**Vec**](PlaylistItemDTO.md)> | The ordered list of items that the playlist will iterate over. | [optional] +**name** | Option<**String**> | Name of the playlist. | [optional] +**uid** | Option<**String**> | Unique playlist identifier. Generated on creation, either by the creator of the playlist of by the application. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PlaylistItem.md b/openapi/docs/PlaylistItem.md new file mode 100755 index 00000000..3f32a3e2 --- /dev/null +++ b/openapi/docs/PlaylistItem.md @@ -0,0 +1,16 @@ +# PlaylistItem + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**playlist_id** | Option<**i64**> | | [optional] +**order** | Option<**i64**> | | [optional] +**title** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**value** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PlaylistItemDto.md b/openapi/docs/PlaylistItemDto.md new file mode 100755 index 00000000..711d0c61 --- /dev/null +++ b/openapi/docs/PlaylistItemDto.md @@ -0,0 +1,13 @@ +# PlaylistItemDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**title** | Option<**String**> | Title is an unused property -- it will be removed in the future | [optional] +**r#type** | Option<**String**> | Type of the item. | [optional] +**value** | Option<**String**> | Value depends on type and describes the playlist item. dashboard_by_id: The value is an internal numerical identifier set by Grafana. This is not portable as the numerical identifier is non-deterministic between different instances. Will be replaced by dashboard_by_uid in the future. (deprecated) dashboard_by_tag: The value is a tag which is set on any number of dashboards. All dashboards behind the tag will be added to the playlist. dashboard_by_uid: The value is the dashboard UID | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PlaylistsApi.md b/openapi/docs/PlaylistsApi.md new file mode 100755 index 00000000..5bfd68d2 --- /dev/null +++ b/openapi/docs/PlaylistsApi.md @@ -0,0 +1,184 @@ +# \PlaylistsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_playlist**](PlaylistsApi.md#create_playlist) | **POST** /playlists | Create playlist. +[**delete_playlist**](PlaylistsApi.md#delete_playlist) | **DELETE** /playlists/{uid} | Delete playlist. +[**get_playlist**](PlaylistsApi.md#get_playlist) | **GET** /playlists/{uid} | Get playlist. +[**get_playlist_items**](PlaylistsApi.md#get_playlist_items) | **GET** /playlists/{uid}/items | Get playlist items. +[**search_playlists**](PlaylistsApi.md#search_playlists) | **GET** /playlists | Get playlists. +[**update_playlist**](PlaylistsApi.md#update_playlist) | **PUT** /playlists/{uid} | Update playlist. + + + +## create_playlist + +> models::Playlist create_playlist(create_playlist_command) +Create playlist. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_playlist_command** | [**CreatePlaylistCommand**](CreatePlaylistCommand.md) | | [required] | + +### Return type + +[**models::Playlist**](Playlist.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_playlist + +> models::SuccessResponseBody delete_playlist(uid) +Delete playlist. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_playlist + +> models::PlaylistDto get_playlist(uid) +Get playlist. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**models::PlaylistDto**](PlaylistDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_playlist_items + +> Vec get_playlist_items(uid) +Get playlist items. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | + +### Return type + +[**Vec**](PlaylistItemDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_playlists + +> Vec search_playlists(query, limit) +Get playlists. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query** | Option<**String**> | | | +**limit** | Option<**i64**> | in:limit | | + +### Return type + +[**Vec**](Playlist.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_playlist + +> models::PlaylistDto update_playlist(uid, update_playlist_command) +Update playlist. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | | [required] | +**update_playlist_command** | [**UpdatePlaylistCommand**](UpdatePlaylistCommand.md) | | [required] | + +### Return type + +[**models::PlaylistDto**](PlaylistDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/PostAnnotation200Response.md b/openapi/docs/PostAnnotation200Response.md new file mode 100755 index 00000000..7c367f2e --- /dev/null +++ b/openapi/docs/PostAnnotation200Response.md @@ -0,0 +1,12 @@ +# PostAnnotation200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **i64** | ID Identifier of the created annotation. | +**message** | **String** | Message Message of the created annotation. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostAnnotationsCmd.md b/openapi/docs/PostAnnotationsCmd.md new file mode 100755 index 00000000..9316e79c --- /dev/null +++ b/openapi/docs/PostAnnotationsCmd.md @@ -0,0 +1,18 @@ +# PostAnnotationsCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard_id** | Option<**i64**> | | [optional] +**dashboard_uid** | Option<**String**> | | [optional] +**data** | Option<[**serde_json::Value**](.md)> | | [optional] +**panel_id** | Option<**i64**> | | [optional] +**tags** | Option<**Vec**> | | [optional] +**text** | **String** | | +**time** | Option<**i64**> | | [optional] +**time_end** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostDashboard200Response.md b/openapi/docs/PostDashboard200Response.md new file mode 100755 index 00000000..7dddf195 --- /dev/null +++ b/openapi/docs/PostDashboard200Response.md @@ -0,0 +1,17 @@ +# PostDashboard200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder_uid** | Option<**String**> | FolderUID The unique identifier (uid) of the folder the dashboard belongs to. | [optional] +**id** | **i64** | ID The unique identifier (id) of the created/updated dashboard. | +**status** | **String** | Status status of the response. | +**title** | **String** | Slug The slug of the dashboard. | +**uid** | **String** | UID The unique identifier (uid) of the created/updated dashboard. | +**url** | **String** | URL The relative URL for accessing the created/updated dashboard. | +**version** | **i64** | Version The version of the dashboard. | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostGraphiteAnnotationsCmd.md b/openapi/docs/PostGraphiteAnnotationsCmd.md new file mode 100755 index 00000000..e6b98369 --- /dev/null +++ b/openapi/docs/PostGraphiteAnnotationsCmd.md @@ -0,0 +1,14 @@ +# PostGraphiteAnnotationsCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | Option<**String**> | | [optional] +**tags** | Option<[**serde_json::Value**](.md)> | | [optional] +**what** | Option<**String**> | | [optional] +**when** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostSilencesOkBody.md b/openapi/docs/PostSilencesOkBody.md new file mode 100755 index 00000000..82898e5c --- /dev/null +++ b/openapi/docs/PostSilencesOkBody.md @@ -0,0 +1,11 @@ +# PostSilencesOkBody + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**silence_id** | Option<**String**> | silence ID | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableAlert.md b/openapi/docs/PostableAlert.md new file mode 100755 index 00000000..aa4cc8d3 --- /dev/null +++ b/openapi/docs/PostableAlert.md @@ -0,0 +1,15 @@ +# PostableAlert + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotations** | Option<**std::collections::HashMap**> | LabelSet label set | [optional] +**ends_at** | Option<**String**> | ends at Format: date-time | [optional] +**generator_url** | Option<**String**> | generator URL Format: uri | [optional] +**labels** | **std::collections::HashMap** | LabelSet label set | +**starts_at** | Option<**String**> | starts at Format: date-time | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableApiAlertingConfig.md b/openapi/docs/PostableApiAlertingConfig.md new file mode 100755 index 00000000..42ee5a92 --- /dev/null +++ b/openapi/docs/PostableApiAlertingConfig.md @@ -0,0 +1,17 @@ +# PostableApiAlertingConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**global** | Option<[**models::GlobalConfig**](GlobalConfig.md)> | | [optional] +**inhibit_rules** | Option<[**Vec**](InhibitRule.md)> | | [optional] +**mute_time_intervals** | Option<[**Vec**](MuteTimeInterval.md)> | MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0. | [optional] +**receivers** | Option<[**Vec**](PostableApiReceiver.md)> | Override with our superset receiver type | [optional] +**route** | Option<[**models::Route**](Route.md)> | | [optional] +**templates** | Option<**Vec**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeInterval.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableApiReceiver.md b/openapi/docs/PostableApiReceiver.md new file mode 100755 index 00000000..68d4f050 --- /dev/null +++ b/openapi/docs/PostableApiReceiver.md @@ -0,0 +1,25 @@ +# PostableApiReceiver + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**discord_configs** | Option<[**Vec**](DiscordConfig.md)> | | [optional] +**email_configs** | Option<[**Vec**](EmailConfig.md)> | | [optional] +**grafana_managed_receiver_configs** | Option<[**Vec**](PostableGrafanaReceiver.md)> | | [optional] +**msteams_configs** | Option<[**Vec**](MSTeamsConfig.md)> | | [optional] +**name** | Option<**String**> | A unique identifier for this receiver. | [optional] +**opsgenie_configs** | Option<[**Vec**](OpsGenieConfig.md)> | | [optional] +**pagerduty_configs** | Option<[**Vec**](PagerdutyConfig.md)> | | [optional] +**pushover_configs** | Option<[**Vec**](PushoverConfig.md)> | | [optional] +**slack_configs** | Option<[**Vec**](SlackConfig.md)> | | [optional] +**sns_configs** | Option<[**Vec**](SNSConfig.md)> | | [optional] +**telegram_configs** | Option<[**Vec**](TelegramConfig.md)> | | [optional] +**victorops_configs** | Option<[**Vec**](VictorOpsConfig.md)> | | [optional] +**webex_configs** | Option<[**Vec**](WebexConfig.md)> | | [optional] +**webhook_configs** | Option<[**Vec**](WebhookConfig.md)> | | [optional] +**wechat_configs** | Option<[**Vec**](WechatConfig.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableExtendedRuleNode.md b/openapi/docs/PostableExtendedRuleNode.md new file mode 100755 index 00000000..3d9fbac6 --- /dev/null +++ b/openapi/docs/PostableExtendedRuleNode.md @@ -0,0 +1,18 @@ +# PostableExtendedRuleNode + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alert** | Option<**String**> | | [optional] +**annotations** | Option<**std::collections::HashMap**> | | [optional] +**expr** | Option<**String**> | | [optional] +**r#for** | Option<**String**> | | [optional] +**grafana_alert** | Option<[**models::PostableGrafanaRule**](PostableGrafanaRule.md)> | | [optional] +**keep_firing_for** | Option<**String**> | | [optional] +**labels** | Option<**std::collections::HashMap**> | | [optional] +**record** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableExtendedRuleNodeExtended.md b/openapi/docs/PostableExtendedRuleNodeExtended.md new file mode 100755 index 00000000..c5f2795d --- /dev/null +++ b/openapi/docs/PostableExtendedRuleNodeExtended.md @@ -0,0 +1,14 @@ +# PostableExtendedRuleNodeExtended + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder_title** | Option<**String**> | | [optional] +**folder_uid** | Option<**String**> | | [optional] +**rule** | [**models::PostableExtendedRuleNode**](PostableExtendedRuleNode.md) | | +**rule_group** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableGrafanaReceiver.md b/openapi/docs/PostableGrafanaReceiver.md new file mode 100755 index 00000000..0458b14c --- /dev/null +++ b/openapi/docs/PostableGrafanaReceiver.md @@ -0,0 +1,16 @@ +# PostableGrafanaReceiver + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**disable_resolve_message** | Option<**bool**> | | [optional] +**name** | Option<**String**> | | [optional] +**secure_settings** | Option<**std::collections::HashMap**> | | [optional] +**settings** | Option<[**serde_json::Value**](.md)> | | [optional] +**r#type** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableGrafanaReceivers.md b/openapi/docs/PostableGrafanaReceivers.md new file mode 100755 index 00000000..e623e542 --- /dev/null +++ b/openapi/docs/PostableGrafanaReceivers.md @@ -0,0 +1,11 @@ +# PostableGrafanaReceivers + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**grafana_managed_receiver_configs** | Option<[**Vec**](PostableGrafanaReceiver.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableGrafanaRule.md b/openapi/docs/PostableGrafanaRule.md new file mode 100755 index 00000000..637936c9 --- /dev/null +++ b/openapi/docs/PostableGrafanaRule.md @@ -0,0 +1,18 @@ +# PostableGrafanaRule + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**condition** | Option<**String**> | | [optional] +**data** | Option<[**Vec**](AlertQuery.md)> | | [optional] +**exec_err_state** | Option<**String**> | | [optional] +**is_paused** | Option<**bool**> | | [optional] +**no_data_state** | Option<**String**> | | [optional] +**notification_settings** | Option<[**models::AlertRuleNotificationSettings**](AlertRuleNotificationSettings.md)> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableNGalertConfig.md b/openapi/docs/PostableNGalertConfig.md new file mode 100755 index 00000000..732c350f --- /dev/null +++ b/openapi/docs/PostableNGalertConfig.md @@ -0,0 +1,11 @@ +# PostableNGalertConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alertmanagers_choice** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableRuleGroupConfig.md b/openapi/docs/PostableRuleGroupConfig.md new file mode 100755 index 00000000..2cbab3c9 --- /dev/null +++ b/openapi/docs/PostableRuleGroupConfig.md @@ -0,0 +1,13 @@ +# PostableRuleGroupConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**interval** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**name** | Option<**String**> | | [optional] +**rules** | Option<[**Vec**](PostableExtendedRuleNode.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableSilence.md b/openapi/docs/PostableSilence.md new file mode 100755 index 00000000..03c08b2d --- /dev/null +++ b/openapi/docs/PostableSilence.md @@ -0,0 +1,16 @@ +# PostableSilence + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**comment** | **String** | comment | +**created_by** | **String** | created by | +**ends_at** | **String** | ends at | +**id** | Option<**String**> | id | [optional] +**matchers** | [**Vec**](matcher.md) | Matchers matchers | +**starts_at** | **String** | starts at | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableTimeIntervals.md b/openapi/docs/PostableTimeIntervals.md new file mode 100755 index 00000000..c9df9b21 --- /dev/null +++ b/openapi/docs/PostableTimeIntervals.md @@ -0,0 +1,12 @@ +# PostableTimeIntervals + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeIntervalItem.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PostableUserConfig.md b/openapi/docs/PostableUserConfig.md new file mode 100755 index 00000000..2588825e --- /dev/null +++ b/openapi/docs/PostableUserConfig.md @@ -0,0 +1,12 @@ +# PostableUserConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alertmanager_config** | Option<[**models::PostableApiAlertingConfig**](PostableApiAlertingConfig.md)> | | [optional] +**template_files** | Option<**std::collections::HashMap**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Preferences.md b/openapi/docs/Preferences.md new file mode 100755 index 00000000..04d76eca --- /dev/null +++ b/openapi/docs/Preferences.md @@ -0,0 +1,17 @@ +# Preferences + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**cookie_preferences** | Option<[**models::CookiePreferences**](CookiePreferences.md)> | | [optional] +**home_dashboard_uid** | Option<**String**> | UID for the home dashboard | [optional] +**language** | Option<**String**> | Selected language (beta) | [optional] +**query_history** | Option<[**models::QueryHistoryPreference**](QueryHistoryPreference.md)> | | [optional] +**theme** | Option<**String**> | Theme light, dark, empty is default | [optional] +**timezone** | Option<**String**> | The timezone selection TODO: this should use the timezone defined in common | [optional] +**week_start** | Option<**String**> | WeekStart day of the week (sunday, monday, etc) | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PrometheusRemoteWriteTargetJson.md b/openapi/docs/PrometheusRemoteWriteTargetJson.md new file mode 100755 index 00000000..bbf6817d --- /dev/null +++ b/openapi/docs/PrometheusRemoteWriteTargetJson.md @@ -0,0 +1,13 @@ +# PrometheusRemoteWriteTargetJson + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data_source_uid** | Option<**String**> | | [optional] +**id** | Option<**String**> | | [optional] +**remote_write_path** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ProvisionedAlertRule.md b/openapi/docs/ProvisionedAlertRule.md new file mode 100755 index 00000000..27a291a1 --- /dev/null +++ b/openapi/docs/ProvisionedAlertRule.md @@ -0,0 +1,27 @@ +# ProvisionedAlertRule + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotations** | Option<**std::collections::HashMap**> | | [optional] +**condition** | **String** | | +**data** | [**Vec**](AlertQuery.md) | | +**exec_err_state** | **String** | | +**folder_uid** | **String** | | +**r#for** | **i64** | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | +**id** | Option<**i64**> | | [optional] +**is_paused** | Option<**bool**> | | [optional] +**labels** | Option<**std::collections::HashMap**> | | [optional] +**no_data_state** | **String** | | +**notification_settings** | Option<[**models::AlertRuleNotificationSettings**](AlertRuleNotificationSettings.md)> | | [optional] +**org_id** | **i64** | | +**provenance** | Option<**String**> | | [optional] +**rule_group** | **String** | | +**title** | **String** | | +**uid** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional][readonly] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ProvisioningApi.md b/openapi/docs/ProvisioningApi.md new file mode 100755 index 00000000..7eabc7f6 --- /dev/null +++ b/openapi/docs/ProvisioningApi.md @@ -0,0 +1,924 @@ +# \ProvisioningApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**route_delete_alert_rule**](ProvisioningApi.md#route_delete_alert_rule) | **DELETE** /v1/provisioning/alert-rules/{UID} | Delete a specific alert rule by UID. +[**route_delete_alert_rule_group**](ProvisioningApi.md#route_delete_alert_rule_group) | **DELETE** /v1/provisioning/folder/{FolderUID}/rule-groups/{Group} | +[**route_delete_contactpoints**](ProvisioningApi.md#route_delete_contactpoints) | **DELETE** /v1/provisioning/contact-points/{UID} | Delete a contact point. +[**route_delete_mute_timing**](ProvisioningApi.md#route_delete_mute_timing) | **DELETE** /v1/provisioning/mute-timings/{name} | Delete a mute timing. +[**route_delete_template**](ProvisioningApi.md#route_delete_template) | **DELETE** /v1/provisioning/templates/{name} | Delete a template. +[**route_export_mute_timing**](ProvisioningApi.md#route_export_mute_timing) | **GET** /v1/provisioning/mute-timings/{name}/export | Export a mute timing in provisioning format. +[**route_export_mute_timings**](ProvisioningApi.md#route_export_mute_timings) | **GET** /v1/provisioning/mute-timings/export | Export all mute timings in provisioning format. +[**route_get_alert_rule**](ProvisioningApi.md#route_get_alert_rule) | **GET** /v1/provisioning/alert-rules/{UID} | Get a specific alert rule by UID. +[**route_get_alert_rule_export**](ProvisioningApi.md#route_get_alert_rule_export) | **GET** /v1/provisioning/alert-rules/{UID}/export | Export an alert rule in provisioning file format. +[**route_get_alert_rule_group**](ProvisioningApi.md#route_get_alert_rule_group) | **GET** /v1/provisioning/folder/{FolderUID}/rule-groups/{Group} | Get a rule group. +[**route_get_alert_rule_group_export**](ProvisioningApi.md#route_get_alert_rule_group_export) | **GET** /v1/provisioning/folder/{FolderUID}/rule-groups/{Group}/export | Export an alert rule group in provisioning file format. +[**route_get_alert_rules**](ProvisioningApi.md#route_get_alert_rules) | **GET** /v1/provisioning/alert-rules | Get all the alert rules. +[**route_get_alert_rules_export**](ProvisioningApi.md#route_get_alert_rules_export) | **GET** /v1/provisioning/alert-rules/export | Export all alert rules in provisioning file format. +[**route_get_contactpoints**](ProvisioningApi.md#route_get_contactpoints) | **GET** /v1/provisioning/contact-points | Get all the contact points. +[**route_get_contactpoints_export**](ProvisioningApi.md#route_get_contactpoints_export) | **GET** /v1/provisioning/contact-points/export | Export all contact points in provisioning file format. +[**route_get_mute_timing**](ProvisioningApi.md#route_get_mute_timing) | **GET** /v1/provisioning/mute-timings/{name} | Get a mute timing. +[**route_get_mute_timings**](ProvisioningApi.md#route_get_mute_timings) | **GET** /v1/provisioning/mute-timings | Get all the mute timings. +[**route_get_policy_tree**](ProvisioningApi.md#route_get_policy_tree) | **GET** /v1/provisioning/policies | Get the notification policy tree. +[**route_get_policy_tree_export**](ProvisioningApi.md#route_get_policy_tree_export) | **GET** /v1/provisioning/policies/export | Export the notification policy tree in provisioning file format. +[**route_get_template**](ProvisioningApi.md#route_get_template) | **GET** /v1/provisioning/templates/{name} | Get a notification template. +[**route_get_templates**](ProvisioningApi.md#route_get_templates) | **GET** /v1/provisioning/templates | Get all notification templates. +[**route_post_alert_rule**](ProvisioningApi.md#route_post_alert_rule) | **POST** /v1/provisioning/alert-rules | Create a new alert rule. +[**route_post_contactpoints**](ProvisioningApi.md#route_post_contactpoints) | **POST** /v1/provisioning/contact-points | Create a contact point. +[**route_post_mute_timing**](ProvisioningApi.md#route_post_mute_timing) | **POST** /v1/provisioning/mute-timings | Create a new mute timing. +[**route_put_alert_rule**](ProvisioningApi.md#route_put_alert_rule) | **PUT** /v1/provisioning/alert-rules/{UID} | Update an existing alert rule. +[**route_put_alert_rule_group**](ProvisioningApi.md#route_put_alert_rule_group) | **PUT** /v1/provisioning/folder/{FolderUID}/rule-groups/{Group} | Create or update alert rule group. +[**route_put_contactpoint**](ProvisioningApi.md#route_put_contactpoint) | **PUT** /v1/provisioning/contact-points/{UID} | Update an existing contact point. +[**route_put_mute_timing**](ProvisioningApi.md#route_put_mute_timing) | **PUT** /v1/provisioning/mute-timings/{name} | Replace an existing mute timing. +[**route_put_policy_tree**](ProvisioningApi.md#route_put_policy_tree) | **PUT** /v1/provisioning/policies | Sets the notification policy tree. +[**route_put_template**](ProvisioningApi.md#route_put_template) | **PUT** /v1/provisioning/templates/{name} | Updates an existing notification template. +[**route_reset_policy_tree**](ProvisioningApi.md#route_reset_policy_tree) | **DELETE** /v1/provisioning/policies | Clears the notification policy tree. + + + +## route_delete_alert_rule + +> route_delete_alert_rule(uid, x_disable_provenance) +Delete a specific alert rule by UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | Alert rule UID | [required] | +**x_disable_provenance** | Option<**String**> | | | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_delete_alert_rule_group + +> route_delete_alert_rule_group(folder_uid, group) + + +Delete rule group + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**group** | **String** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_delete_contactpoints + +> route_delete_contactpoints(uid) +Delete a contact point. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | UID is the contact point unique identifier | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_delete_mute_timing + +> route_delete_mute_timing(name) +Delete a mute timing. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | Mute timing name | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_delete_template + +> route_delete_template(name) +Delete a template. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | Template Name | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: Not defined + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_export_mute_timing + +> models::AlertingFileExport route_export_mute_timing(name, download, format) +Export a mute timing in provisioning format. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | Mute timing name | [required] | +**download** | Option<**bool**> | Whether to initiate a download of the file or not. | |[default to false] +**format** | Option<**String**> | Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | |[default to yaml] + +### Return type + +[**models::AlertingFileExport**](AlertingFileExport.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/terraform+hcl, application/yaml, text/hcl, text/yaml + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_export_mute_timings + +> models::AlertingFileExport route_export_mute_timings(download, format) +Export all mute timings in provisioning format. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**download** | Option<**bool**> | Whether to initiate a download of the file or not. | |[default to false] +**format** | Option<**String**> | Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | |[default to yaml] + +### Return type + +[**models::AlertingFileExport**](AlertingFileExport.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/terraform+hcl, application/yaml, text/hcl, text/yaml + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_alert_rule + +> models::ProvisionedAlertRule route_get_alert_rule(uid) +Get a specific alert rule by UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | Alert rule UID | [required] | + +### Return type + +[**models::ProvisionedAlertRule**](ProvisionedAlertRule.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_alert_rule_export + +> models::AlertingFileExport route_get_alert_rule_export(uid, download, format) +Export an alert rule in provisioning file format. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | Alert rule UID | [required] | +**download** | Option<**bool**> | Whether to initiate a download of the file or not. | |[default to false] +**format** | Option<**String**> | Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | |[default to yaml] + +### Return type + +[**models::AlertingFileExport**](AlertingFileExport.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/terraform+hcl, application/yaml, text/hcl, text/yaml + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_alert_rule_group + +> models::AlertRuleGroup route_get_alert_rule_group(folder_uid, group) +Get a rule group. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**group** | **String** | | [required] | + +### Return type + +[**models::AlertRuleGroup**](AlertRuleGroup.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_alert_rule_group_export + +> models::AlertingFileExport route_get_alert_rule_group_export(folder_uid, group, download, format) +Export an alert rule group in provisioning file format. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**group** | **String** | | [required] | +**download** | Option<**bool**> | Whether to initiate a download of the file or not. | |[default to false] +**format** | Option<**String**> | Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | |[default to yaml] + +### Return type + +[**models::AlertingFileExport**](AlertingFileExport.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/terraform+hcl, application/yaml, text/hcl, text/yaml + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_alert_rules + +> Vec route_get_alert_rules() +Get all the alert rules. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](ProvisionedAlertRule.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_alert_rules_export + +> models::AlertingFileExport route_get_alert_rules_export(download, format, folder_uid, group, rule_uid) +Export all alert rules in provisioning file format. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**download** | Option<**bool**> | Whether to initiate a download of the file or not. | |[default to false] +**format** | Option<**String**> | Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | |[default to yaml] +**folder_uid** | Option<[**Vec**](String.md)> | UIDs of folders from which to export rules | | +**group** | Option<**String**> | Name of group of rules to export. Must be specified only together with a single folder UID | | +**rule_uid** | Option<**String**> | UID of alert rule to export. If specified, parameters folderUid and group must be empty. | | + +### Return type + +[**models::AlertingFileExport**](AlertingFileExport.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/terraform+hcl, application/yaml, text/hcl, text/yaml + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_contactpoints + +> Vec route_get_contactpoints(name) +Get all the contact points. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | Option<**String**> | Filter by name | | + +### Return type + +[**Vec**](EmbeddedContactPoint.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_contactpoints_export + +> models::AlertingFileExport route_get_contactpoints_export(download, format, decrypt, name) +Export all contact points in provisioning file format. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**download** | Option<**bool**> | Whether to initiate a download of the file or not. | |[default to false] +**format** | Option<**String**> | Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | |[default to yaml] +**decrypt** | Option<**bool**> | Whether any contained secure settings should be decrypted or left redacted. Redacted settings will contain RedactedValue instead. Currently, only org admin can view decrypted secure settings. | |[default to false] +**name** | Option<**String**> | Filter by name | | + +### Return type + +[**models::AlertingFileExport**](AlertingFileExport.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/terraform+hcl, application/yaml, text/hcl, text/yaml + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_mute_timing + +> models::MuteTimeInterval route_get_mute_timing(name) +Get a mute timing. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | Mute timing name | [required] | + +### Return type + +[**models::MuteTimeInterval**](MuteTimeInterval.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_mute_timings + +> Vec route_get_mute_timings() +Get all the mute timings. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](MuteTimeInterval.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_policy_tree + +> models::Route route_get_policy_tree() +Get the notification policy tree. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::Route**](Route.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_policy_tree_export + +> models::AlertingFileExport route_get_policy_tree_export() +Export the notification policy tree in provisioning file format. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::AlertingFileExport**](AlertingFileExport.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json, application/terraform+hcl, application/yaml, text/hcl, text/yaml + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_template + +> models::NotificationTemplate route_get_template(name) +Get a notification template. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | Template Name | [required] | + +### Return type + +[**models::NotificationTemplate**](NotificationTemplate.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_get_templates + +> Vec route_get_templates() +Get all notification templates. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](NotificationTemplate.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_post_alert_rule + +> models::ProvisionedAlertRule route_post_alert_rule(x_disable_provenance, provisioned_alert_rule) +Create a new alert rule. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**x_disable_provenance** | Option<**String**> | | | +**provisioned_alert_rule** | Option<[**ProvisionedAlertRule**](ProvisionedAlertRule.md)> | | | + +### Return type + +[**models::ProvisionedAlertRule**](ProvisionedAlertRule.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_post_contactpoints + +> models::EmbeddedContactPoint route_post_contactpoints(x_disable_provenance, embedded_contact_point) +Create a contact point. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**x_disable_provenance** | Option<**String**> | | | +**embedded_contact_point** | Option<[**EmbeddedContactPoint**](EmbeddedContactPoint.md)> | | | + +### Return type + +[**models::EmbeddedContactPoint**](EmbeddedContactPoint.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_post_mute_timing + +> models::MuteTimeInterval route_post_mute_timing(x_disable_provenance, mute_time_interval) +Create a new mute timing. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**x_disable_provenance** | Option<**String**> | | | +**mute_time_interval** | Option<[**MuteTimeInterval**](MuteTimeInterval.md)> | | | + +### Return type + +[**models::MuteTimeInterval**](MuteTimeInterval.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_put_alert_rule + +> models::ProvisionedAlertRule route_put_alert_rule(uid, x_disable_provenance, provisioned_alert_rule) +Update an existing alert rule. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | Alert rule UID | [required] | +**x_disable_provenance** | Option<**String**> | | | +**provisioned_alert_rule** | Option<[**ProvisionedAlertRule**](ProvisionedAlertRule.md)> | | | + +### Return type + +[**models::ProvisionedAlertRule**](ProvisionedAlertRule.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_put_alert_rule_group + +> models::AlertRuleGroup route_put_alert_rule_group(folder_uid, group, x_disable_provenance, alert_rule_group) +Create or update alert rule group. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**folder_uid** | **String** | | [required] | +**group** | **String** | | [required] | +**x_disable_provenance** | Option<**String**> | | | +**alert_rule_group** | Option<[**AlertRuleGroup**](AlertRuleGroup.md)> | | | + +### Return type + +[**models::AlertRuleGroup**](AlertRuleGroup.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_put_contactpoint + +> serde_json::Value route_put_contactpoint(uid, x_disable_provenance, embedded_contact_point) +Update an existing contact point. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**uid** | **String** | UID is the contact point unique identifier | [required] | +**x_disable_provenance** | Option<**String**> | | | +**embedded_contact_point** | Option<[**EmbeddedContactPoint**](EmbeddedContactPoint.md)> | | | + +### Return type + +[**serde_json::Value**](serde_json::Value.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_put_mute_timing + +> models::MuteTimeInterval route_put_mute_timing(name, x_disable_provenance, mute_time_interval) +Replace an existing mute timing. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | Mute timing name | [required] | +**x_disable_provenance** | Option<**String**> | | | +**mute_time_interval** | Option<[**MuteTimeInterval**](MuteTimeInterval.md)> | | | + +### Return type + +[**models::MuteTimeInterval**](MuteTimeInterval.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_put_policy_tree + +> serde_json::Value route_put_policy_tree(x_disable_provenance, route) +Sets the notification policy tree. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**x_disable_provenance** | Option<**String**> | | | +**route** | Option<[**Route**](Route.md)> | The new notification routing tree to use | | + +### Return type + +[**serde_json::Value**](serde_json::Value.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_put_template + +> models::NotificationTemplate route_put_template(name, x_disable_provenance, notification_template_content) +Updates an existing notification template. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**name** | **String** | Template Name | [required] | +**x_disable_provenance** | Option<**String**> | | | +**notification_template_content** | Option<[**NotificationTemplateContent**](NotificationTemplateContent.md)> | | | + +### Return type + +[**models::NotificationTemplate**](NotificationTemplate.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## route_reset_policy_tree + +> serde_json::Value route_reset_policy_tree() +Clears the notification policy tree. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**serde_json::Value**](serde_json::Value.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/ProxyConfig.md b/openapi/docs/ProxyConfig.md new file mode 100755 index 00000000..6f998057 --- /dev/null +++ b/openapi/docs/ProxyConfig.md @@ -0,0 +1,14 @@ +# ProxyConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**no_proxy** | Option<**String**> | NoProxy contains addresses that should not use a proxy. | [optional] +**proxy_connect_header** | Option<[**std::collections::HashMap>**](Vec.md)> | | [optional] +**proxy_from_environment** | Option<**bool**> | ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function to determine proxies. | [optional] +**proxy_url** | Option<[**models::Url**](URL.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PublicDashboard.md b/openapi/docs/PublicDashboard.md new file mode 100755 index 00000000..0173c616 --- /dev/null +++ b/openapi/docs/PublicDashboard.md @@ -0,0 +1,22 @@ +# PublicDashboard + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_token** | Option<**String**> | | [optional] +**annotations_enabled** | Option<**bool**> | | [optional] +**created_at** | Option<**String**> | | [optional] +**created_by** | Option<**i64**> | | [optional] +**dashboard_uid** | Option<**String**> | | [optional] +**is_enabled** | Option<**bool**> | | [optional] +**recipients** | Option<[**Vec**](EmailDTO.md)> | | [optional] +**share** | Option<**String**> | | [optional] +**time_selection_enabled** | Option<**bool**> | | [optional] +**uid** | Option<**String**> | | [optional] +**updated_at** | Option<**String**> | | [optional] +**updated_by** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PublicDashboardDto.md b/openapi/docs/PublicDashboardDto.md new file mode 100755 index 00000000..0a446775 --- /dev/null +++ b/openapi/docs/PublicDashboardDto.md @@ -0,0 +1,16 @@ +# PublicDashboardDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_token** | Option<**String**> | | [optional] +**annotations_enabled** | Option<**bool**> | | [optional] +**is_enabled** | Option<**bool**> | | [optional] +**share** | Option<**String**> | | [optional] +**time_selection_enabled** | Option<**bool**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PublicDashboardListResponse.md b/openapi/docs/PublicDashboardListResponse.md new file mode 100755 index 00000000..b9fdba35 --- /dev/null +++ b/openapi/docs/PublicDashboardListResponse.md @@ -0,0 +1,16 @@ +# PublicDashboardListResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_token** | Option<**String**> | | [optional] +**dashboard_uid** | Option<**String**> | | [optional] +**is_enabled** | Option<**bool**> | | [optional] +**slug** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PublicDashboardListResponseWithPagination.md b/openapi/docs/PublicDashboardListResponseWithPagination.md new file mode 100755 index 00000000..4ed45c8f --- /dev/null +++ b/openapi/docs/PublicDashboardListResponseWithPagination.md @@ -0,0 +1,14 @@ +# PublicDashboardListResponseWithPagination + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**public_dashboards** | Option<[**Vec**](PublicDashboardListResponse.md)> | | [optional] +**total_count** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PublicError.md b/openapi/docs/PublicError.md new file mode 100755 index 00000000..c2d41758 --- /dev/null +++ b/openapi/docs/PublicError.md @@ -0,0 +1,14 @@ +# PublicError + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**extra** | Option<[**serde_json::Value**](.md)> | Extra Additional information about the error | [optional] +**message** | Option<**String**> | Message A human readable message | [optional] +**message_id** | **String** | MessageID A unique identifier for the error | +**status_code** | **i64** | StatusCode The HTTP status code returned | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/PushoverConfig.md b/openapi/docs/PushoverConfig.md new file mode 100755 index 00000000..267e4a35 --- /dev/null +++ b/openapi/docs/PushoverConfig.md @@ -0,0 +1,27 @@ +# PushoverConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**device** | Option<**String**> | | [optional] +**expire** | Option<**String**> | | [optional] +**html** | Option<**bool**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message** | Option<**String**> | | [optional] +**priority** | Option<**String**> | | [optional] +**retry** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**sound** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**token** | Option<**String**> | | [optional] +**token_file** | Option<**String**> | | [optional] +**ttl** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**url_title** | Option<**String**> | | [optional] +**user_key** | Option<**String**> | | [optional] +**user_key_file** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryDataResponse.md b/openapi/docs/QueryDataResponse.md new file mode 100755 index 00000000..f6f65da2 --- /dev/null +++ b/openapi/docs/QueryDataResponse.md @@ -0,0 +1,11 @@ +# QueryDataResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**results** | Option<[**std::collections::HashMap**](DataResponse.md)> | The QueryData method the QueryDataHandler method will set the RefId property on the DataResponses' frames based on these RefIDs. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryHistoryApi.md b/openapi/docs/QueryHistoryApi.md new file mode 100755 index 00000000..bfbf7648 --- /dev/null +++ b/openapi/docs/QueryHistoryApi.md @@ -0,0 +1,202 @@ +# \QueryHistoryApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_query**](QueryHistoryApi.md#create_query) | **POST** /query-history | Add query to query history. +[**delete_query**](QueryHistoryApi.md#delete_query) | **DELETE** /query-history/{query_history_uid} | Delete query in query history. +[**patch_query_comment**](QueryHistoryApi.md#patch_query_comment) | **PATCH** /query-history/{query_history_uid} | Update comment for query in query history. +[**search_queries**](QueryHistoryApi.md#search_queries) | **GET** /query-history | Query history search. +[**star_query**](QueryHistoryApi.md#star_query) | **POST** /query-history/star/{query_history_uid} | Add star to query in query history. +[**unstar_query**](QueryHistoryApi.md#unstar_query) | **DELETE** /query-history/star/{query_history_uid} | Remove star to query in query history. + + + +## create_query + +> models::QueryHistoryResponse create_query(create_query_in_query_history_command) +Add query to query history. + +Adds new query to query history. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_query_in_query_history_command** | [**CreateQueryInQueryHistoryCommand**](CreateQueryInQueryHistoryCommand.md) | | [required] | + +### Return type + +[**models::QueryHistoryResponse**](QueryHistoryResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_query + +> models::QueryHistoryDeleteQueryResponse delete_query(query_history_uid) +Delete query in query history. + +Deletes an existing query in query history as specified by the UID. This operation cannot be reverted. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query_history_uid** | **String** | | [required] | + +### Return type + +[**models::QueryHistoryDeleteQueryResponse**](QueryHistoryDeleteQueryResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## patch_query_comment + +> models::QueryHistoryResponse patch_query_comment(query_history_uid, patch_query_comment_in_query_history_command) +Update comment for query in query history. + +Updates comment for query in query history as specified by the UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query_history_uid** | **String** | | [required] | +**patch_query_comment_in_query_history_command** | [**PatchQueryCommentInQueryHistoryCommand**](PatchQueryCommentInQueryHistoryCommand.md) | | [required] | + +### Return type + +[**models::QueryHistoryResponse**](QueryHistoryResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_queries + +> models::QueryHistorySearchResponse search_queries(datasource_uid, search_string, only_starred, sort, page, limit, from, to) +Query history search. + +Returns a list of queries in the query history that matches the search criteria. Query history search supports pagination. Use the `limit` parameter to control the maximum number of queries returned; the default limit is 100. You can also use the `page` query parameter to fetch queries from any page other than the first one. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**datasource_uid** | Option<[**Vec**](String.md)> | List of data source UIDs to search for | | +**search_string** | Option<**String**> | Text inside query or comments that is searched for | | +**only_starred** | Option<**bool**> | Flag indicating if only starred queries should be returned | | +**sort** | Option<**String**> | Sort method | |[default to time-desc] +**page** | Option<**i64**> | Use this parameter to access hits beyond limit. Numbering starts at 1. limit param acts as page size. | | +**limit** | Option<**i64**> | Limit the number of returned results | | +**from** | Option<**i64**> | From range for the query history search | | +**to** | Option<**i64**> | To range for the query history search | | + +### Return type + +[**models::QueryHistorySearchResponse**](QueryHistorySearchResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## star_query + +> models::QueryHistoryResponse star_query(query_history_uid) +Add star to query in query history. + +Adds star to query in query history as specified by the UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query_history_uid** | **String** | | [required] | + +### Return type + +[**models::QueryHistoryResponse**](QueryHistoryResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## unstar_query + +> models::QueryHistoryResponse unstar_query(query_history_uid) +Remove star to query in query history. + +Removes star from query in query history as specified by the UID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query_history_uid** | **String** | | [required] | + +### Return type + +[**models::QueryHistoryResponse**](QueryHistoryResponse.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/QueryHistoryDeleteQueryResponse.md b/openapi/docs/QueryHistoryDeleteQueryResponse.md new file mode 100755 index 00000000..4bea14f9 --- /dev/null +++ b/openapi/docs/QueryHistoryDeleteQueryResponse.md @@ -0,0 +1,12 @@ +# QueryHistoryDeleteQueryResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**message** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryHistoryDto.md b/openapi/docs/QueryHistoryDto.md new file mode 100755 index 00000000..05a5afd5 --- /dev/null +++ b/openapi/docs/QueryHistoryDto.md @@ -0,0 +1,17 @@ +# QueryHistoryDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**comment** | Option<**String**> | | [optional] +**created_at** | Option<**i64**> | | [optional] +**created_by** | Option<**i64**> | | [optional] +**datasource_uid** | Option<**String**> | | [optional] +**queries** | Option<[**serde_json::Value**](.md)> | | [optional] +**starred** | Option<**bool**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryHistoryPreference.md b/openapi/docs/QueryHistoryPreference.md new file mode 100755 index 00000000..b068170c --- /dev/null +++ b/openapi/docs/QueryHistoryPreference.md @@ -0,0 +1,11 @@ +# QueryHistoryPreference + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**home_tab** | Option<**String**> | HomeTab one of: '' | 'query' | 'starred'; | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryHistoryResponse.md b/openapi/docs/QueryHistoryResponse.md new file mode 100755 index 00000000..9de7c08b --- /dev/null +++ b/openapi/docs/QueryHistoryResponse.md @@ -0,0 +1,11 @@ +# QueryHistoryResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**models::QueryHistoryDto**](QueryHistoryDTO.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryHistorySearchResponse.md b/openapi/docs/QueryHistorySearchResponse.md new file mode 100755 index 00000000..eb5f0b97 --- /dev/null +++ b/openapi/docs/QueryHistorySearchResponse.md @@ -0,0 +1,11 @@ +# QueryHistorySearchResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**models::QueryHistorySearchResult**](QueryHistorySearchResult.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryHistorySearchResult.md b/openapi/docs/QueryHistorySearchResult.md new file mode 100755 index 00000000..b150140f --- /dev/null +++ b/openapi/docs/QueryHistorySearchResult.md @@ -0,0 +1,14 @@ +# QueryHistorySearchResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**query_history** | Option<[**Vec**](QueryHistoryDTO.md)> | | [optional] +**total_count** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QueryStat.md b/openapi/docs/QueryStat.md new file mode 100755 index 00000000..2197af41 --- /dev/null +++ b/openapi/docs/QueryStat.md @@ -0,0 +1,29 @@ +# QueryStat + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**color** | Option<[**serde_json::Value**](.md)> | Map values to a display color NOTE: this interface is under development in the frontend... so simple map for now | [optional] +**custom** | Option<[**serde_json::Value**](.md)> | Panel Specific Values | [optional] +**decimals** | Option<**i32**> | | [optional] +**description** | Option<**String**> | Description is human readable field metadata | [optional] +**display_name** | Option<**String**> | DisplayName overrides Grafana default naming, should not be used from a data source | [optional] +**display_name_from_ds** | Option<**String**> | DisplayNameFromDS overrides Grafana default naming strategy. | [optional] +**filterable** | Option<**bool**> | Filterable indicates if the Field's data can be filtered by additional calls. | [optional] +**interval** | Option<**f64**> | Interval indicates the expected regular step between values in the series. When an interval exists, consumers can identify \"missing\" values when the expected value is not present. The grafana timeseries visualization will render disconnected values when missing values are found it the time field. The interval uses the same units as the values. For time.Time, this is defined in milliseconds. | [optional] +**links** | Option<[**Vec**](DataLink.md)> | The behavior when clicking on a result | [optional] +**mappings** | Option<[**Vec**](serde_json::Value.md)> | | [optional] +**max** | Option<**f64**> | ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. | [optional] +**min** | Option<**f64**> | ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. | [optional] +**no_value** | Option<**String**> | Alternative to empty string | [optional] +**path** | Option<**String**> | Path is an explicit path to the field in the datasource. When the frame meta includes a path, this will default to `${frame.meta.path}/${field.name} When defined, this value can be used as an identifier within the datasource scope, and may be used as an identifier to update values in a subsequent request | [optional] +**thresholds** | Option<[**models::ThresholdsConfig**](ThresholdsConfig.md)> | | [optional] +**r#type** | Option<[**models::FieldTypeConfig**](FieldTypeConfig.md)> | | [optional] +**unit** | Option<**String**> | Numeric Options | [optional] +**value** | Option<**f64**> | | [optional] +**writeable** | Option<**bool**> | Writeable indicates that the datasource knows how to update this value | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/QuotaDto.md b/openapi/docs/QuotaDto.md new file mode 100755 index 00000000..7965c52d --- /dev/null +++ b/openapi/docs/QuotaDto.md @@ -0,0 +1,15 @@ +# QuotaDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**limit** | Option<**i64**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**target** | Option<**String**> | | [optional] +**used** | Option<**i64**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Receiver.md b/openapi/docs/Receiver.md new file mode 100755 index 00000000..785ce8e1 --- /dev/null +++ b/openapi/docs/Receiver.md @@ -0,0 +1,13 @@ +# Receiver + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active** | **bool** | active | +**integrations** | [**Vec**](integration.md) | integrations | +**name** | **String** | name | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReceiverExport.md b/openapi/docs/ReceiverExport.md new file mode 100755 index 00000000..f3039a3f --- /dev/null +++ b/openapi/docs/ReceiverExport.md @@ -0,0 +1,14 @@ +# ReceiverExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**disable_resolve_message** | Option<**bool**> | | [optional] +**settings** | Option<[**serde_json::Value**](.md)> | | [optional] +**r#type** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RecordingRuleJson.md b/openapi/docs/RecordingRuleJson.md new file mode 100755 index 00000000..a02ffb0e --- /dev/null +++ b/openapi/docs/RecordingRuleJson.md @@ -0,0 +1,21 @@ +# RecordingRuleJson + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**active** | Option<**bool**> | | [optional] +**count** | Option<**bool**> | | [optional] +**description** | Option<**String**> | | [optional] +**dest_data_source_uid** | Option<**String**> | | [optional] +**id** | Option<**String**> | | [optional] +**interval** | Option<**i64**> | | [optional] +**name** | Option<**String**> | | [optional] +**prom_name** | Option<**String**> | | [optional] +**queries** | Option<[**Vec**](serde_json::Value.md)> | | [optional] +**range** | Option<**i64**> | | [optional] +**target_ref_id** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RecordingRulesApi.md b/openapi/docs/RecordingRulesApi.md new file mode 100755 index 00000000..3792e26a --- /dev/null +++ b/openapi/docs/RecordingRulesApi.md @@ -0,0 +1,233 @@ +# \RecordingRulesApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_recording_rule**](RecordingRulesApi.md#create_recording_rule) | **POST** /recording-rules | Create a recording rule that is then registered and started. +[**create_recording_rule_write_target**](RecordingRulesApi.md#create_recording_rule_write_target) | **POST** /recording-rules/writer | Create a remote write target. +[**delete_recording_rule**](RecordingRulesApi.md#delete_recording_rule) | **DELETE** /recording-rules/{recordingRuleID} | Delete removes the rule from the registry and stops it. +[**delete_recording_rule_write_target**](RecordingRulesApi.md#delete_recording_rule_write_target) | **DELETE** /recording-rules/writer | Delete the remote write target. +[**get_recording_rule_write_target**](RecordingRulesApi.md#get_recording_rule_write_target) | **GET** /recording-rules/writer | Return the prometheus remote write target. +[**list_recording_rules**](RecordingRulesApi.md#list_recording_rules) | **GET** /recording-rules | Lists all rules in the database: active or deleted. +[**test_create_recording_rule**](RecordingRulesApi.md#test_create_recording_rule) | **POST** /recording-rules/test | Test a recording rule. +[**update_recording_rule**](RecordingRulesApi.md#update_recording_rule) | **PUT** /recording-rules | Update the active status of a rule. + + + +## create_recording_rule + +> models::RecordingRuleJson create_recording_rule(recording_rule_json) +Create a recording rule that is then registered and started. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_json** | [**RecordingRuleJson**](RecordingRuleJson.md) | | [required] | + +### Return type + +[**models::RecordingRuleJson**](RecordingRuleJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_recording_rule_write_target + +> models::PrometheusRemoteWriteTargetJson create_recording_rule_write_target(prometheus_remote_write_target_json) +Create a remote write target. + +It returns a 422 if there is not an existing prometheus data source configured. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**prometheus_remote_write_target_json** | [**PrometheusRemoteWriteTargetJson**](PrometheusRemoteWriteTargetJson.md) | | [required] | + +### Return type + +[**models::PrometheusRemoteWriteTargetJson**](PrometheusRemoteWriteTargetJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_recording_rule + +> models::SuccessResponseBody delete_recording_rule(recording_rule_id) +Delete removes the rule from the registry and stops it. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_recording_rule_write_target + +> models::SuccessResponseBody delete_recording_rule_write_target() +Delete the remote write target. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_recording_rule_write_target + +> models::PrometheusRemoteWriteTargetJson get_recording_rule_write_target() +Return the prometheus remote write target. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::PrometheusRemoteWriteTargetJson**](PrometheusRemoteWriteTargetJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_recording_rules + +> Vec list_recording_rules() +Lists all rules in the database: active or deleted. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](RecordingRuleJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## test_create_recording_rule + +> models::SuccessResponseBody test_create_recording_rule(recording_rule_json) +Test a recording rule. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_json** | [**RecordingRuleJson**](RecordingRuleJson.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_recording_rule + +> models::RecordingRuleJson update_recording_rule(recording_rule_json) +Update the active status of a rule. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**recording_rule_json** | [**RecordingRuleJson**](RecordingRuleJson.md) | | [required] | + +### Return type + +[**models::RecordingRuleJson**](RecordingRuleJSON.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/RelativeTimeRange.md b/openapi/docs/RelativeTimeRange.md new file mode 100755 index 00000000..816b35ac --- /dev/null +++ b/openapi/docs/RelativeTimeRange.md @@ -0,0 +1,12 @@ +# RelativeTimeRange + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**from** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**to** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RelativeTimeRangeExport.md b/openapi/docs/RelativeTimeRangeExport.md new file mode 100755 index 00000000..d6e48fa8 --- /dev/null +++ b/openapi/docs/RelativeTimeRangeExport.md @@ -0,0 +1,12 @@ +# RelativeTimeRangeExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**from** | Option<**i64**> | | [optional] +**to** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Report.md b/openapi/docs/Report.md new file mode 100755 index 00000000..a1066fa1 --- /dev/null +++ b/openapi/docs/Report.md @@ -0,0 +1,28 @@ +# Report + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**created** | Option<**String**> | | [optional] +**dashboards** | Option<[**Vec**](ReportDashboard.md)> | | [optional] +**enable_csv** | Option<**bool**> | | [optional] +**enable_dashboard_url** | Option<**bool**> | | [optional] +**formats** | Option<**Vec**> | | [optional] +**id** | Option<**i64**> | | [optional] +**message** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**options** | Option<[**models::ReportOptions**](ReportOptions.md)> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**recipients** | Option<**String**> | | [optional] +**reply_to** | Option<**String**> | | [optional] +**scale_factor** | Option<**i64**> | | [optional] +**schedule** | Option<[**models::ReportSchedule**](ReportSchedule.md)> | | [optional] +**state** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportBrandingOptions.md b/openapi/docs/ReportBrandingOptions.md new file mode 100755 index 00000000..d3e1bb4b --- /dev/null +++ b/openapi/docs/ReportBrandingOptions.md @@ -0,0 +1,15 @@ +# ReportBrandingOptions + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**email_footer_link** | Option<**String**> | | [optional] +**email_footer_mode** | Option<**String**> | | [optional] +**email_footer_text** | Option<**String**> | | [optional] +**email_logo_url** | Option<**String**> | | [optional] +**report_logo_url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportDashboard.md b/openapi/docs/ReportDashboard.md new file mode 100755 index 00000000..c7d08385 --- /dev/null +++ b/openapi/docs/ReportDashboard.md @@ -0,0 +1,13 @@ +# ReportDashboard + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard** | Option<[**models::ReportDashboardId**](ReportDashboardID.md)> | | [optional] +**report_variables** | Option<[**serde_json::Value**](.md)> | | [optional] +**time_range** | Option<[**models::ReportTimeRange**](ReportTimeRange.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportDashboardId.md b/openapi/docs/ReportDashboardId.md new file mode 100755 index 00000000..a8a1fb9f --- /dev/null +++ b/openapi/docs/ReportDashboardId.md @@ -0,0 +1,13 @@ +# ReportDashboardId + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**name** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportEmail.md b/openapi/docs/ReportEmail.md new file mode 100755 index 00000000..1b6ab498 --- /dev/null +++ b/openapi/docs/ReportEmail.md @@ -0,0 +1,13 @@ +# ReportEmail + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**emails** | Option<**String**> | Comma-separated list of emails to which to send the report to. | [optional] +**id** | Option<**String**> | Send the report to the emails specified in the report. Required if emails is not present. | [optional] +**use_emails_from_report** | Option<**bool**> | Send the report to the emails specified in the report. Required if emails is not present. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportOptions.md b/openapi/docs/ReportOptions.md new file mode 100755 index 00000000..ad1161bf --- /dev/null +++ b/openapi/docs/ReportOptions.md @@ -0,0 +1,13 @@ +# ReportOptions + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**layout** | Option<**String**> | | [optional] +**orientation** | Option<**String**> | | [optional] +**time_range** | Option<[**models::ReportTimeRange**](ReportTimeRange.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportSchedule.md b/openapi/docs/ReportSchedule.md new file mode 100755 index 00000000..a624195d --- /dev/null +++ b/openapi/docs/ReportSchedule.md @@ -0,0 +1,18 @@ +# ReportSchedule + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**day_of_month** | Option<**String**> | | [optional] +**end_date** | Option<**String**> | | [optional] +**frequency** | Option<**String**> | | [optional] +**interval_amount** | Option<**i64**> | | [optional] +**interval_frequency** | Option<**String**> | | [optional] +**start_date** | Option<**String**> | | [optional] +**time_zone** | Option<**String**> | | [optional] +**workdays_only** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportSettings.md b/openapi/docs/ReportSettings.md new file mode 100755 index 00000000..e44d4d42 --- /dev/null +++ b/openapi/docs/ReportSettings.md @@ -0,0 +1,14 @@ +# ReportSettings + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**branding** | Option<[**models::ReportBrandingOptions**](ReportBrandingOptions.md)> | | [optional] +**id** | Option<**i64**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportTimeRange.md b/openapi/docs/ReportTimeRange.md new file mode 100755 index 00000000..d8daa469 --- /dev/null +++ b/openapi/docs/ReportTimeRange.md @@ -0,0 +1,12 @@ +# ReportTimeRange + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**from** | Option<**String**> | | [optional] +**to** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ReportsApi.md b/openapi/docs/ReportsApi.md new file mode 100755 index 00000000..88b0590b --- /dev/null +++ b/openapi/docs/ReportsApi.md @@ -0,0 +1,318 @@ +# \ReportsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_report**](ReportsApi.md#create_report) | **POST** /reports | Create a report. +[**delete_report**](ReportsApi.md#delete_report) | **DELETE** /reports/{id} | Delete a report. +[**get_report**](ReportsApi.md#get_report) | **GET** /reports/{id} | Get a report. +[**get_report_settings**](ReportsApi.md#get_report_settings) | **GET** /reports/settings | Get settings. +[**get_reports**](ReportsApi.md#get_reports) | **GET** /reports | List reports. +[**render_report_pdfs**](ReportsApi.md#render_report_pdfs) | **GET** /reports/render/pdfs | Render report for multiple dashboards. +[**save_report_settings**](ReportsApi.md#save_report_settings) | **POST** /reports/settings | Save settings. +[**send_report**](ReportsApi.md#send_report) | **POST** /reports/email | Send a report. +[**send_test_email**](ReportsApi.md#send_test_email) | **POST** /reports/test-email | Send test report via email. +[**update_report**](ReportsApi.md#update_report) | **PUT** /reports/{id} | Update a report. + + + +## create_report + +> models::CreateReport200Response create_report(create_or_update_report_config) +Create a report. + +Available to org admins only and with a valid license. You need to have a permission with action `reports.admin:create`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_or_update_report_config** | [**CreateOrUpdateReportConfig**](CreateOrUpdateReportConfig.md) | | [required] | + +### Return type + +[**models::CreateReport200Response**](createReport_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_report + +> models::SuccessResponseBody delete_report(id) +Delete a report. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.delete` with scope `reports:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_report + +> models::Report get_report(id) +Get a report. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **i64** | | [required] | + +### Return type + +[**models::Report**](Report.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_report_settings + +> models::ReportSettings get_report_settings() +Get settings. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:read`x. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ReportSettings**](ReportSettings.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_reports + +> Vec get_reports() +List reports. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:*`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](Report.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## render_report_pdfs + +> Vec render_report_pdfs(dashboard_id, orientation, layout, title, scale_factor, include_tables) +Render report for multiple dashboards. + +Available to all users and with a valid license. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | Option<**String**> | | | +**orientation** | Option<**String**> | | | +**layout** | Option<**String**> | | | +**title** | Option<**String**> | | | +**scale_factor** | Option<**String**> | | | +**include_tables** | Option<**String**> | | | + +### Return type + +**Vec** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## save_report_settings + +> models::SuccessResponseBody save_report_settings(report_settings) +Save settings. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:write`xx. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**report_settings** | [**ReportSettings**](ReportSettings.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## send_report + +> models::SuccessResponseBody send_report(report_email) +Send a report. + +Generate and send a report. This API waits for the report to be generated before returning. We recommend that you set the client’s timeout to at least 60 seconds. Available to org admins only and with a valid license. Only available in Grafana Enterprise v7.0+. This API endpoint is experimental and may be deprecated in a future release. On deprecation, a migration strategy will be provided and the endpoint will remain functional until the next major release of Grafana. You need to have a permission with action `reports:send`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**report_email** | [**ReportEmail**](ReportEmail.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## send_test_email + +> models::SuccessResponseBody send_test_email(create_or_update_report_config) +Send test report via email. + +Available to org admins only and with a valid license. You need to have a permission with action `reports:send`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_or_update_report_config** | [**CreateOrUpdateReportConfig**](CreateOrUpdateReportConfig.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_report + +> models::SuccessResponseBody update_report(id, create_or_update_report_config) +Update a report. + +Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.admin:write` with scope `reports:id:`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**id** | **i64** | | [required] | +**create_or_update_report_config** | [**CreateOrUpdateReportConfig**](CreateOrUpdateReportConfig.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/ResourcePermissionDto.md b/openapi/docs/ResourcePermissionDto.md new file mode 100755 index 00000000..30588e89 --- /dev/null +++ b/openapi/docs/ResourcePermissionDto.md @@ -0,0 +1,24 @@ +# ResourcePermissionDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**actions** | Option<**Vec**> | | [optional] +**built_in_role** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_inherited** | Option<**bool**> | | [optional] +**is_managed** | Option<**bool**> | | [optional] +**is_service_account** | Option<**bool**> | | [optional] +**permission** | Option<**String**> | | [optional] +**role_name** | Option<**String**> | | [optional] +**team** | Option<**String**> | | [optional] +**team_avatar_url** | Option<**String**> | | [optional] +**team_id** | Option<**i64**> | | [optional] +**user_avatar_url** | Option<**String**> | | [optional] +**user_id** | Option<**i64**> | | [optional] +**user_login** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ResponseDetails.md b/openapi/docs/ResponseDetails.md new file mode 100755 index 00000000..8514c996 --- /dev/null +++ b/openapi/docs/ResponseDetails.md @@ -0,0 +1,11 @@ +# ResponseDetails + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**msg** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RestoreDashboardVersionCommand.md b/openapi/docs/RestoreDashboardVersionCommand.md new file mode 100755 index 00000000..60bb4e80 --- /dev/null +++ b/openapi/docs/RestoreDashboardVersionCommand.md @@ -0,0 +1,11 @@ +# RestoreDashboardVersionCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RetrieveJwks200Response.md b/openapi/docs/RetrieveJwks200Response.md new file mode 100755 index 00000000..2788462d --- /dev/null +++ b/openapi/docs/RetrieveJwks200Response.md @@ -0,0 +1,11 @@ +# RetrieveJwks200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**keys** | Option<[**Vec**](JSONWebKey.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RevokeAuthTokenCmd.md b/openapi/docs/RevokeAuthTokenCmd.md new file mode 100755 index 00000000..5fec0042 --- /dev/null +++ b/openapi/docs/RevokeAuthTokenCmd.md @@ -0,0 +1,11 @@ +# RevokeAuthTokenCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**auth_token_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RoleAssignmentsDto.md b/openapi/docs/RoleAssignmentsDto.md new file mode 100755 index 00000000..253d03b0 --- /dev/null +++ b/openapi/docs/RoleAssignmentsDto.md @@ -0,0 +1,14 @@ +# RoleAssignmentsDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**role_uid** | Option<**String**> | | [optional] +**service_accounts** | Option<**Vec**> | | [optional] +**teams** | Option<**Vec**> | | [optional] +**users** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RoleDto.md b/openapi/docs/RoleDto.md new file mode 100755 index 00000000..2b9a74de --- /dev/null +++ b/openapi/docs/RoleDto.md @@ -0,0 +1,22 @@ +# RoleDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**created** | Option<**String**> | | [optional] +**delegatable** | Option<**bool**> | | [optional] +**description** | Option<**String**> | | [optional] +**display_name** | Option<**String**> | | [optional] +**global** | Option<**bool**> | | [optional] +**group** | Option<**String**> | | [optional] +**hidden** | Option<**bool**> | | [optional] +**name** | Option<**String**> | | [optional] +**permissions** | Option<[**Vec**](Permission.md)> | | [optional] +**uid** | Option<**String**> | | [optional] +**updated** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RolesSearchQuery.md b/openapi/docs/RolesSearchQuery.md new file mode 100755 index 00000000..4124da0e --- /dev/null +++ b/openapi/docs/RolesSearchQuery.md @@ -0,0 +1,14 @@ +# RolesSearchQuery + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**include_hidden** | Option<**bool**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**team_ids** | Option<**Vec**> | | [optional] +**user_ids** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Route.md b/openapi/docs/Route.md new file mode 100755 index 00000000..16a9dd40 --- /dev/null +++ b/openapi/docs/Route.md @@ -0,0 +1,23 @@ +# Route + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**r#continue** | Option<**bool**> | | [optional] +**group_by** | Option<**Vec**> | | [optional] +**group_interval** | Option<**String**> | | [optional] +**group_wait** | Option<**String**> | | [optional] +**r#match** | Option<**std::collections::HashMap**> | Deprecated. Remove before v1.0 release. | [optional] +**match_re** | Option<**std::collections::HashMap**> | | [optional] +**matchers** | Option<[**Vec**](Matcher.md)> | Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. | [optional] +**mute_time_intervals** | Option<**Vec**> | | [optional] +**object_matchers** | Option<[**Vec>**](Vec.md)> | | [optional] +**provenance** | Option<**String**> | | [optional] +**receiver** | Option<**String**> | | [optional] +**repeat_interval** | Option<**String**> | | [optional] +**routes** | Option<[**Vec**](Route.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RouteExport.md b/openapi/docs/RouteExport.md new file mode 100755 index 00000000..043120f9 --- /dev/null +++ b/openapi/docs/RouteExport.md @@ -0,0 +1,22 @@ +# RouteExport + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**r#continue** | Option<**bool**> | | [optional] +**group_by** | Option<**Vec**> | | [optional] +**group_interval** | Option<**String**> | | [optional] +**group_wait** | Option<**String**> | | [optional] +**r#match** | Option<**std::collections::HashMap**> | Deprecated. Remove before v1.0 release. | [optional] +**match_re** | Option<**std::collections::HashMap**> | | [optional] +**matchers** | Option<[**Vec**](Matcher.md)> | Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. | [optional] +**mute_time_intervals** | Option<**Vec**> | | [optional] +**object_matchers** | Option<[**Vec>**](Vec.md)> | | [optional] +**receiver** | Option<**String**> | | [optional] +**repeat_interval** | Option<**String**> | | [optional] +**routes** | Option<[**Vec**](RouteExport.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Rule.md b/openapi/docs/Rule.md new file mode 100755 index 00000000..f3d72feb --- /dev/null +++ b/openapi/docs/Rule.md @@ -0,0 +1,18 @@ +# Rule + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**evaluation_time** | Option<**f64**> | | [optional] +**health** | **String** | | +**labels** | Option<**std::collections::HashMap**> | The custom marshaling for labels.Labels ends up doing this anyways. | [optional] +**last_error** | Option<**String**> | | [optional] +**last_evaluation** | Option<**String**> | | [optional] +**name** | **String** | | +**query** | **String** | | +**r#type** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RuleDiscovery.md b/openapi/docs/RuleDiscovery.md new file mode 100755 index 00000000..9edae42f --- /dev/null +++ b/openapi/docs/RuleDiscovery.md @@ -0,0 +1,12 @@ +# RuleDiscovery + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**groups** | [**Vec**](RuleGroup.md) | | +**totals** | Option<**std::collections::HashMap**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RuleGroup.md b/openapi/docs/RuleGroup.md new file mode 100755 index 00000000..1220c127 --- /dev/null +++ b/openapi/docs/RuleGroup.md @@ -0,0 +1,17 @@ +# RuleGroup + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**evaluation_time** | Option<**f64**> | | [optional] +**file** | **String** | | +**interval** | **f64** | | +**last_evaluation** | Option<**String**> | | [optional] +**name** | **String** | | +**rules** | [**Vec**](AlertingRule.md) | In order to preserve rule ordering, while exposing type (alerting or recording) specific properties, both alerting and recording rules are exposed in the same array. | +**totals** | Option<**std::collections::HashMap**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RuleGroupConfigResponse.md b/openapi/docs/RuleGroupConfigResponse.md new file mode 100755 index 00000000..3e22b7f0 --- /dev/null +++ b/openapi/docs/RuleGroupConfigResponse.md @@ -0,0 +1,14 @@ +# RuleGroupConfigResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**interval** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**name** | Option<**String**> | | [optional] +**rules** | Option<[**Vec**](GettableExtendedRuleNode.md)> | | [optional] +**source_tenants** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/RuleResponse.md b/openapi/docs/RuleResponse.md new file mode 100755 index 00000000..3617c215 --- /dev/null +++ b/openapi/docs/RuleResponse.md @@ -0,0 +1,14 @@ +# RuleResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | Option<[**models::RuleDiscovery**](RuleDiscovery.md)> | | [optional] +**error** | Option<**String**> | | [optional] +**error_type** | Option<**String**> | | [optional] +**status** | **String** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SamlApi.md b/openapi/docs/SamlApi.md new file mode 100755 index 00000000..3cc1c10d --- /dev/null +++ b/openapi/docs/SamlApi.md @@ -0,0 +1,149 @@ +# \SamlApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_metadata**](SamlApi.md#get_metadata) | **GET** /saml/metadata | It exposes the SP (Grafana's) metadata for the IdP's consumption. +[**get_saml_logout**](SamlApi.md#get_saml_logout) | **GET** /logout/saml | GetLogout initiates single logout process. +[**get_slo**](SamlApi.md#get_slo) | **GET** /saml/slo | It performs Single Logout (SLO) callback. +[**post_acs**](SamlApi.md#post_acs) | **POST** /saml/acs | It performs Assertion Consumer Service (ACS). +[**post_slo**](SamlApi.md#post_slo) | **POST** /saml/slo | It performs Single Logout (SLO) callback. + + + +## get_metadata + +> Vec get_metadata() +It exposes the SP (Grafana's) metadata for the IdP's consumption. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**Vec** + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_saml_logout + +> get_saml_logout() +GetLogout initiates single logout process. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_slo + +> get_slo() +It performs Single Logout (SLO) callback. + +There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_acs + +> post_acs(relay_state) +It performs Assertion Consumer Service (ACS). + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**relay_state** | Option<**String**> | | | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## post_slo + +> post_slo(saml_request, saml_response) +It performs Single Logout (SLO) callback. + +There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**saml_request** | Option<**String**> | | | +**saml_response** | Option<**String**> | | | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/Sample.md b/openapi/docs/Sample.md new file mode 100755 index 00000000..8490812e --- /dev/null +++ b/openapi/docs/Sample.md @@ -0,0 +1,14 @@ +# Sample + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**f** | Option<**f64**> | | [optional] +**h** | Option<[**models::FloatHistogram**](FloatHistogram.md)> | | [optional] +**metric** | Option<[**Vec**](Label.md)> | Labels is a sorted set of labels. Order has to be guaranteed upon instantiation. | [optional] +**t** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SaveDashboardCommand.md b/openapi/docs/SaveDashboardCommand.md new file mode 100755 index 00000000..f3c2caac --- /dev/null +++ b/openapi/docs/SaveDashboardCommand.md @@ -0,0 +1,18 @@ +# SaveDashboardCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**updated_at** | Option<**String**> | | [optional] +**dashboard** | Option<[**serde_json::Value**](.md)> | | [optional] +**folder_id** | Option<**i64**> | Deprecated: use FolderUID instead | [optional] +**folder_uid** | Option<**String**> | | [optional] +**is_folder** | Option<**bool**> | | [optional] +**message** | Option<**String**> | | [optional] +**overwrite** | Option<**bool**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SearchApi.md b/openapi/docs/SearchApi.md new file mode 100755 index 00000000..7439fe3f --- /dev/null +++ b/openapi/docs/SearchApi.md @@ -0,0 +1,74 @@ +# \SearchApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**list_sort_options**](SearchApi.md#list_sort_options) | **GET** /search/sorting | List search sorting options. +[**search**](SearchApi.md#search) | **GET** /search | + + + +## list_sort_options + +> models::ListSortOptions200Response list_sort_options() +List search sorting options. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ListSortOptions200Response**](listSortOptions_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search + +> Vec search(query, tag, r#type, dashboard_ids, dashboard_uids, folder_ids, folder_uids, starred, limit, page, permission, sort) + + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query** | Option<**String**> | Search Query | | +**tag** | Option<[**Vec**](String.md)> | List of tags to search for | | +**r#type** | Option<**String**> | Type to search for, dash-folder or dash-db | | +**dashboard_ids** | Option<[**Vec**](i64.md)> | List of dashboard id’s to search for This is deprecated: users should use the `dashboardUIDs` query parameter instead | | +**dashboard_uids** | Option<[**Vec**](String.md)> | List of dashboard uid’s to search for | | +**folder_ids** | Option<[**Vec**](i64.md)> | List of folder id’s to search in for dashboards If it's `0` then it will query for the top level folders This is deprecated: users should use the `folderUIDs` query parameter instead | | +**folder_uids** | Option<[**Vec**](String.md)> | List of folder UID’s to search in for dashboards If it's an empty string then it will query for the top level folders | | +**starred** | Option<**bool**> | Flag indicating if only starred Dashboards should be returned | | +**limit** | Option<**i64**> | Limit the number of returned results (max 5000) | | +**page** | Option<**i64**> | Use this parameter to access hits beyond limit. Numbering starts at 1. limit param acts as page size. Only available in Grafana v6.2+. | | +**permission** | Option<**String**> | Set to `Edit` to return dashboards/folders that the user can edit | |[default to View] +**sort** | Option<**String**> | Sort method; for listing all the possible sort methods use the search sorting endpoint. | |[default to alpha-asc] + +### Return type + +[**Vec**](Hit.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/SearchDeviceQueryResult.md b/openapi/docs/SearchDeviceQueryResult.md new file mode 100755 index 00000000..2686138c --- /dev/null +++ b/openapi/docs/SearchDeviceQueryResult.md @@ -0,0 +1,14 @@ +# SearchDeviceQueryResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**devices** | Option<[**Vec**](DeviceSearchHitDTO.md)> | | [optional] +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**total_count** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SearchOrgServiceAccountsResult.md b/openapi/docs/SearchOrgServiceAccountsResult.md new file mode 100755 index 00000000..2ea3d4bc --- /dev/null +++ b/openapi/docs/SearchOrgServiceAccountsResult.md @@ -0,0 +1,14 @@ +# SearchOrgServiceAccountsResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**service_accounts** | Option<[**Vec**](ServiceAccountDTO.md)> | | [optional] +**total_count** | Option<**i64**> | It can be used for pagination of the user list E.g. if totalCount is equal to 100 users and the perpage parameter is set to 10 then there are 10 pages of users. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SearchOrgUsersQueryResult.md b/openapi/docs/SearchOrgUsersQueryResult.md new file mode 100755 index 00000000..0a146c3d --- /dev/null +++ b/openapi/docs/SearchOrgUsersQueryResult.md @@ -0,0 +1,14 @@ +# SearchOrgUsersQueryResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**org_users** | Option<[**Vec**](OrgUserDTO.md)> | | [optional] +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**total_count** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SearchResult.md b/openapi/docs/SearchResult.md new file mode 100755 index 00000000..d4716987 --- /dev/null +++ b/openapi/docs/SearchResult.md @@ -0,0 +1,11 @@ +# SearchResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**result** | Option<[**Vec**](SearchResultItem.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SearchResultItem.md b/openapi/docs/SearchResultItem.md new file mode 100755 index 00000000..2251530d --- /dev/null +++ b/openapi/docs/SearchResultItem.md @@ -0,0 +1,18 @@ +# SearchResultItem + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**action** | Option<**String**> | | [optional] +**basic_role** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**role_name** | Option<**String**> | | [optional] +**scope** | Option<**String**> | | [optional] +**team_id** | Option<**i64**> | | [optional] +**user_id** | Option<**i64**> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SearchTeamQueryResult.md b/openapi/docs/SearchTeamQueryResult.md new file mode 100755 index 00000000..f1b2fc4e --- /dev/null +++ b/openapi/docs/SearchTeamQueryResult.md @@ -0,0 +1,14 @@ +# SearchTeamQueryResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**teams** | Option<[**Vec**](TeamDTO.md)> | | [optional] +**total_count** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SearchUserQueryResult.md b/openapi/docs/SearchUserQueryResult.md new file mode 100755 index 00000000..131885b7 --- /dev/null +++ b/openapi/docs/SearchUserQueryResult.md @@ -0,0 +1,14 @@ +# SearchUserQueryResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**page** | Option<**i64**> | | [optional] +**per_page** | Option<**i64**> | | [optional] +**total_count** | Option<**i64**> | | [optional] +**users** | Option<[**Vec**](UserSearchHitDTO.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ServiceAccountDto.md b/openapi/docs/ServiceAccountDto.md new file mode 100755 index 00000000..79df6331 --- /dev/null +++ b/openapi/docs/ServiceAccountDto.md @@ -0,0 +1,20 @@ +# ServiceAccountDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_control** | Option<**std::collections::HashMap**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_disabled** | Option<**bool**> | | [optional] +**is_external** | Option<**bool**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**role** | Option<**String**> | | [optional] +**tokens** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ServiceAccountProfileDto.md b/openapi/docs/ServiceAccountProfileDto.md new file mode 100755 index 00000000..d146b29f --- /dev/null +++ b/openapi/docs/ServiceAccountProfileDto.md @@ -0,0 +1,24 @@ +# ServiceAccountProfileDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_control** | Option<**std::collections::HashMap**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**created_at** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_disabled** | Option<**bool**> | | [optional] +**is_external** | Option<**bool**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**required_by** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] +**teams** | Option<**Vec**> | | [optional] +**tokens** | Option<**i64**> | | [optional] +**updated_at** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ServiceAccountsApi.md b/openapi/docs/ServiceAccountsApi.md new file mode 100755 index 00000000..973dcb5c --- /dev/null +++ b/openapi/docs/ServiceAccountsApi.md @@ -0,0 +1,263 @@ +# \ServiceAccountsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_service_account**](ServiceAccountsApi.md#create_service_account) | **POST** /serviceaccounts | Create service account +[**create_token**](ServiceAccountsApi.md#create_token) | **POST** /serviceaccounts/{serviceAccountId}/tokens | CreateNewToken adds a token to a service account +[**delete_service_account**](ServiceAccountsApi.md#delete_service_account) | **DELETE** /serviceaccounts/{serviceAccountId} | Delete service account +[**delete_token**](ServiceAccountsApi.md#delete_token) | **DELETE** /serviceaccounts/{serviceAccountId}/tokens/{tokenId} | DeleteToken deletes service account tokens +[**list_tokens**](ServiceAccountsApi.md#list_tokens) | **GET** /serviceaccounts/{serviceAccountId}/tokens | Get service account tokens +[**retrieve_service_account**](ServiceAccountsApi.md#retrieve_service_account) | **GET** /serviceaccounts/{serviceAccountId} | Get single serviceaccount by Id +[**search_org_service_accounts_with_paging**](ServiceAccountsApi.md#search_org_service_accounts_with_paging) | **GET** /serviceaccounts/search | Search service accounts with paging +[**update_service_account**](ServiceAccountsApi.md#update_service_account) | **PATCH** /serviceaccounts/{serviceAccountId} | Update service account + + + +## create_service_account + +> models::ServiceAccountDto create_service_account(create_service_account_form) +Create service account + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:*` Requires basic authentication and that the authenticated user is a Grafana Admin. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_service_account_form** | Option<[**CreateServiceAccountForm**](CreateServiceAccountForm.md)> | | | + +### Return type + +[**models::ServiceAccountDto**](ServiceAccountDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_token + +> models::NewApiKeyResult create_token(service_account_id, add_service_account_token_command) +CreateNewToken adds a token to a service account + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:id:1` (single service account) + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**service_account_id** | **i64** | | [required] | +**add_service_account_token_command** | Option<[**AddServiceAccountTokenCommand**](AddServiceAccountTokenCommand.md)> | | | + +### Return type + +[**models::NewApiKeyResult**](NewApiKeyResult.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_service_account + +> models::SuccessResponseBody delete_service_account(service_account_id) +Delete service account + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:delete` scope: `serviceaccounts:id:1` (single service account) + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**service_account_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_token + +> models::SuccessResponseBody delete_token(token_id, service_account_id) +DeleteToken deletes service account tokens + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:id:1` (single service account) Requires basic authentication and that the authenticated user is a Grafana Admin. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**token_id** | **i64** | | [required] | +**service_account_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_tokens + +> Vec list_tokens(service_account_id) +Get service account tokens + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:read` scope: `global:serviceaccounts:id:1` (single service account) Requires basic authentication and that the authenticated user is a Grafana Admin. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**service_account_id** | **i64** | | [required] | + +### Return type + +[**Vec**](TokenDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## retrieve_service_account + +> models::ServiceAccountDto retrieve_service_account(service_account_id) +Get single serviceaccount by Id + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:read` scope: `serviceaccounts:id:1` (single service account) + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**service_account_id** | **i64** | | [required] | + +### Return type + +[**models::ServiceAccountDto**](ServiceAccountDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_org_service_accounts_with_paging + +> models::SearchOrgServiceAccountsResult search_org_service_accounts_with_paging(disabled, expired_tokens, query, perpage, page) +Search service accounts with paging + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:read` scope: `serviceaccounts:*` + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**disabled** | Option<**bool**> | | | +**expired_tokens** | Option<**bool**> | | | +**query** | Option<**String**> | It will return results where the query value is contained in one of the name. Query values with spaces need to be URL encoded. | | +**perpage** | Option<**i64**> | The default value is 1000. | | +**page** | Option<**i64**> | The default value is 1. | | + +### Return type + +[**models::SearchOrgServiceAccountsResult**](SearchOrgServiceAccountsResult.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_service_account + +> models::UpdateServiceAccount200Response update_service_account(service_account_id, update_service_account_form) +Update service account + +Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:id:1` (single service account) + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**service_account_id** | **i64** | | [required] | +**update_service_account_form** | Option<[**UpdateServiceAccountForm**](UpdateServiceAccountForm.md)> | | | + +### Return type + +[**models::UpdateServiceAccount200Response**](updateServiceAccount_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/SetPermissionCommand.md b/openapi/docs/SetPermissionCommand.md new file mode 100755 index 00000000..de9d0f54 --- /dev/null +++ b/openapi/docs/SetPermissionCommand.md @@ -0,0 +1,11 @@ +# SetPermissionCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**permission** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SetPermissionsCommand.md b/openapi/docs/SetPermissionsCommand.md new file mode 100755 index 00000000..4d35d419 --- /dev/null +++ b/openapi/docs/SetPermissionsCommand.md @@ -0,0 +1,11 @@ +# SetPermissionsCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**permissions** | Option<[**Vec**](SetResourcePermissionCommand.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SetResourcePermissionCommand.md b/openapi/docs/SetResourcePermissionCommand.md new file mode 100755 index 00000000..e2efcbef --- /dev/null +++ b/openapi/docs/SetResourcePermissionCommand.md @@ -0,0 +1,14 @@ +# SetResourcePermissionCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**built_in_role** | Option<**String**> | | [optional] +**permission** | Option<**String**> | | [optional] +**team_id** | Option<**i64**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SetRoleAssignmentsCommand.md b/openapi/docs/SetRoleAssignmentsCommand.md new file mode 100755 index 00000000..972994b5 --- /dev/null +++ b/openapi/docs/SetRoleAssignmentsCommand.md @@ -0,0 +1,13 @@ +# SetRoleAssignmentsCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**service_accounts** | Option<**Vec**> | | [optional] +**teams** | Option<**Vec**> | | [optional] +**users** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SetUserRolesCommand.md b/openapi/docs/SetUserRolesCommand.md new file mode 100755 index 00000000..fde635ff --- /dev/null +++ b/openapi/docs/SetUserRolesCommand.md @@ -0,0 +1,13 @@ +# SetUserRolesCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**global** | Option<**bool**> | | [optional] +**include_hidden** | Option<**bool**> | | [optional] +**role_uids** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SigV4Config.md b/openapi/docs/SigV4Config.md new file mode 100755 index 00000000..1414e16b --- /dev/null +++ b/openapi/docs/SigV4Config.md @@ -0,0 +1,15 @@ +# SigV4Config + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_key** | Option<**String**> | | [optional] +**profile** | Option<**String**> | | [optional] +**region** | Option<**String**> | | [optional] +**role_arn** | Option<**String**> | | [optional] +**secret_key** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SignedInUserApi.md b/openapi/docs/SignedInUserApi.md new file mode 100755 index 00000000..47fb0fb7 --- /dev/null +++ b/openapi/docs/SignedInUserApi.md @@ -0,0 +1,447 @@ +# \SignedInUserApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**change_user_password**](SignedInUserApi.md#change_user_password) | **PUT** /user/password | Change Password. +[**clear_help_flags**](SignedInUserApi.md#clear_help_flags) | **GET** /user/helpflags/clear | Clear user help flag. +[**get_signed_in_user**](SignedInUserApi.md#get_signed_in_user) | **GET** /user | +[**get_signed_in_user_org_list**](SignedInUserApi.md#get_signed_in_user_org_list) | **GET** /user/orgs | Organizations of the actual User. +[**get_signed_in_user_team_list**](SignedInUserApi.md#get_signed_in_user_team_list) | **GET** /user/teams | Teams that the actual User is member of. +[**get_user_auth_tokens**](SignedInUserApi.md#get_user_auth_tokens) | **GET** /user/auth-tokens | Auth tokens of the actual User. +[**get_user_quotas**](SignedInUserApi.md#get_user_quotas) | **GET** /user/quotas | Fetch user quota. +[**revoke_user_auth_token**](SignedInUserApi.md#revoke_user_auth_token) | **POST** /user/revoke-auth-token | Revoke an auth token of the actual User. +[**set_help_flag**](SignedInUserApi.md#set_help_flag) | **PUT** /user/helpflags/{flag_id} | Set user help flag. +[**star_dashboard**](SignedInUserApi.md#star_dashboard) | **POST** /user/stars/dashboard/{dashboard_id} | Star a dashboard. +[**star_dashboard_by_uid**](SignedInUserApi.md#star_dashboard_by_uid) | **POST** /user/stars/dashboard/uid/{dashboard_uid} | Star a dashboard. +[**unstar_dashboard**](SignedInUserApi.md#unstar_dashboard) | **DELETE** /user/stars/dashboard/{dashboard_id} | Unstar a dashboard. +[**unstar_dashboard_by_uid**](SignedInUserApi.md#unstar_dashboard_by_uid) | **DELETE** /user/stars/dashboard/uid/{dashboard_uid} | Unstar a dashboard. +[**update_signed_in_user**](SignedInUserApi.md#update_signed_in_user) | **PUT** /user | Update signed in User. +[**user_set_using_org**](SignedInUserApi.md#user_set_using_org) | **POST** /user/using/{org_id} | Switch user context for signed in user. + + + +## change_user_password + +> models::SuccessResponseBody change_user_password(change_user_password_command) +Change Password. + +Changes the password for the user. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**change_user_password_command** | [**ChangeUserPasswordCommand**](ChangeUserPasswordCommand.md) | To change the email, name, login, theme, provide another one. | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## clear_help_flags + +> models::ClearHelpFlags200Response clear_help_flags() +Clear user help flag. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::ClearHelpFlags200Response**](clearHelpFlags_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_signed_in_user + +> models::UserProfileDto get_signed_in_user() + + +Get (current authenticated user) + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::UserProfileDto**](UserProfileDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_signed_in_user_org_list + +> Vec get_signed_in_user_org_list() +Organizations of the actual User. + +Return a list of all organizations of the current user. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](UserOrgDTO.md) + +### Authorization + +[basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_signed_in_user_team_list + +> Vec get_signed_in_user_team_list() +Teams that the actual User is member of. + +Return a list of all teams that the current user is member of. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](TeamDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_user_auth_tokens + +> Vec get_user_auth_tokens() +Auth tokens of the actual User. + +Return a list of all auth tokens (devices) that the actual user currently have logged in from. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](UserToken.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_user_quotas + +> Vec get_user_quotas() +Fetch user quota. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](QuotaDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## revoke_user_auth_token + +> models::SuccessResponseBody revoke_user_auth_token(revoke_auth_token_cmd) +Revoke an auth token of the actual User. + +Revokes the given auth token (device) for the actual user. User of issued auth token (device) will no longer be logged in and will be required to authenticate again upon next activity. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**revoke_auth_token_cmd** | [**RevokeAuthTokenCmd**](RevokeAuthTokenCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## set_help_flag + +> models::ClearHelpFlags200Response set_help_flag(flag_id) +Set user help flag. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**flag_id** | **String** | | [required] | + +### Return type + +[**models::ClearHelpFlags200Response**](clearHelpFlags_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## star_dashboard + +> models::SuccessResponseBody star_dashboard(dashboard_id) +Star a dashboard. + +Stars the given Dashboard for the actual user. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## star_dashboard_by_uid + +> models::SuccessResponseBody star_dashboard_by_uid(dashboard_uid) +Star a dashboard. + +Stars the given Dashboard for the actual user. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## unstar_dashboard + +> models::SuccessResponseBody unstar_dashboard(dashboard_id) +Unstar a dashboard. + +Deletes the starring of the given Dashboard for the actual user. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_id** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## unstar_dashboard_by_uid + +> models::SuccessResponseBody unstar_dashboard_by_uid(dashboard_uid) +Unstar a dashboard. + +Deletes the starring of the given Dashboard for the actual user. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**dashboard_uid** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_signed_in_user + +> models::SuccessResponseBody update_signed_in_user(update_user_command) +Update signed in User. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**update_user_command** | [**UpdateUserCommand**](UpdateUserCommand.md) | To change the email, name, login, theme, provide another one. | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## user_set_using_org + +> models::SuccessResponseBody user_set_using_org(org_id) +Switch user context for signed in user. + +Switch user context to the given organization. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**org_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/SigningKeysApi.md b/openapi/docs/SigningKeysApi.md new file mode 100755 index 00000000..d35f270f --- /dev/null +++ b/openapi/docs/SigningKeysApi.md @@ -0,0 +1,36 @@ +# \SigningKeysApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**retrieve_jwks**](SigningKeysApi.md#retrieve_jwks) | **GET** /signing-keys/keys | Get JSON Web Key Set (JWKS) with all the keys that can be used to verify tokens (public keys) + + + +## retrieve_jwks + +> models::RetrieveJwks200Response retrieve_jwks() +Get JSON Web Key Set (JWKS) with all the keys that can be used to verify tokens (public keys) + +Required permissions None + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::RetrieveJwks200Response**](retrieveJWKS_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/Silence.md b/openapi/docs/Silence.md new file mode 100755 index 00000000..d182b7a7 --- /dev/null +++ b/openapi/docs/Silence.md @@ -0,0 +1,15 @@ +# Silence + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**comment** | **String** | comment | +**created_by** | **String** | created by | +**ends_at** | **String** | ends at | +**matchers** | [**Vec**](matcher.md) | Matchers matchers | +**starts_at** | **String** | starts at | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SilenceStatus.md b/openapi/docs/SilenceStatus.md new file mode 100755 index 00000000..43456ae0 --- /dev/null +++ b/openapi/docs/SilenceStatus.md @@ -0,0 +1,11 @@ +# SilenceStatus + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**state** | **String** | state | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SlackAction.md b/openapi/docs/SlackAction.md new file mode 100755 index 00000000..17a1808c --- /dev/null +++ b/openapi/docs/SlackAction.md @@ -0,0 +1,17 @@ +# SlackAction + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**confirm** | Option<[**models::SlackConfirmationField**](SlackConfirmationField.md)> | | [optional] +**name** | Option<**String**> | | [optional] +**style** | Option<**String**> | | [optional] +**text** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**value** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SlackConfig.md b/openapi/docs/SlackConfig.md new file mode 100755 index 00000000..b8b28fbe --- /dev/null +++ b/openapi/docs/SlackConfig.md @@ -0,0 +1,33 @@ +# SlackConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**actions** | Option<[**Vec**](SlackAction.md)> | | [optional] +**api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**api_url_file** | Option<**String**> | | [optional] +**callback_id** | Option<**String**> | | [optional] +**channel** | Option<**String**> | Slack channel override, (like #other-channel or @username). | [optional] +**color** | Option<**String**> | | [optional] +**fallback** | Option<**String**> | | [optional] +**fields** | Option<[**Vec**](SlackField.md)> | | [optional] +**footer** | Option<**String**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**icon_emoji** | Option<**String**> | | [optional] +**icon_url** | Option<**String**> | | [optional] +**image_url** | Option<**String**> | | [optional] +**link_names** | Option<**bool**> | | [optional] +**mrkdwn_in** | Option<**Vec**> | | [optional] +**pretext** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**short_fields** | Option<**bool**> | | [optional] +**text** | Option<**String**> | | [optional] +**thumb_url** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] +**title_link** | Option<**String**> | | [optional] +**username** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SlackConfirmationField.md b/openapi/docs/SlackConfirmationField.md new file mode 100755 index 00000000..f6bd07bb --- /dev/null +++ b/openapi/docs/SlackConfirmationField.md @@ -0,0 +1,14 @@ +# SlackConfirmationField + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dismiss_text** | Option<**String**> | | [optional] +**ok_text** | Option<**String**> | | [optional] +**text** | Option<**String**> | | [optional] +**title** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SlackField.md b/openapi/docs/SlackField.md new file mode 100755 index 00000000..4ede7981 --- /dev/null +++ b/openapi/docs/SlackField.md @@ -0,0 +1,13 @@ +# SlackField + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**short** | Option<**bool**> | | [optional] +**title** | Option<**String**> | | [optional] +**value** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SnapshotsApi.md b/openapi/docs/SnapshotsApi.md new file mode 100755 index 00000000..524782e2 --- /dev/null +++ b/openapi/docs/SnapshotsApi.md @@ -0,0 +1,184 @@ +# \SnapshotsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**create_dashboard_snapshot**](SnapshotsApi.md#create_dashboard_snapshot) | **POST** /snapshots | When creating a snapshot using the API, you have to provide the full dashboard payload including the snapshot data. This endpoint is designed for the Grafana UI. +[**delete_dashboard_snapshot**](SnapshotsApi.md#delete_dashboard_snapshot) | **DELETE** /snapshots/{key} | Delete Snapshot by Key. +[**delete_dashboard_snapshot_by_delete_key**](SnapshotsApi.md#delete_dashboard_snapshot_by_delete_key) | **GET** /snapshots-delete/{deleteKey} | Delete Snapshot by deleteKey. +[**get_dashboard_snapshot**](SnapshotsApi.md#get_dashboard_snapshot) | **GET** /snapshots/{key} | Get Snapshot by Key. +[**get_sharing_options**](SnapshotsApi.md#get_sharing_options) | **GET** /snapshot/shared-options | Get snapshot sharing settings. +[**search_dashboard_snapshots**](SnapshotsApi.md#search_dashboard_snapshots) | **GET** /dashboard/snapshots | List snapshots. + + + +## create_dashboard_snapshot + +> models::CreateDashboardSnapshot200Response create_dashboard_snapshot(create_dashboard_snapshot_command) +When creating a snapshot using the API, you have to provide the full dashboard payload including the snapshot data. This endpoint is designed for the Grafana UI. + +Snapshot public mode should be enabled or authentication is required. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_dashboard_snapshot_command** | [**CreateDashboardSnapshotCommand**](CreateDashboardSnapshotCommand.md) | | [required] | + +### Return type + +[**models::CreateDashboardSnapshot200Response**](createDashboardSnapshot_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_dashboard_snapshot + +> models::SuccessResponseBody delete_dashboard_snapshot(key) +Delete Snapshot by Key. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**key** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_dashboard_snapshot_by_delete_key + +> models::SuccessResponseBody delete_dashboard_snapshot_by_delete_key(delete_key) +Delete Snapshot by deleteKey. + +Snapshot public mode should be enabled or authentication is required. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**delete_key** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_dashboard_snapshot + +> get_dashboard_snapshot(key) +Get Snapshot by Key. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**key** | **String** | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_sharing_options + +> models::GetSharingOptions200Response get_sharing_options() +Get snapshot sharing settings. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::GetSharingOptions200Response**](getSharingOptions_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_dashboard_snapshots + +> Vec search_dashboard_snapshots(query, limit) +List snapshots. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**query** | Option<**String**> | Search Query | | +**limit** | Option<**i64**> | Limit the number of returned results | |[default to 1000] + +### Return type + +[**Vec**](DashboardSnapshotDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/SnsConfig.md b/openapi/docs/SnsConfig.md new file mode 100755 index 00000000..e8c56ad3 --- /dev/null +++ b/openapi/docs/SnsConfig.md @@ -0,0 +1,20 @@ +# SnsConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_url** | Option<**String**> | | [optional] +**attributes** | Option<**std::collections::HashMap**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message** | Option<**String**> | | [optional] +**phone_number** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**sigv4** | Option<[**models::SigV4Config**](SigV4Config.md)> | | [optional] +**subject** | Option<**String**> | | [optional] +**target_arn** | Option<**String**> | | [optional] +**topic_arn** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Span.md b/openapi/docs/Span.md new file mode 100755 index 00000000..bb44aeef --- /dev/null +++ b/openapi/docs/Span.md @@ -0,0 +1,12 @@ +# Span + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**length** | Option<**i32**> | Length of the span. | [optional] +**offset** | Option<**i32**> | Gap to previous span (always positive), or starting index for the 1st span (which can be negative). | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SsoSettingsApi.md b/openapi/docs/SsoSettingsApi.md new file mode 100755 index 00000000..dd7a5783 --- /dev/null +++ b/openapi/docs/SsoSettingsApi.md @@ -0,0 +1,130 @@ +# \SsoSettingsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_provider_settings**](SsoSettingsApi.md#get_provider_settings) | **GET** /v1/sso-settings/{key} | Get an SSO Settings entry by Key +[**list_all_providers_settings**](SsoSettingsApi.md#list_all_providers_settings) | **GET** /v1/sso-settings | List all SSO Settings entries +[**remove_provider_settings**](SsoSettingsApi.md#remove_provider_settings) | **DELETE** /v1/sso-settings/{key} | Remove SSO Settings +[**update_provider_settings**](SsoSettingsApi.md#update_provider_settings) | **PUT** /v1/sso-settings/{key} | Update SSO Settings + + + +## get_provider_settings + +> models::ListAllProvidersSettings200ResponseInner get_provider_settings(key) +Get an SSO Settings entry by Key + +You need to have a permission with action `settings:read` with scope `settings:auth.:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**key** | **String** | | [required] | + +### Return type + +[**models::ListAllProvidersSettings200ResponseInner**](listAllProvidersSettings_200_response_inner.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## list_all_providers_settings + +> Vec list_all_providers_settings() +List all SSO Settings entries + +You need to have a permission with action `settings:read` with scope `settings:auth.:*`. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**Vec**](listAllProvidersSettings_200_response_inner.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_provider_settings + +> models::SuccessResponseBody remove_provider_settings(key) +Remove SSO Settings + +Removes the SSO Settings for a provider. You need to have a permission with action `settings:write` and scope `settings:auth.:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**key** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_provider_settings + +> models::SuccessResponseBody update_provider_settings(key, update_provider_settings_request) +Update SSO Settings + +Inserts or updates the SSO Settings for a provider. You need to have a permission with action `settings:write` and scope `settings:auth.:*`. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**key** | **String** | | [required] | +**update_provider_settings_request** | [**UpdateProviderSettingsRequest**](UpdateProviderSettingsRequest.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/SuccessResponseBody.md b/openapi/docs/SuccessResponseBody.md new file mode 100755 index 00000000..6b781ad2 --- /dev/null +++ b/openapi/docs/SuccessResponseBody.md @@ -0,0 +1,11 @@ +# SuccessResponseBody + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**message** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SyncResult.md b/openapi/docs/SyncResult.md new file mode 100755 index 00000000..6ce3bb57 --- /dev/null +++ b/openapi/docs/SyncResult.md @@ -0,0 +1,15 @@ +# SyncResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**elapsed** | Option<**i64**> | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. | [optional] +**failed_users** | Option<[**Vec**](FailedUser.md)> | | [optional] +**missing_user_ids** | Option<**Vec**> | | [optional] +**started** | Option<**String**> | | [optional] +**updated_user_ids** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/SyncTeamGroupsApi.md b/openapi/docs/SyncTeamGroupsApi.md new file mode 100755 index 00000000..c42a910a --- /dev/null +++ b/openapi/docs/SyncTeamGroupsApi.md @@ -0,0 +1,97 @@ +# \SyncTeamGroupsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_team_group_api**](SyncTeamGroupsApi.md#add_team_group_api) | **POST** /teams/{teamId}/groups | Add External Group. +[**get_team_groups_api**](SyncTeamGroupsApi.md#get_team_groups_api) | **GET** /teams/{teamId}/groups | Get External Groups. +[**remove_team_group_api_query**](SyncTeamGroupsApi.md#remove_team_group_api_query) | **DELETE** /teams/{teamId}/groups | Remove External Group. + + + +## add_team_group_api + +> models::SuccessResponseBody add_team_group_api(team_id, team_group_mapping) +Add External Group. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | +**team_group_mapping** | [**TeamGroupMapping**](TeamGroupMapping.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_team_groups_api + +> Vec get_team_groups_api(team_id) +Get External Groups. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | + +### Return type + +[**Vec**](TeamGroupDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_team_group_api_query + +> models::SuccessResponseBody remove_team_group_api_query(team_id, group_id) +Remove External Group. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **i64** | | [required] | +**group_id** | Option<**String**> | | | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/TagsDto.md b/openapi/docs/TagsDto.md new file mode 100755 index 00000000..82756791 --- /dev/null +++ b/openapi/docs/TagsDto.md @@ -0,0 +1,12 @@ +# TagsDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**count** | Option<**i64**> | | [optional] +**tag** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TeamDto.md b/openapi/docs/TeamDto.md new file mode 100755 index 00000000..4dbf15af --- /dev/null +++ b/openapi/docs/TeamDto.md @@ -0,0 +1,19 @@ +# TeamDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_control** | Option<**std::collections::HashMap**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**email** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**member_count** | Option<**i64**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**permission** | Option<**i64**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TeamGroupDto.md b/openapi/docs/TeamGroupDto.md new file mode 100755 index 00000000..fd7a4934 --- /dev/null +++ b/openapi/docs/TeamGroupDto.md @@ -0,0 +1,13 @@ +# TeamGroupDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**group_id** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**team_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TeamGroupMapping.md b/openapi/docs/TeamGroupMapping.md new file mode 100755 index 00000000..8bb3e868 --- /dev/null +++ b/openapi/docs/TeamGroupMapping.md @@ -0,0 +1,11 @@ +# TeamGroupMapping + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**group_id** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TeamMemberDto.md b/openapi/docs/TeamMemberDto.md new file mode 100755 index 00000000..b3b9d75c --- /dev/null +++ b/openapi/docs/TeamMemberDto.md @@ -0,0 +1,21 @@ +# TeamMemberDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**auth_module** | Option<**String**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**email** | Option<**String**> | | [optional] +**labels** | Option<**Vec**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**permission** | Option<**i64**> | | [optional] +**team_id** | Option<**i64**> | | [optional] +**team_uid** | Option<**String**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TeamsApi.md b/openapi/docs/TeamsApi.md new file mode 100755 index 00000000..2486afef --- /dev/null +++ b/openapi/docs/TeamsApi.md @@ -0,0 +1,336 @@ +# \TeamsApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**add_team_member**](TeamsApi.md#add_team_member) | **POST** /teams/{team_id}/members | Add Team Member. +[**create_team**](TeamsApi.md#create_team) | **POST** /teams | Add Team. +[**delete_team_by_id**](TeamsApi.md#delete_team_by_id) | **DELETE** /teams/{team_id} | Delete Team By ID. +[**get_team_by_id**](TeamsApi.md#get_team_by_id) | **GET** /teams/{team_id} | Get Team By ID. +[**get_team_members**](TeamsApi.md#get_team_members) | **GET** /teams/{team_id}/members | Get Team Members. +[**get_team_preferences**](TeamsApi.md#get_team_preferences) | **GET** /teams/{team_id}/preferences | Get Team Preferences. +[**remove_team_member**](TeamsApi.md#remove_team_member) | **DELETE** /teams/{team_id}/members/{user_id} | Remove Member From Team. +[**search_teams**](TeamsApi.md#search_teams) | **GET** /teams/search | Team Search With Paging. +[**update_team**](TeamsApi.md#update_team) | **PUT** /teams/{team_id} | Update Team. +[**update_team_member**](TeamsApi.md#update_team_member) | **PUT** /teams/{team_id}/members/{user_id} | Update Team Member. +[**update_team_preferences**](TeamsApi.md#update_team_preferences) | **PUT** /teams/{team_id}/preferences | Update Team Preferences. + + + +## add_team_member + +> models::SuccessResponseBody add_team_member(team_id, add_team_member_command) +Add Team Member. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | +**add_team_member_command** | [**AddTeamMemberCommand**](AddTeamMemberCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## create_team + +> models::CreateTeam200Response create_team(create_team_command) +Add Team. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**create_team_command** | [**CreateTeamCommand**](CreateTeamCommand.md) | | [required] | + +### Return type + +[**models::CreateTeam200Response**](createTeam_200_response.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## delete_team_by_id + +> models::SuccessResponseBody delete_team_by_id(team_id) +Delete Team By ID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_team_by_id + +> models::TeamDto get_team_by_id(team_id) +Get Team By ID. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | + +### Return type + +[**models::TeamDto**](TeamDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_team_members + +> Vec get_team_members(team_id) +Get Team Members. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | + +### Return type + +[**Vec**](TeamMemberDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_team_preferences + +> models::Preferences get_team_preferences(team_id) +Get Team Preferences. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | + +### Return type + +[**models::Preferences**](Preferences.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## remove_team_member + +> models::SuccessResponseBody remove_team_member(team_id, user_id) +Remove Member From Team. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | +**user_id** | **i64** | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_teams + +> models::SearchTeamQueryResult search_teams(page, perpage, name, query) +Team Search With Paging. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**page** | Option<**i64**> | | |[default to 1] +**perpage** | Option<**i64**> | Number of items per page The totalCount field in the response can be used for pagination list E.g. if totalCount is equal to 100 teams and the perpage parameter is set to 10 then there are 10 pages of teams. | |[default to 1000] +**name** | Option<**String**> | | | +**query** | Option<**String**> | If set it will return results where the query value is contained in the name field. Query values with spaces need to be URL encoded. | | + +### Return type + +[**models::SearchTeamQueryResult**](SearchTeamQueryResult.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_team + +> models::SuccessResponseBody update_team(team_id, update_team_command) +Update Team. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | +**update_team_command** | [**UpdateTeamCommand**](UpdateTeamCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_team_member + +> models::SuccessResponseBody update_team_member(team_id, user_id, update_team_member_command) +Update Team Member. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | +**user_id** | **i64** | | [required] | +**update_team_member_command** | [**UpdateTeamMemberCommand**](UpdateTeamMemberCommand.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_team_preferences + +> models::SuccessResponseBody update_team_preferences(team_id, update_prefs_cmd) +Update Team Preferences. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**team_id** | **String** | | [required] | +**update_prefs_cmd** | [**UpdatePrefsCmd**](UpdatePrefsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/TelegramConfig.md b/openapi/docs/TelegramConfig.md new file mode 100755 index 00000000..e91e0d6c --- /dev/null +++ b/openapi/docs/TelegramConfig.md @@ -0,0 +1,19 @@ +# TelegramConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**chat** | Option<**i64**> | | [optional] +**disable_notifications** | Option<**bool**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message** | Option<**String**> | | [optional] +**parse_mode** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**token** | Option<**String**> | | [optional] +**token_file** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TempUserDto.md b/openapi/docs/TempUserDto.md new file mode 100755 index 00000000..17c57962 --- /dev/null +++ b/openapi/docs/TempUserDto.md @@ -0,0 +1,24 @@ +# TempUserDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**code** | Option<**String**> | | [optional] +**created_on** | Option<**String**> | | [optional] +**email** | Option<**String**> | | [optional] +**email_sent** | Option<**bool**> | | [optional] +**email_sent_on** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**invited_by_email** | Option<**String**> | | [optional] +**invited_by_login** | Option<**String**> | | [optional] +**invited_by_name** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**role** | Option<**String**> | | [optional] +**status** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestReceiverConfigResult.md b/openapi/docs/TestReceiverConfigResult.md new file mode 100755 index 00000000..10e91505 --- /dev/null +++ b/openapi/docs/TestReceiverConfigResult.md @@ -0,0 +1,14 @@ +# TestReceiverConfigResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**error** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**status** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestReceiverResult.md b/openapi/docs/TestReceiverResult.md new file mode 100755 index 00000000..0a9c4700 --- /dev/null +++ b/openapi/docs/TestReceiverResult.md @@ -0,0 +1,12 @@ +# TestReceiverResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**grafana_managed_receiver_configs** | Option<[**Vec**](TestReceiverConfigResult.md)> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestReceiversConfigAlertParams.md b/openapi/docs/TestReceiversConfigAlertParams.md new file mode 100755 index 00000000..f35c878a --- /dev/null +++ b/openapi/docs/TestReceiversConfigAlertParams.md @@ -0,0 +1,12 @@ +# TestReceiversConfigAlertParams + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**annotations** | Option<**std::collections::HashMap**> | A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet may be fully-qualified down to the point where it may resolve to a single Metric in the data store or not. All operations that occur within the realm of a LabelSet can emit a vector of Metric entities to which the LabelSet may match. | [optional] +**labels** | Option<**std::collections::HashMap**> | A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet may be fully-qualified down to the point where it may resolve to a single Metric in the data store or not. All operations that occur within the realm of a LabelSet can emit a vector of Metric entities to which the LabelSet may match. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestReceiversConfigBodyParams.md b/openapi/docs/TestReceiversConfigBodyParams.md new file mode 100755 index 00000000..b99e0519 --- /dev/null +++ b/openapi/docs/TestReceiversConfigBodyParams.md @@ -0,0 +1,12 @@ +# TestReceiversConfigBodyParams + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alert** | Option<[**models::TestReceiversConfigAlertParams**](TestReceiversConfigAlertParams.md)> | | [optional] +**receivers** | Option<[**Vec**](PostableApiReceiver.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestReceiversResult.md b/openapi/docs/TestReceiversResult.md new file mode 100755 index 00000000..36670166 --- /dev/null +++ b/openapi/docs/TestReceiversResult.md @@ -0,0 +1,13 @@ +# TestReceiversResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alert** | Option<[**models::TestReceiversConfigAlertParams**](TestReceiversConfigAlertParams.md)> | | [optional] +**notified_at** | Option<**String**> | | [optional] +**receivers** | Option<[**Vec**](TestReceiverResult.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestRulePayload.md b/openapi/docs/TestRulePayload.md new file mode 100755 index 00000000..379c14de --- /dev/null +++ b/openapi/docs/TestRulePayload.md @@ -0,0 +1,12 @@ +# TestRulePayload + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**expr** | Option<**String**> | | [optional] +**grafana_condition** | Option<[**models::EvalAlertConditionCommand**](EvalAlertConditionCommand.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestRuleResponse.md b/openapi/docs/TestRuleResponse.md new file mode 100755 index 00000000..c3ffe7c0 --- /dev/null +++ b/openapi/docs/TestRuleResponse.md @@ -0,0 +1,12 @@ +# TestRuleResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alerts** | Option<[**Vec**](Sample.md)> | Vector is basically only an alias for []Sample, but the contract is that in a Vector, all Samples have the same timestamp. | [optional] +**grafana_alert_instances** | Option<[**models::AlertInstancesResponse**](AlertInstancesResponse.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestTemplatesConfigBodyParams.md b/openapi/docs/TestTemplatesConfigBodyParams.md new file mode 100755 index 00000000..32a130cc --- /dev/null +++ b/openapi/docs/TestTemplatesConfigBodyParams.md @@ -0,0 +1,13 @@ +# TestTemplatesConfigBodyParams + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**alerts** | Option<[**Vec**](postableAlert.md)> | Alerts to use as data when testing the template. | [optional] +**name** | Option<**String**> | Name of the template file. | [optional] +**template** | Option<**String**> | Template string to test. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestTemplatesErrorResult.md b/openapi/docs/TestTemplatesErrorResult.md new file mode 100755 index 00000000..8f49e152 --- /dev/null +++ b/openapi/docs/TestTemplatesErrorResult.md @@ -0,0 +1,13 @@ +# TestTemplatesErrorResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**kind** | Option<**String**> | Kind of template error that occurred. | [optional] +**message** | Option<**String**> | Error message. | [optional] +**name** | Option<**String**> | Name of the associated template for this error. Will be empty if the Kind is \"invalid_template\". | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestTemplatesResult.md b/openapi/docs/TestTemplatesResult.md new file mode 100755 index 00000000..61c07f13 --- /dev/null +++ b/openapi/docs/TestTemplatesResult.md @@ -0,0 +1,12 @@ +# TestTemplatesResult + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | Name of the associated template definition for this result. | [optional] +**text** | Option<**String**> | Interpolated value of the template. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TestTemplatesResults.md b/openapi/docs/TestTemplatesResults.md new file mode 100755 index 00000000..3d808257 --- /dev/null +++ b/openapi/docs/TestTemplatesResults.md @@ -0,0 +1,12 @@ +# TestTemplatesResults + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**errors** | Option<[**Vec**](TestTemplatesErrorResult.md)> | | [optional] +**results** | Option<[**Vec**](TestTemplatesResult.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Threshold.md b/openapi/docs/Threshold.md new file mode 100755 index 00000000..751b32f0 --- /dev/null +++ b/openapi/docs/Threshold.md @@ -0,0 +1,13 @@ +# Threshold + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**color** | Option<**String**> | | [optional] +**state** | Option<**String**> | | [optional] +**value** | Option<**f64**> | ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/ThresholdsConfig.md b/openapi/docs/ThresholdsConfig.md new file mode 100755 index 00000000..cdd21cde --- /dev/null +++ b/openapi/docs/ThresholdsConfig.md @@ -0,0 +1,12 @@ +# ThresholdsConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**mode** | Option<**String**> | ThresholdsMode absolute or percentage | [optional] +**steps** | Option<[**Vec**](Threshold.md)> | Must be sorted by 'value', first value is always -Infinity | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TimeInterval.md b/openapi/docs/TimeInterval.md new file mode 100755 index 00000000..9062756b --- /dev/null +++ b/openapi/docs/TimeInterval.md @@ -0,0 +1,12 @@ +# TimeInterval + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**time_intervals** | Option<[**Vec**](TimeInterval.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TimeIntervalItem.md b/openapi/docs/TimeIntervalItem.md new file mode 100755 index 00000000..29cb32a7 --- /dev/null +++ b/openapi/docs/TimeIntervalItem.md @@ -0,0 +1,16 @@ +# TimeIntervalItem + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**days_of_month** | Option<**Vec**> | | [optional] +**location** | Option<**String**> | | [optional] +**months** | Option<**Vec**> | | [optional] +**times** | Option<[**Vec**](TimeIntervalTimeRange.md)> | | [optional] +**weekdays** | Option<**Vec**> | | [optional] +**years** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TimeIntervalTimeRange.md b/openapi/docs/TimeIntervalTimeRange.md new file mode 100755 index 00000000..33ff7e65 --- /dev/null +++ b/openapi/docs/TimeIntervalTimeRange.md @@ -0,0 +1,12 @@ +# TimeIntervalTimeRange + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**end_time** | Option<**String**> | | [optional] +**start_time** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TimeRange.md b/openapi/docs/TimeRange.md new file mode 100755 index 00000000..73643851 --- /dev/null +++ b/openapi/docs/TimeRange.md @@ -0,0 +1,12 @@ +# TimeRange + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**from** | Option<**String**> | | [optional] +**to** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TlsConfig.md b/openapi/docs/TlsConfig.md new file mode 100755 index 00000000..80fb63ba --- /dev/null +++ b/openapi/docs/TlsConfig.md @@ -0,0 +1,20 @@ +# TlsConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**ca** | Option<**String**> | Text of the CA cert to use for the targets. | [optional] +**ca_file** | Option<**String**> | The CA cert to use for the targets. | [optional] +**cert** | Option<**String**> | Text of the client cert file for the targets. | [optional] +**cert_file** | Option<**String**> | The client cert file for the targets. | [optional] +**insecure_skip_verify** | Option<**bool**> | Disable target certificate validation. | [optional] +**key** | Option<**String**> | | [optional] +**key_file** | Option<**String**> | The client key file for the targets. | [optional] +**max_version** | Option<**i32**> | | [optional] +**min_version** | Option<**i32**> | | [optional] +**server_name** | Option<**String**> | Used to verify the hostname for the targets. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Token.md b/openapi/docs/Token.md new file mode 100755 index 00000000..93dea598 --- /dev/null +++ b/openapi/docs/Token.md @@ -0,0 +1,34 @@ +# Token + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**account** | Option<**String**> | | [optional] +**anonymous_ratio** | Option<**i64**> | | [optional] +**company** | Option<**String**> | | [optional] +**details_url** | Option<**String**> | | [optional] +**exp** | Option<**i64**> | | [optional] +**iat** | Option<**i64**> | | [optional] +**included_users** | Option<**i64**> | | [optional] +**iss** | Option<**String**> | | [optional] +**jti** | Option<**String**> | | [optional] +**lexp** | Option<**i64**> | | [optional] +**lic_exp_warn_days** | Option<**i64**> | | [optional] +**lid** | Option<**String**> | | [optional] +**limit_by** | Option<**String**> | | [optional] +**max_concurrent_user_sessions** | Option<**i64**> | | [optional] +**nbf** | Option<**i64**> | | [optional] +**prod** | Option<**Vec**> | | [optional] +**slug** | Option<**String**> | | [optional] +**status** | Option<**i64**> | | [optional] +**sub** | Option<**String**> | | [optional] +**tok_exp_warn_days** | Option<**i64**> | | [optional] +**trial** | Option<**bool**> | | [optional] +**trial_exp** | Option<**i64**> | | [optional] +**update_days** | Option<**i64**> | | [optional] +**usage_billing** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TokenDto.md b/openapi/docs/TokenDto.md new file mode 100755 index 00000000..c3a1e5f8 --- /dev/null +++ b/openapi/docs/TokenDto.md @@ -0,0 +1,18 @@ +# TokenDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**created** | Option<**String**> | | [optional] +**expiration** | Option<**String**> | | [optional] +**has_expired** | Option<**bool**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_revoked** | Option<**bool**> | | [optional] +**last_used_at** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**seconds_until_expiration** | Option<**f64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Transformation.md b/openapi/docs/Transformation.md new file mode 100755 index 00000000..495b8e77 --- /dev/null +++ b/openapi/docs/Transformation.md @@ -0,0 +1,14 @@ +# Transformation + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**expression** | Option<**String**> | | [optional] +**field** | Option<**String**> | | [optional] +**map_value** | Option<**String**> | | [optional] +**r#type** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/TypeMeta.md b/openapi/docs/TypeMeta.md new file mode 100755 index 00000000..d8d488a8 --- /dev/null +++ b/openapi/docs/TypeMeta.md @@ -0,0 +1,12 @@ +# TypeMeta + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_version** | Option<**String**> | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources +optional | [optional] +**kind** | Option<**String**> | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +optional | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Unstructured.md b/openapi/docs/Unstructured.md new file mode 100755 index 00000000..264352cf --- /dev/null +++ b/openapi/docs/Unstructured.md @@ -0,0 +1,11 @@ +# Unstructured + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**object** | Option<[**serde_json::Value**](.md)> | Object is a JSON compatible map with string, float, int, bool, []interface{}, or map[string]interface{} children. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateAnnotationsCmd.md b/openapi/docs/UpdateAnnotationsCmd.md new file mode 100755 index 00000000..ecd5bc91 --- /dev/null +++ b/openapi/docs/UpdateAnnotationsCmd.md @@ -0,0 +1,16 @@ +# UpdateAnnotationsCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | Option<[**serde_json::Value**](.md)> | | [optional] +**id** | Option<**i64**> | | [optional] +**tags** | Option<**Vec**> | | [optional] +**text** | Option<**String**> | | [optional] +**time** | Option<**i64**> | | [optional] +**time_end** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateCorrelationCommand.md b/openapi/docs/UpdateCorrelationCommand.md new file mode 100755 index 00000000..9b17675d --- /dev/null +++ b/openapi/docs/UpdateCorrelationCommand.md @@ -0,0 +1,13 @@ +# UpdateCorrelationCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**config** | Option<[**models::CorrelationConfigUpdateDto**](CorrelationConfigUpdateDTO.md)> | | [optional] +**description** | Option<**String**> | Optional description of the correlation | [optional] +**label** | Option<**String**> | Optional label identifying the correlation | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateCorrelationResponseBody.md b/openapi/docs/UpdateCorrelationResponseBody.md new file mode 100755 index 00000000..3cb688d9 --- /dev/null +++ b/openapi/docs/UpdateCorrelationResponseBody.md @@ -0,0 +1,12 @@ +# UpdateCorrelationResponseBody + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**message** | Option<**String**> | | [optional] +**result** | Option<[**models::Correlation**](Correlation.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateDashboardAclCommand.md b/openapi/docs/UpdateDashboardAclCommand.md new file mode 100755 index 00000000..ee0ded08 --- /dev/null +++ b/openapi/docs/UpdateDashboardAclCommand.md @@ -0,0 +1,11 @@ +# UpdateDashboardAclCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**items** | Option<[**Vec**](DashboardACLUpdateItem.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateDataSourceCommand.md b/openapi/docs/UpdateDataSourceCommand.md new file mode 100755 index 00000000..ebf80f9f --- /dev/null +++ b/openapi/docs/UpdateDataSourceCommand.md @@ -0,0 +1,24 @@ +# UpdateDataSourceCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access** | Option<**String**> | | [optional] +**basic_auth** | Option<**bool**> | | [optional] +**basic_auth_user** | Option<**String**> | | [optional] +**database** | Option<**String**> | | [optional] +**is_default** | Option<**bool**> | | [optional] +**json_data** | Option<[**serde_json::Value**](.md)> | | [optional] +**name** | Option<**String**> | | [optional] +**secure_json_data** | Option<**std::collections::HashMap**> | | [optional] +**r#type** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**url** | Option<**String**> | | [optional] +**user** | Option<**String**> | | [optional] +**version** | Option<**i64**> | | [optional] +**with_credentials** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateFolderCommand.md b/openapi/docs/UpdateFolderCommand.md new file mode 100755 index 00000000..df046f80 --- /dev/null +++ b/openapi/docs/UpdateFolderCommand.md @@ -0,0 +1,14 @@ +# UpdateFolderCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | Option<**String**> | NewDescription it's an optional parameter used for overriding the existing folder description | [optional] +**overwrite** | Option<**bool**> | Overwrite only used by the legacy folder implementation | [optional] +**title** | Option<**String**> | NewTitle it's an optional parameter used for overriding the existing folder title | [optional] +**version** | Option<**i64**> | Version only used by the legacy folder implementation | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateOrgAddressForm.md b/openapi/docs/UpdateOrgAddressForm.md new file mode 100755 index 00000000..21ca4473 --- /dev/null +++ b/openapi/docs/UpdateOrgAddressForm.md @@ -0,0 +1,16 @@ +# UpdateOrgAddressForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**address1** | Option<**String**> | | [optional] +**address2** | Option<**String**> | | [optional] +**city** | Option<**String**> | | [optional] +**country** | Option<**String**> | | [optional] +**state** | Option<**String**> | | [optional] +**zipcode** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateOrgForm.md b/openapi/docs/UpdateOrgForm.md new file mode 100755 index 00000000..07d21234 --- /dev/null +++ b/openapi/docs/UpdateOrgForm.md @@ -0,0 +1,11 @@ +# UpdateOrgForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateOrgUserCommand.md b/openapi/docs/UpdateOrgUserCommand.md new file mode 100755 index 00000000..3e8f7a7c --- /dev/null +++ b/openapi/docs/UpdateOrgUserCommand.md @@ -0,0 +1,11 @@ +# UpdateOrgUserCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**role** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdatePlaylistCommand.md b/openapi/docs/UpdatePlaylistCommand.md new file mode 100755 index 00000000..01ea7c45 --- /dev/null +++ b/openapi/docs/UpdatePlaylistCommand.md @@ -0,0 +1,14 @@ +# UpdatePlaylistCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**interval** | Option<**String**> | | [optional] +**items** | Option<[**Vec**](PlaylistItem.md)> | | [optional] +**name** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdatePrefsCmd.md b/openapi/docs/UpdatePrefsCmd.md new file mode 100755 index 00000000..1f3c4fe5 --- /dev/null +++ b/openapi/docs/UpdatePrefsCmd.md @@ -0,0 +1,18 @@ +# UpdatePrefsCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**cookies** | Option<**Vec**> | | [optional] +**home_dashboard_id** | Option<**i64**> | The numerical :id of a favorited dashboard | [optional][default to 0] +**home_dashboard_uid** | Option<**String**> | | [optional] +**language** | Option<**String**> | | [optional] +**query_history** | Option<[**models::QueryHistoryPreference**](QueryHistoryPreference.md)> | | [optional] +**theme** | Option<**String**> | | [optional] +**timezone** | Option<**String**> | | [optional] +**week_start** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateProviderSettingsRequest.md b/openapi/docs/UpdateProviderSettingsRequest.md new file mode 100755 index 00000000..99386b04 --- /dev/null +++ b/openapi/docs/UpdateProviderSettingsRequest.md @@ -0,0 +1,13 @@ +# UpdateProviderSettingsRequest + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**String**> | | [optional] +**provider** | Option<**String**> | | [optional] +**settings** | Option<[**serde_json::Value**](.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateQuotaCmd.md b/openapi/docs/UpdateQuotaCmd.md new file mode 100755 index 00000000..083555d3 --- /dev/null +++ b/openapi/docs/UpdateQuotaCmd.md @@ -0,0 +1,12 @@ +# UpdateQuotaCmd + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**limit** | Option<**i64**> | | [optional] +**target** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateRoleCommand.md b/openapi/docs/UpdateRoleCommand.md new file mode 100755 index 00000000..d358d7af --- /dev/null +++ b/openapi/docs/UpdateRoleCommand.md @@ -0,0 +1,18 @@ +# UpdateRoleCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | Option<**String**> | | [optional] +**display_name** | Option<**String**> | | [optional] +**global** | Option<**bool**> | | [optional] +**group** | Option<**String**> | | [optional] +**hidden** | Option<**bool**> | | [optional] +**name** | Option<**String**> | | [optional] +**permissions** | Option<[**Vec**](Permission.md)> | | [optional] +**version** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateRuleGroupResponse.md b/openapi/docs/UpdateRuleGroupResponse.md new file mode 100755 index 00000000..2628f58f --- /dev/null +++ b/openapi/docs/UpdateRuleGroupResponse.md @@ -0,0 +1,14 @@ +# UpdateRuleGroupResponse + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**created** | Option<**Vec**> | | [optional] +**deleted** | Option<**Vec**> | | [optional] +**message** | Option<**String**> | | [optional] +**updated** | Option<**Vec**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateServiceAccount200Response.md b/openapi/docs/UpdateServiceAccount200Response.md new file mode 100755 index 00000000..63fbbad3 --- /dev/null +++ b/openapi/docs/UpdateServiceAccount200Response.md @@ -0,0 +1,14 @@ +# UpdateServiceAccount200Response + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | Option<**i64**> | | [optional] +**message** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**serviceaccount** | Option<[**models::ServiceAccountProfileDto**](ServiceAccountProfileDTO.md)> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateServiceAccountForm.md b/openapi/docs/UpdateServiceAccountForm.md new file mode 100755 index 00000000..2014a7b4 --- /dev/null +++ b/openapi/docs/UpdateServiceAccountForm.md @@ -0,0 +1,14 @@ +# UpdateServiceAccountForm + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**is_disabled** | Option<**bool**> | | [optional] +**name** | Option<**String**> | | [optional] +**role** | Option<**String**> | | [optional] +**service_account_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateTeamCommand.md b/openapi/docs/UpdateTeamCommand.md new file mode 100755 index 00000000..0f0400ee --- /dev/null +++ b/openapi/docs/UpdateTeamCommand.md @@ -0,0 +1,13 @@ +# UpdateTeamCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**email** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**name** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateTeamMemberCommand.md b/openapi/docs/UpdateTeamMemberCommand.md new file mode 100755 index 00000000..ca4d5c42 --- /dev/null +++ b/openapi/docs/UpdateTeamMemberCommand.md @@ -0,0 +1,11 @@ +# UpdateTeamMemberCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**permission** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UpdateUserCommand.md b/openapi/docs/UpdateUserCommand.md new file mode 100755 index 00000000..348849cc --- /dev/null +++ b/openapi/docs/UpdateUserCommand.md @@ -0,0 +1,14 @@ +# UpdateUserCommand + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**email** | Option<**String**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**theme** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/Url.md b/openapi/docs/Url.md new file mode 100755 index 00000000..43d53024 --- /dev/null +++ b/openapi/docs/Url.md @@ -0,0 +1,21 @@ +# Url + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**force_query** | Option<**bool**> | | [optional] +**fragment** | Option<**String**> | | [optional] +**host** | Option<**String**> | | [optional] +**omit_host** | Option<**bool**> | | [optional] +**opaque** | Option<**String**> | | [optional] +**path** | Option<**String**> | | [optional] +**raw_fragment** | Option<**String**> | | [optional] +**raw_path** | Option<**String**> | | [optional] +**raw_query** | Option<**String**> | | [optional] +**scheme** | Option<**String**> | | [optional] +**user** | Option<[**serde_json::Value**](.md)> | The Userinfo type is an immutable encapsulation of username and password details for a URL. An existing Userinfo value is guaranteed to have a username set (potentially empty, as allowed by RFC 2396), and optionally a password. | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UserApi.md b/openapi/docs/UserApi.md new file mode 100755 index 00000000..bbe7912d --- /dev/null +++ b/openapi/docs/UserApi.md @@ -0,0 +1,36 @@ +# \UserApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**update_user_email**](UserApi.md#update_user_email) | **GET** /user/email/update | Update user email. + + + +## update_user_email + +> update_user_email() +Update user email. + +Update the email of user given a verification code. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + + (empty response body) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/UserLookupDto.md b/openapi/docs/UserLookupDto.md new file mode 100755 index 00000000..0e743e37 --- /dev/null +++ b/openapi/docs/UserLookupDto.md @@ -0,0 +1,13 @@ +# UserLookupDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**avatar_url** | Option<**String**> | | [optional] +**login** | Option<**String**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UserOrgDto.md b/openapi/docs/UserOrgDto.md new file mode 100755 index 00000000..303c5d2b --- /dev/null +++ b/openapi/docs/UserOrgDto.md @@ -0,0 +1,13 @@ +# UserOrgDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**role** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UserPreferencesApi.md b/openapi/docs/UserPreferencesApi.md new file mode 100755 index 00000000..280effa4 --- /dev/null +++ b/openapi/docs/UserPreferencesApi.md @@ -0,0 +1,94 @@ +# \UserPreferencesApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_user_preferences**](UserPreferencesApi.md#get_user_preferences) | **GET** /user/preferences | Get user preferences. +[**patch_user_preferences**](UserPreferencesApi.md#patch_user_preferences) | **PATCH** /user/preferences | Patch user preferences. +[**update_user_preferences**](UserPreferencesApi.md#update_user_preferences) | **PUT** /user/preferences | Update user preferences. + + + +## get_user_preferences + +> models::Preferences get_user_preferences() +Get user preferences. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::Preferences**](Preferences.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## patch_user_preferences + +> models::SuccessResponseBody patch_user_preferences(patch_prefs_cmd) +Patch user preferences. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**patch_prefs_cmd** | [**PatchPrefsCmd**](PatchPrefsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_user_preferences + +> models::SuccessResponseBody update_user_preferences(update_prefs_cmd) +Update user preferences. + +Omitting a key (`theme`, `homeDashboardId`, `timezone`) will cause the current value to be replaced with the system default value. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**update_prefs_cmd** | [**UpdatePrefsCmd**](UpdatePrefsCmd.md) | | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/UserProfileDto.md b/openapi/docs/UserProfileDto.md new file mode 100755 index 00000000..e4c7204c --- /dev/null +++ b/openapi/docs/UserProfileDto.md @@ -0,0 +1,27 @@ +# UserProfileDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**access_control** | Option<**std::collections::HashMap**> | | [optional] +**auth_labels** | Option<**Vec**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**created_at** | Option<**String**> | | [optional] +**email** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_disabled** | Option<**bool**> | | [optional] +**is_external** | Option<**bool**> | | [optional] +**is_externally_synced** | Option<**bool**> | | [optional] +**is_grafana_admin** | Option<**bool**> | | [optional] +**is_grafana_admin_externally_synced** | Option<**bool**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**org_id** | Option<**i64**> | | [optional] +**theme** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] +**updated_at** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UserSearchHitDto.md b/openapi/docs/UserSearchHitDto.md new file mode 100755 index 00000000..e3e4a1d6 --- /dev/null +++ b/openapi/docs/UserSearchHitDto.md @@ -0,0 +1,21 @@ +# UserSearchHitDto + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**auth_labels** | Option<**Vec**> | | [optional] +**avatar_url** | Option<**String**> | | [optional] +**email** | Option<**String**> | | [optional] +**id** | Option<**i64**> | | [optional] +**is_admin** | Option<**bool**> | | [optional] +**is_disabled** | Option<**bool**> | | [optional] +**last_seen_at** | Option<**String**> | | [optional] +**last_seen_at_age** | Option<**String**> | | [optional] +**login** | Option<**String**> | | [optional] +**name** | Option<**String**> | | [optional] +**uid** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UserToken.md b/openapi/docs/UserToken.md new file mode 100755 index 00000000..96594f4a --- /dev/null +++ b/openapi/docs/UserToken.md @@ -0,0 +1,23 @@ +# UserToken + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**auth_token** | Option<**String**> | | [optional] +**auth_token_seen** | Option<**bool**> | | [optional] +**client_ip** | Option<**String**> | | [optional] +**created_at** | Option<**i64**> | | [optional] +**id** | Option<**i64**> | | [optional] +**prev_auth_token** | Option<**String**> | | [optional] +**revoked_at** | Option<**i64**> | | [optional] +**rotated_at** | Option<**i64**> | | [optional] +**seen_at** | Option<**i64**> | | [optional] +**unhashed_token** | Option<**String**> | | [optional] +**updated_at** | Option<**i64**> | | [optional] +**user_agent** | Option<**String**> | | [optional] +**user_id** | Option<**i64**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/UsersApi.md b/openapi/docs/UsersApi.md new file mode 100755 index 00000000..fc767b0f --- /dev/null +++ b/openapi/docs/UsersApi.md @@ -0,0 +1,218 @@ +# \UsersApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**get_user_by_id**](UsersApi.md#get_user_by_id) | **GET** /users/{user_id} | Get user by id. +[**get_user_by_login_or_email**](UsersApi.md#get_user_by_login_or_email) | **GET** /users/lookup | Get user by login or email. +[**get_user_org_list**](UsersApi.md#get_user_org_list) | **GET** /users/{user_id}/orgs | Get organizations for user. +[**get_user_teams**](UsersApi.md#get_user_teams) | **GET** /users/{user_id}/teams | Get teams for user. +[**search_users**](UsersApi.md#search_users) | **GET** /users | Get users. +[**search_users_with_paging**](UsersApi.md#search_users_with_paging) | **GET** /users/search | Get users with paging. +[**update_user**](UsersApi.md#update_user) | **PUT** /users/{user_id} | Update user. + + + +## get_user_by_id + +> models::UserProfileDto get_user_by_id(user_id) +Get user by id. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**models::UserProfileDto**](UserProfileDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_user_by_login_or_email + +> models::UserProfileDto get_user_by_login_or_email(login_or_email) +Get user by login or email. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**login_or_email** | **String** | loginOrEmail of the user | [required] | + +### Return type + +[**models::UserProfileDto**](UserProfileDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_user_org_list + +> Vec get_user_org_list(user_id) +Get organizations for user. + +Get organizations for user identified by id. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**Vec**](UserOrgDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## get_user_teams + +> Vec get_user_teams(user_id) +Get teams for user. + +Get teams for user identified by id. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | + +### Return type + +[**Vec**](TeamDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_users + +> Vec search_users(perpage, page) +Get users. + +Returns all users that the authenticated user has permission to view, admin permission required. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**perpage** | Option<**i64**> | Limit the maximum number of users to return per page | |[default to 1000] +**page** | Option<**i64**> | Page index for starting fetching users | |[default to 1] + +### Return type + +[**Vec**](UserSearchHitDTO.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## search_users_with_paging + +> models::SearchUserQueryResult search_users_with_paging() +Get users with paging. + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**models::SearchUserQueryResult**](SearchUserQueryResult.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: Not defined +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + + +## update_user + +> models::SuccessResponseBody update_user(user_id, update_user_command) +Update user. + +Update the user identified by id. + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**user_id** | **i64** | | [required] | +**update_user_command** | [**UpdateUserCommand**](UpdateUserCommand.md) | To change the email, name, login, theme, provide another one. | [required] | + +### Return type + +[**models::SuccessResponseBody**](SuccessResponseBody.md) + +### Authorization + +[api_key](../README.md#api_key), [basic](../README.md#basic) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/openapi/docs/ValidationError.md b/openapi/docs/ValidationError.md new file mode 100755 index 00000000..554def7e --- /dev/null +++ b/openapi/docs/ValidationError.md @@ -0,0 +1,11 @@ +# ValidationError + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**msg** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/VersionInfo.md b/openapi/docs/VersionInfo.md new file mode 100755 index 00000000..54813cb7 --- /dev/null +++ b/openapi/docs/VersionInfo.md @@ -0,0 +1,16 @@ +# VersionInfo + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**branch** | **String** | branch | +**build_date** | **String** | build date | +**build_user** | **String** | build user | +**go_version** | **String** | go version | +**revision** | **String** | revision | +**version** | **String** | version | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/VictorOpsConfig.md b/openapi/docs/VictorOpsConfig.md new file mode 100755 index 00000000..632f4258 --- /dev/null +++ b/openapi/docs/VictorOpsConfig.md @@ -0,0 +1,21 @@ +# VictorOpsConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_key** | Option<**String**> | | [optional] +**api_key_file** | Option<**String**> | | [optional] +**api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**custom_fields** | Option<**std::collections::HashMap**> | | [optional] +**entity_display_name** | Option<**String**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message_type** | Option<**String**> | | [optional] +**monitoring_tool** | Option<**String**> | | [optional] +**routing_key** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**state_message** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/WebexConfig.md b/openapi/docs/WebexConfig.md new file mode 100755 index 00000000..e2047880 --- /dev/null +++ b/openapi/docs/WebexConfig.md @@ -0,0 +1,15 @@ +# WebexConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message** | Option<**String**> | | [optional] +**room_id** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/WebhookConfig.md b/openapi/docs/WebhookConfig.md new file mode 100755 index 00000000..8ada2397 --- /dev/null +++ b/openapi/docs/WebhookConfig.md @@ -0,0 +1,15 @@ +# WebhookConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**max_alerts** | Option<**i32**> | MaxAlerts is the maximum number of alerts to be sent per webhook message. Alerts exceeding this threshold will be truncated. Setting this to 0 allows an unlimited number of alerts. | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**url** | Option<[**models::Url**](URL.md)> | | [optional] +**url_file** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/docs/WechatConfig.md b/openapi/docs/WechatConfig.md new file mode 100755 index 00000000..fe6554ff --- /dev/null +++ b/openapi/docs/WechatConfig.md @@ -0,0 +1,21 @@ +# WechatConfig + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**agent_id** | Option<**String**> | | [optional] +**api_secret** | Option<**String**> | | [optional] +**api_url** | Option<[**models::Url**](URL.md)> | | [optional] +**corp_id** | Option<**String**> | | [optional] +**http_config** | Option<[**models::HttpClientConfig**](HTTPClientConfig.md)> | | [optional] +**message** | Option<**String**> | | [optional] +**message_type** | Option<**String**> | | [optional] +**send_resolved** | Option<**bool**> | | [optional] +**to_party** | Option<**String**> | | [optional] +**to_tag** | Option<**String**> | | [optional] +**to_user** | Option<**String**> | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/openapi/src/apis/access_control_api.rs b/openapi/src/apis/access_control_api.rs new file mode 100755 index 00000000..8831998f --- /dev/null +++ b/openapi/src/apis/access_control_api.rs @@ -0,0 +1,1223 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_team_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddTeamRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`add_user_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddUserRoleError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_access_control_status`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetAccessControlStatusError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_resource_description`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetResourceDescriptionError { + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_resource_permissions`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetResourcePermissionsError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetRoleError { + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_role_assignments`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetRoleAssignmentsError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListRolesError { + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_team_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListTeamRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_teams_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListTeamsRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_user_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListUserRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_users_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListUsersRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_team_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveTeamRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_user_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveUserRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_resource_permissions`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetResourcePermissionsError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_resource_permissions_for_built_in_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetResourcePermissionsForBuiltInRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_resource_permissions_for_team`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetResourcePermissionsForTeamError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_resource_permissions_for_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetResourcePermissionsForUserError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_role_assignments`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetRoleAssignmentsError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_team_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetTeamRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_user_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetUserRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// You need to have a permission with action `teams.roles:add` and scope `permissions:type:delegate`. +pub async fn add_team_role(configuration: &configuration::Configuration, team_id: i64, add_team_role_command: models::AddTeamRoleCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_team_role_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Assign a role to a specific user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:add` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only assign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign a role which will allow to do that. This is done to prevent escalation of privileges. +pub async fn add_user_role(configuration: &configuration::Configuration, user_id: i64, add_user_role_command: models::AddUserRoleCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles", local_var_configuration.base_path, userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_user_role_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Creates a new custom role and maps given permissions to that role. Note that roles with the same prefix as Fixed Roles can’t be created. You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to create a custom role which allows to do that. This is done to prevent escalation of privileges. +pub async fn create_role(configuration: &configuration::Configuration, create_role_form: models::CreateRoleForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_role_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Delete a role with the given UID, and it’s permissions. If the role is assigned to a built-in role, the deletion operation will fail, unless force query param is set to true, and in that case all assignments will also be deleted. You need to have a permission with action `roles:delete` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only delete a custom role with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to delete a custom role which allows to do that. +pub async fn delete_role(configuration: &configuration::Configuration, role_uid: &str, force: Option, global: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = force { + local_var_req_builder = local_var_req_builder.query(&[("force", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = global { + local_var_req_builder = local_var_req_builder.query(&[("global", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns an indicator to check if fine-grained access control is enabled or not. You need to have a permission with action `status:accesscontrol` and scope `services:accesscontrol`. +pub async fn get_access_control_status(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/status", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_resource_description(configuration: &configuration::Configuration, resource: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/{resource}/description", local_var_configuration.base_path, resource=crate::apis::urlencode(resource)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_resource_permissions(configuration: &configuration::Configuration, resource: &str, resource_id: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/{resource}/{resourceID}", local_var_configuration.base_path, resource=crate::apis::urlencode(resource), resourceID=crate::apis::urlencode(resource_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get a role for the given UID. You need to have a permission with action `roles:read` and scope `roles:*`. +pub async fn get_role(configuration: &configuration::Configuration, role_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get role assignments for the role with the given UID. You need to have a permission with action `teams.roles:list` and scope `teams:id:*` and `users.roles:list` and scope `users:id:*`. +pub async fn get_role_assignments(configuration: &configuration::Configuration, role_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}/assignments", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Gets all existing roles. The response contains all global and organization local roles, for the organization which user is signed in. You need to have a permission with action `roles:read` and scope `roles:*`. +pub async fn list_roles(configuration: &configuration::Configuration, delegatable: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = delegatable { + local_var_req_builder = local_var_req_builder.query(&[("delegatable", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `teams.roles:read` and scope `teams:id:`. +pub async fn list_team_roles(configuration: &configuration::Configuration, team_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Lists the roles that have been directly assigned to the given teams. You need to have a permission with action `teams.roles:read` and scope `teams:id:*`. +pub async fn list_teams_roles(configuration: &configuration::Configuration, roles_search_query: models::RolesSearchQuery) -> Result>, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/roles/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&roles_search_query); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Lists the roles that have been directly assigned to a given user. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:`. +pub async fn list_user_roles(configuration: &configuration::Configuration, user_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles", local_var_configuration.base_path, userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Lists the roles that have been directly assigned to the given users. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:*`. +pub async fn list_users_roles(configuration: &configuration::Configuration, roles_search_query: models::RolesSearchQuery) -> Result>, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/roles/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&roles_search_query); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `teams.roles:remove` and scope `permissions:type:delegate`. +pub async fn remove_team_role(configuration: &configuration::Configuration, role_uid: &str, team_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid), teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Revoke a role from a user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:remove` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to unassign a role which will allow to do that. This is done to prevent escalation of privileges. +pub async fn remove_user_role(configuration: &configuration::Configuration, role_uid: &str, user_id: i64, global: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid), userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = global { + local_var_req_builder = local_var_req_builder.query(&[("global", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to one or many assignment types. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. +pub async fn set_resource_permissions(configuration: &configuration::Configuration, resource: &str, resource_id: &str, set_permissions_command: models::SetPermissionsCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/{resource}/{resourceID}", local_var_configuration.base_path, resource=crate::apis::urlencode(resource), resourceID=crate::apis::urlencode(resource_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_permissions_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to a built-in role. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. +pub async fn set_resource_permissions_for_built_in_role(configuration: &configuration::Configuration, resource: &str, resource_id: &str, built_in_role: &str, set_permission_command: models::SetPermissionCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/{resource}/{resourceID}/builtInRoles/{builtInRole}", local_var_configuration.base_path, resource=crate::apis::urlencode(resource), resourceID=crate::apis::urlencode(resource_id), builtInRole=crate::apis::urlencode(built_in_role)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_permission_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to a team. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. +pub async fn set_resource_permissions_for_team(configuration: &configuration::Configuration, resource: &str, resource_id: &str, team_id: i64, set_permission_command: models::SetPermissionCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/{resource}/{resourceID}/teams/{teamID}", local_var_configuration.base_path, resource=crate::apis::urlencode(resource), resourceID=crate::apis::urlencode(resource_id), teamID=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_permission_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Assigns permissions for a resource by a given type (`:resource`) and `:resourceID` to a user or a service account. Allowed resources are `datasources`, `teams`, `dashboards`, `folders`, and `serviceaccounts`. Refer to the `/access-control/{resource}/description` endpoint for allowed Permissions. +pub async fn set_resource_permissions_for_user(configuration: &configuration::Configuration, resource: &str, resource_id: &str, user_id: i64, set_permission_command: models::SetPermissionCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/{resource}/{resourceID}/users/{userID}", local_var_configuration.base_path, resource=crate::apis::urlencode(resource), resourceID=crate::apis::urlencode(resource_id), userID=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_permission_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Set role assignments for the role with the given UID. You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate`, and `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate`. +pub async fn set_role_assignments(configuration: &configuration::Configuration, role_uid: &str, set_role_assignments_command: models::SetRoleAssignmentsCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}/assignments", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_role_assignments_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate` for each. +pub async fn set_team_roles(configuration: &configuration::Configuration, team_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Update the user’s role assignments to match the provided set of UIDs. This will remove any assigned roles that aren’t in the request and add roles that are in the set but are not already assigned to the user. If you want to add or remove a single role, consider using Add a user role assignment or Remove a user role assignment instead. You need to have a permission with action `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate` for each. `permissions:type:delegate` scope ensures that users can only assign or unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign or unassign a role which will allow to do that. This is done to prevent escalation of privileges. +pub async fn set_user_roles(configuration: &configuration::Configuration, user_id: i64, set_user_roles_command: models::SetUserRolesCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles", local_var_configuration.base_path, userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_user_roles_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. +pub async fn update_role(configuration: &configuration::Configuration, role_uid: &str, update_role_command: models::UpdateRoleCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_role_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/access_control_provisioning_api.rs b/openapi/src/apis/access_control_provisioning_api.rs new file mode 100755 index 00000000..a64bbf27 --- /dev/null +++ b/openapi/src/apis/access_control_provisioning_api.rs @@ -0,0 +1,65 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`admin_provisioning_reload_access_control`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminProvisioningReloadAccessControlError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn admin_provisioning_reload_access_control(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/provisioning/access-control/reload", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/admin_api.rs b/openapi/src/apis/admin_api.rs new file mode 100755 index 00000000..29904ccc --- /dev/null +++ b/openapi/src/apis/admin_api.rs @@ -0,0 +1,107 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`admin_get_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminGetSettingsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_get_stats`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminGetStatsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `settings:read` and scopes: `settings:*`, `settings:auth.saml:` and `settings:auth.saml:enabled` (property level). +pub async fn admin_get_settings(configuration: &configuration::Configuration, ) -> Result>, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/settings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Only works with Basic Authentication (username and password). See introduction for an explanation. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `server:stats:read`. +pub async fn admin_get_stats(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/stats", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/admin_ldap_api.rs b/openapi/src/apis/admin_ldap_api.rs new file mode 100755 index 00000000..3b9c28bf --- /dev/null +++ b/openapi/src/apis/admin_ldap_api.rs @@ -0,0 +1,182 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_ldap_status`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetLdapStatusError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_user_from_ldap`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserFromLdapError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_sync_user_with_ldap`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostSyncUserWithLdapError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`reload_ldap_cfg`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ReloadLdapCfgError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.status:read`. +pub async fn get_ldap_status(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/ldap/status", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.user:read`. +pub async fn get_user_from_ldap(configuration: &configuration::Configuration, user_name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/ldap/{user_name}", local_var_configuration.base_path, user_name=crate::apis::urlencode(user_name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.user:sync`. +pub async fn post_sync_user_with_ldap(configuration: &configuration::Configuration, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/ldap/sync/{user_id}", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `ldap.config:reload`. +pub async fn reload_ldap_cfg(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/ldap/reload", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/admin_provisioning_api.rs b/openapi/src/apis/admin_provisioning_api.rs new file mode 100755 index 00000000..df5a3c1c --- /dev/null +++ b/openapi/src/apis/admin_provisioning_api.rs @@ -0,0 +1,141 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`admin_provisioning_reload_dashboards`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminProvisioningReloadDashboardsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_provisioning_reload_datasources`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminProvisioningReloadDatasourcesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_provisioning_reload_plugins`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminProvisioningReloadPluginsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Reloads the provisioning config files for dashboards again. It won’t return until the new provisioned entities are already stored in the database. In case of dashboards, it will stop polling for changes in dashboard files and then restart it with new configurations after returning. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `provisioning:reload` and scope `provisioners:dashboards`. +pub async fn admin_provisioning_reload_dashboards(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/provisioning/dashboards/reload", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Reloads the provisioning config files for datasources again. It won’t return until the new provisioned entities are already stored in the database. In case of dashboards, it will stop polling for changes in dashboard files and then restart it with new configurations after returning. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `provisioning:reload` and scope `provisioners:datasources`. +pub async fn admin_provisioning_reload_datasources(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/provisioning/datasources/reload", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Reloads the provisioning config files for plugins again. It won’t return until the new provisioned entities are already stored in the database. In case of dashboards, it will stop polling for changes in dashboard files and then restart it with new configurations after returning. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `provisioning:reload` and scope `provisioners:plugin`. +pub async fn admin_provisioning_reload_plugins(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/provisioning/plugins/reload", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/admin_users_api.rs b/openapi/src/apis/admin_users_api.rs new file mode 100755 index 00000000..4cd12a06 --- /dev/null +++ b/openapi/src/apis/admin_users_api.rs @@ -0,0 +1,495 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`admin_create_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminCreateUserError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status412(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_delete_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminDeleteUserError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_disable_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminDisableUserError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_enable_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminEnableUserError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_get_user_auth_tokens`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminGetUserAuthTokensError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_logout_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminLogoutUserError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_revoke_user_auth_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminRevokeUserAuthTokenError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_update_user_password`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminUpdateUserPasswordError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_update_user_permissions`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminUpdateUserPermissionsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_user_quota`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserQuotaError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_user_quota`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserQuotaError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:create`. Note that OrgId is an optional parameter that can be used to assign a new user to a different organization when `auto_assign_org` is set to `true`. +pub async fn admin_create_user(configuration: &configuration::Configuration, admin_create_user_form: models::AdminCreateUserForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&admin_create_user_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:delete` and scope `global.users:*`. +pub async fn admin_delete_user(configuration: &configuration::Configuration, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:disable` and scope `global.users:1` (userIDScope). +pub async fn admin_disable_user(configuration: &configuration::Configuration, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/disable", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users:enable` and scope `global.users:1` (userIDScope). +pub async fn admin_enable_user(configuration: &configuration::Configuration, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/enable", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.authtoken:list` and scope `global.users:*`. +pub async fn admin_get_user_auth_tokens(configuration: &configuration::Configuration, user_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/auth-tokens", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.logout` and scope `global.users:*`. +pub async fn admin_logout_user(configuration: &configuration::Configuration, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/logout", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Revokes the given auth token (device) for the user. User of issued auth token (device) will no longer be logged in and will be required to authenticate again upon next activity. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.authtoken:update` and scope `global.users:*`. +pub async fn admin_revoke_user_auth_token(configuration: &configuration::Configuration, user_id: i64, revoke_auth_token_cmd: models::RevokeAuthTokenCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/revoke-auth-token", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&revoke_auth_token_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.password:update` and scope `global.users:*`. +pub async fn admin_update_user_password(configuration: &configuration::Configuration, user_id: i64, admin_update_user_password_form: models::AdminUpdateUserPasswordForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/password", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&admin_update_user_password_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Only works with Basic Authentication (username and password). See introduction for an explanation. If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.permissions:update` and scope `global.users:*`. +pub async fn admin_update_user_permissions(configuration: &configuration::Configuration, user_id: i64, admin_update_user_permissions_form: models::AdminUpdateUserPermissionsForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/permissions", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&admin_update_user_permissions_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.quotas:list` and scope `global.users:1` (userIDScope). +pub async fn get_user_quota(configuration: &configuration::Configuration, user_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/quotas", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.quotas:update` and scope `global.users:1` (userIDScope). +pub async fn update_user_quota(configuration: &configuration::Configuration, quota_target: &str, user_id: i64, update_quota_cmd: models::UpdateQuotaCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/users/{user_id}/quotas/{quota_target}", local_var_configuration.base_path, quota_target=crate::apis::urlencode(quota_target), user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_quota_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/annotations_api.rs b/openapi/src/apis/annotations_api.rs new file mode 100755 index 00000000..e120d1f5 --- /dev/null +++ b/openapi/src/apis/annotations_api.rs @@ -0,0 +1,504 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`delete_annotation_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteAnnotationByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_annotation_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetAnnotationByIdError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_annotation_tags`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetAnnotationTagsError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_annotations`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetAnnotationsError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`mass_delete_annotations`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum MassDeleteAnnotationsError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`patch_annotation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PatchAnnotationError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_annotation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostAnnotationError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_graphite_annotation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostGraphiteAnnotationError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_annotation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateAnnotationError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Deletes the annotation that matches the specified ID. +pub async fn delete_annotation_by_id(configuration: &configuration::Configuration, annotation_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations/{annotation_id}", local_var_configuration.base_path, annotation_id=crate::apis::urlencode(annotation_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_annotation_by_id(configuration: &configuration::Configuration, annotation_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations/{annotation_id}", local_var_configuration.base_path, annotation_id=crate::apis::urlencode(annotation_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Find all the event tags created in the annotations. +pub async fn get_annotation_tags(configuration: &configuration::Configuration, tag: Option<&str>, limit: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations/tags", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = tag { + local_var_req_builder = local_var_req_builder.query(&[("tag", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Starting in Grafana v6.4 regions annotations are now returned in one entity that now includes the timeEnd property. +pub async fn get_annotations(configuration: &configuration::Configuration, from: Option, to: Option, user_id: Option, alert_id: Option, dashboard_id: Option, dashboard_uid: Option<&str>, panel_id: Option, limit: Option, tags: Option>, r#type: Option<&str>, match_any: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = from { + local_var_req_builder = local_var_req_builder.query(&[("from", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = to { + local_var_req_builder = local_var_req_builder.query(&[("to", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = user_id { + local_var_req_builder = local_var_req_builder.query(&[("userId", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = alert_id { + local_var_req_builder = local_var_req_builder.query(&[("alertId", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = dashboard_id { + local_var_req_builder = local_var_req_builder.query(&[("dashboardId", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = dashboard_uid { + local_var_req_builder = local_var_req_builder.query(&[("dashboardUID", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = panel_id { + local_var_req_builder = local_var_req_builder.query(&[("panelId", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = tags { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("tags".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("tags", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = r#type { + local_var_req_builder = local_var_req_builder.query(&[("type", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = match_any { + local_var_req_builder = local_var_req_builder.query(&[("matchAny", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn mass_delete_annotations(configuration: &configuration::Configuration, mass_delete_annotations_cmd: models::MassDeleteAnnotationsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations/mass-delete", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&mass_delete_annotations_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Updates one or more properties of an annotation that matches the specified ID. This operation currently supports updating of the `text`, `tags`, `time` and `timeEnd` properties. This is available in Grafana 6.0.0-beta2 and above. +pub async fn patch_annotation(configuration: &configuration::Configuration, annotation_id: &str, patch_annotations_cmd: models::PatchAnnotationsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations/{annotation_id}", local_var_configuration.base_path, annotation_id=crate::apis::urlencode(annotation_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&patch_annotations_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Creates an annotation in the Grafana database. The dashboardId and panelId fields are optional. If they are not specified then an organization annotation is created and can be queried in any dashboard that adds the Grafana annotations data source. When creating a region annotation include the timeEnd property. The format for `time` and `timeEnd` should be epoch numbers in millisecond resolution. The response for this HTTP request is slightly different in versions prior to v6.4. In prior versions you would also get an endId if you where creating a region. But in 6.4 regions are represented using a single event with time and timeEnd properties. +pub async fn post_annotation(configuration: &configuration::Configuration, post_annotations_cmd: models::PostAnnotationsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&post_annotations_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Creates an annotation by using Graphite-compatible event format. The `when` and `data` fields are optional. If `when` is not specified then the current time will be used as annotation’s timestamp. The `tags` field can also be in prior to Graphite `0.10.0` format (string with multiple tags being separated by a space). +pub async fn post_graphite_annotation(configuration: &configuration::Configuration, post_graphite_annotations_cmd: models::PostGraphiteAnnotationsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations/graphite", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&post_graphite_annotations_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Updates all properties of an annotation that matches the specified id. To only update certain property, consider using the Patch Annotation operation. +pub async fn update_annotation(configuration: &configuration::Configuration, annotation_id: &str, update_annotations_cmd: models::UpdateAnnotationsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/annotations/{annotation_id}", local_var_configuration.base_path, annotation_id=crate::apis::urlencode(annotation_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_annotations_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/api_keys_api.rs b/openapi/src/apis/api_keys_api.rs new file mode 100755 index 00000000..30932e08 --- /dev/null +++ b/openapi/src/apis/api_keys_api.rs @@ -0,0 +1,173 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_ap_ikey`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddApIkeyError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_ap_ikey`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteApIkeyError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_ap_ikeys`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetApIkeysError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Will return details of the created API key. +pub async fn add_ap_ikey(configuration: &configuration::Configuration, add_api_key_command: models::AddApiKeyCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/auth/keys", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_api_key_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Deletes an API key. Deprecated. See: https://grafana.com/docs/grafana/next/administration/api-keys/#migrate-api-keys-to-grafana-service-accounts-using-the-api. +pub async fn delete_ap_ikey(configuration: &configuration::Configuration, id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/auth/keys/{id}", local_var_configuration.base_path, id=id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Will return auth keys. Deprecated: true. Deprecated. Please use GET /api/serviceaccounts and GET /api/serviceaccounts/{id}/tokens instead see https://grafana.com/docs/grafana/next/administration/api-keys/#migrate-api-keys-to-grafana-service-accounts-using-the-api. +pub async fn get_ap_ikeys(configuration: &configuration::Configuration, include_expired: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/auth/keys", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = include_expired { + local_var_req_builder = local_var_req_builder.query(&[("includeExpired", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/configuration.rs b/openapi/src/apis/configuration.rs new file mode 100755 index 00000000..1adb0599 --- /dev/null +++ b/openapi/src/apis/configuration.rs @@ -0,0 +1,53 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + + +#[derive(Debug, Clone)] +pub struct Configuration { + pub base_path: String, + pub user_agent: Option, + pub client: reqwest::Client, + pub basic_auth: Option, + pub oauth_access_token: Option, + pub bearer_access_token: Option, + pub api_key: Option, + // TODO: take an oauth2 token source, similar to the go one +} + +pub type BasicAuth = (String, Option); + +#[derive(Debug, Clone)] +pub struct ApiKey { + pub prefix: Option, + pub key: String, +} + + +impl Configuration { + pub fn new() -> Configuration { + Configuration::default() + } +} + +impl Default for Configuration { + fn default() -> Self { + Configuration { + base_path: "/api".to_owned(), + user_agent: Some("OpenAPI-Generator/0.0.1/rust".to_owned()), + client: reqwest::Client::new(), + basic_auth: None, + oauth_access_token: None, + bearer_access_token: None, + api_key: None, + + } + } +} diff --git a/openapi/src/apis/correlations_api.rs b/openapi/src/apis/correlations_api.rs new file mode 100755 index 00000000..c51b96cc --- /dev/null +++ b/openapi/src/apis/correlations_api.rs @@ -0,0 +1,325 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_correlation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateCorrelationError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_correlation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteCorrelationError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_correlation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCorrelationError { + Status401(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_correlations`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCorrelationsError { + Status401(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_correlations_by_source_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCorrelationsBySourceUidError { + Status401(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_correlation`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateCorrelationError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn create_correlation(configuration: &configuration::Configuration, source_uid: &str, create_correlation_command: models::CreateCorrelationCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{sourceUID}/correlations", local_var_configuration.base_path, sourceUID=crate::apis::urlencode(source_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_correlation_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_correlation(configuration: &configuration::Configuration, uid: &str, correlation_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{uid}/correlations/{correlationUID}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid), correlationUID=crate::apis::urlencode(correlation_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_correlation(configuration: &configuration::Configuration, source_uid: &str, correlation_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{sourceUID}/correlations/{correlationUID}", local_var_configuration.base_path, sourceUID=crate::apis::urlencode(source_uid), correlationUID=crate::apis::urlencode(correlation_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_correlations(configuration: &configuration::Configuration, limit: Option, page: Option, source_uid: Option>) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/correlations", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = source_uid { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("sourceUID".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("sourceUID", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_correlations_by_source_uid(configuration: &configuration::Configuration, source_uid: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{sourceUID}/correlations", local_var_configuration.base_path, sourceUID=crate::apis::urlencode(source_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_correlation(configuration: &configuration::Configuration, source_uid: &str, correlation_uid: &str, update_correlation_command: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{sourceUID}/correlations/{correlationUID}", local_var_configuration.base_path, sourceUID=crate::apis::urlencode(source_uid), correlationUID=crate::apis::urlencode(correlation_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_correlation_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/dashboard_permissions_api.rs b/openapi/src/apis/dashboard_permissions_api.rs new file mode 100755 index 00000000..67cc8baa --- /dev/null +++ b/openapi/src/apis/dashboard_permissions_api.rs @@ -0,0 +1,221 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_dashboard_permissions_list_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardPermissionsListByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_dashboard_permissions_list_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardPermissionsListByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_dashboard_permissions_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateDashboardPermissionsByIdError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_dashboard_permissions_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateDashboardPermissionsByUidError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Please refer to [updated API](#/dashboard_permissions/getDashboardPermissionsListByUID) instead +pub async fn get_dashboard_permissions_list_by_id(configuration: &configuration::Configuration, dashboard_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/id/{DashboardID}/permissions", local_var_configuration.base_path, DashboardID=dashboard_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_dashboard_permissions_list_by_uid(configuration: &configuration::Configuration, uid: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{uid}/permissions", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Please refer to [updated API](#/dashboard_permissions/updateDashboardPermissionsByUID) instead This operation will remove existing permissions if they’re not included in the request. +pub async fn update_dashboard_permissions_by_id(configuration: &configuration::Configuration, dashboard_id: i64, update_dashboard_acl_command: models::UpdateDashboardAclCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/id/{DashboardID}/permissions", local_var_configuration.base_path, DashboardID=dashboard_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_dashboard_acl_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// This operation will remove existing permissions if they’re not included in the request. +pub async fn update_dashboard_permissions_by_uid(configuration: &configuration::Configuration, uid: &str, update_dashboard_acl_command: models::UpdateDashboardAclCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{uid}/permissions", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_dashboard_acl_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/dashboard_public_api.rs b/openapi/src/apis/dashboard_public_api.rs new file mode 100755 index 00000000..700dfd0e --- /dev/null +++ b/openapi/src/apis/dashboard_public_api.rs @@ -0,0 +1,423 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_public_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreatePublicDashboardError { + Status400(models::PublicError), + Status401(models::PublicError), + Status403(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_public_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeletePublicDashboardError { + Status400(models::PublicError), + Status401(models::PublicError), + Status403(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_public_annotations`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPublicAnnotationsError { + Status400(models::PublicError), + Status401(models::PublicError), + Status403(models::PublicError), + Status404(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_public_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPublicDashboardError { + Status400(models::PublicError), + Status401(models::PublicError), + Status403(models::PublicError), + Status404(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_public_dashboards`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListPublicDashboardsError { + Status401(models::PublicError), + Status403(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`query_public_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum QueryPublicDashboardError { + Status400(models::PublicError), + Status401(models::PublicError), + Status403(models::PublicError), + Status404(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_public_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePublicDashboardError { + Status400(models::PublicError), + Status401(models::PublicError), + Status403(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`view_public_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ViewPublicDashboardError { + Status400(models::PublicError), + Status401(models::PublicError), + Status403(models::PublicError), + Status404(models::PublicError), + Status500(models::PublicError), + UnknownValue(serde_json::Value), +} + + +/// Create public dashboard for a dashboard +pub async fn create_public_dashboard(configuration: &configuration::Configuration, dashboard_uid: &str, public_dashboard_dto: models::PublicDashboardDto) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{dashboardUid}/public-dashboards", local_var_configuration.base_path, dashboardUid=crate::apis::urlencode(dashboard_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&public_dashboard_dto); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Delete public dashboard for a dashboard +pub async fn delete_public_dashboard(configuration: &configuration::Configuration, dashboard_uid: &str, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{dashboardUid}/public-dashboards/{uid}", local_var_configuration.base_path, dashboardUid=crate::apis::urlencode(dashboard_uid), uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get annotations for a public dashboard +pub async fn get_public_annotations(configuration: &configuration::Configuration, access_token: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/public/dashboards/{accessToken}/annotations", local_var_configuration.base_path, accessToken=crate::apis::urlencode(access_token)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get public dashboard by dashboardUid +pub async fn get_public_dashboard(configuration: &configuration::Configuration, dashboard_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{dashboardUid}/public-dashboards", local_var_configuration.base_path, dashboardUid=crate::apis::urlencode(dashboard_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get list of public dashboards +pub async fn list_public_dashboards(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/public-dashboards", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get results for a given panel on a public dashboard +pub async fn query_public_dashboard(configuration: &configuration::Configuration, access_token: &str, panel_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/public/dashboards/{accessToken}/panels/{panelId}/query", local_var_configuration.base_path, accessToken=crate::apis::urlencode(access_token), panelId=panel_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Update public dashboard for a dashboard +pub async fn update_public_dashboard(configuration: &configuration::Configuration, dashboard_uid: &str, uid: &str, public_dashboard_dto: models::PublicDashboardDto) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{dashboardUid}/public-dashboards/{uid}", local_var_configuration.base_path, dashboardUid=crate::apis::urlencode(dashboard_uid), uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&public_dashboard_dto); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get public dashboard for view +pub async fn view_public_dashboard(configuration: &configuration::Configuration, access_token: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/public/dashboards/{accessToken}", local_var_configuration.base_path, accessToken=crate::apis::urlencode(access_token)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/dashboard_versions_api.rs b/openapi/src/apis/dashboard_versions_api.rs new file mode 100755 index 00000000..f2d8afd7 --- /dev/null +++ b/openapi/src/apis/dashboard_versions_api.rs @@ -0,0 +1,323 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_dashboard_version_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardVersionByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_dashboard_version_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardVersionByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_dashboard_versions_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardVersionsByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_dashboard_versions_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardVersionsByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`restore_dashboard_version_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RestoreDashboardVersionByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`restore_dashboard_version_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RestoreDashboardVersionByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Please refer to [updated API](#/dashboard_versions/getDashboardVersionByUID) instead +pub async fn get_dashboard_version_by_id(configuration: &configuration::Configuration, dashboard_id: i64, dashboard_version_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/id/{DashboardID}/versions/{DashboardVersionID}", local_var_configuration.base_path, DashboardID=dashboard_id, DashboardVersionID=dashboard_version_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_dashboard_version_by_uid(configuration: &configuration::Configuration, dashboard_version_id: i64, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{uid}/versions/{DashboardVersionID}", local_var_configuration.base_path, DashboardVersionID=dashboard_version_id, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Please refer to [updated API](#/dashboard_versions/getDashboardVersionsByUID) instead +pub async fn get_dashboard_versions_by_id(configuration: &configuration::Configuration, dashboard_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/id/{DashboardID}/versions", local_var_configuration.base_path, DashboardID=dashboard_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_dashboard_versions_by_uid(configuration: &configuration::Configuration, uid: &str, limit: Option, start: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{uid}/versions", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = start { + local_var_req_builder = local_var_req_builder.query(&[("start", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Please refer to [updated API](#/dashboard_versions/restoreDashboardVersionByUID) instead +pub async fn restore_dashboard_version_by_id(configuration: &configuration::Configuration, dashboard_id: i64, restore_dashboard_version_command: models::RestoreDashboardVersionCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/id/{DashboardID}/restore", local_var_configuration.base_path, DashboardID=dashboard_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&restore_dashboard_version_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn restore_dashboard_version_by_uid(configuration: &configuration::Configuration, uid: &str, restore_dashboard_version_command: models::RestoreDashboardVersionCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{uid}/restore", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&restore_dashboard_version_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/dashboards_api.rs b/openapi/src/apis/dashboards_api.rs new file mode 100755 index 00000000..52f3fc78 --- /dev/null +++ b/openapi/src/apis/dashboards_api.rs @@ -0,0 +1,366 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`calculate_dashboard_diff`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CalculateDashboardDiffError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_dashboard_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteDashboardByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_dashboard_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_dashboard_tags`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardTagsError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_home_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetHomeDashboardError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`import_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ImportDashboardError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status412(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostDashboardError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status412(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn calculate_dashboard_diff(configuration: &configuration::Configuration, calculate_dashboard_diff_request: models::CalculateDashboardDiffRequest) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/calculate-diff", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&calculate_dashboard_diff_request); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Will delete the dashboard given the specified unique identifier (uid). +pub async fn delete_dashboard_by_uid(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Will return the dashboard given the dashboard unique identifier (uid). +pub async fn get_dashboard_by_uid(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/uid/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_dashboard_tags(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/tags", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_home_dashboard(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/home", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn import_dashboard(configuration: &configuration::Configuration, import_dashboard_request: models::ImportDashboardRequest) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/import", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&import_dashboard_request); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Creates a new dashboard or updates an existing dashboard. Note: This endpoint is not intended for creating folders, use `POST /api/folders` for that. +pub async fn post_dashboard(configuration: &configuration::Configuration, save_dashboard_command: models::SaveDashboardCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboards/db", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&save_dashboard_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/datasources_api.rs b/openapi/src/apis/datasources_api.rs new file mode 100755 index 00000000..3a9014ad --- /dev/null +++ b/openapi/src/apis/datasources_api.rs @@ -0,0 +1,1077 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_data_source`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddDataSourceError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`call_datasource_resource_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CallDatasourceResourceByIdError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`call_datasource_resource_with_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CallDatasourceResourceWithUidError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`check_datasource_health_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CheckDatasourceHealthByIdError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`check_datasource_health_with_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CheckDatasourceHealthWithUidError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`datasource_proxy_delet_ecalls`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DatasourceProxyDeletEcallsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`datasource_proxy_deleteby_ui_dcalls`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DatasourceProxyDeletebyUiDcallsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`datasource_proxy_ge_tcalls`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DatasourceProxyGeTcallsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`datasource_proxy_getby_ui_dcalls`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DatasourceProxyGetbyUiDcallsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`datasource_proxy_pos_tcalls`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DatasourceProxyPosTcallsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`datasource_proxy_postby_ui_dcalls`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DatasourceProxyPostbyUiDcallsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_data_source_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteDataSourceByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_data_source_by_name`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteDataSourceByNameError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_data_source_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteDataSourceByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_data_source_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDataSourceByIdError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_data_source_by_name`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDataSourceByNameError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_data_source_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDataSourceByUidError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_data_source_id_by_name`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDataSourceIdByNameError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_data_sources`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDataSourcesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_data_source_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateDataSourceByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_data_source_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateDataSourceByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// By defining `password` and `basicAuthPassword` under secureJsonData property Grafana encrypts them securely as an encrypted blob in the database. The response then lists the encrypted fields under secureJsonFields. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:create` +pub async fn add_data_source(configuration: &configuration::Configuration, add_data_source_command: models::AddDataSourceCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_data_source_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Please refer to [updated API](#/datasources/callDatasourceResourceWithUID) instead +pub async fn call_datasource_resource_by_id(configuration: &configuration::Configuration, datasource_proxy_route: &str, id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/{id}/resources/{datasource_proxy_route}", local_var_configuration.base_path, datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route), id=crate::apis::urlencode(id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn call_datasource_resource_with_uid(configuration: &configuration::Configuration, datasource_proxy_route: &str, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{uid}/resources/{datasource_proxy_route}", local_var_configuration.base_path, datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route), uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Please refer to [updated API](#/datasources/checkDatasourceHealthWithUID) instead +pub async fn check_datasource_health_by_id(configuration: &configuration::Configuration, id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/{id}/health", local_var_configuration.base_path, id=crate::apis::urlencode(id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn check_datasource_health_with_uid(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{uid}/health", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Proxies all calls to the actual data source. Please refer to [updated API](#/datasources/datasourceProxyDELETEByUIDcalls) instead +pub async fn datasource_proxy_delet_ecalls(configuration: &configuration::Configuration, id: &str, datasource_proxy_route: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/proxy/{id}/{datasource_proxy_route}", local_var_configuration.base_path, id=crate::apis::urlencode(id), datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Proxies all calls to the actual data source. +pub async fn datasource_proxy_deleteby_ui_dcalls(configuration: &configuration::Configuration, uid: &str, datasource_proxy_route: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/proxy/uid/{uid}/{datasource_proxy_route}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid), datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Proxies all calls to the actual data source. Please refer to [updated API](#/datasources/datasourceProxyGETByUIDcalls) instead +pub async fn datasource_proxy_ge_tcalls(configuration: &configuration::Configuration, datasource_proxy_route: &str, id: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/proxy/{id}/{datasource_proxy_route}", local_var_configuration.base_path, datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route), id=crate::apis::urlencode(id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Proxies all calls to the actual data source. +pub async fn datasource_proxy_getby_ui_dcalls(configuration: &configuration::Configuration, datasource_proxy_route: &str, uid: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/proxy/uid/{uid}/{datasource_proxy_route}", local_var_configuration.base_path, datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route), uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Proxies all calls to the actual data source. The data source should support POST methods for the specific path and role as defined Please refer to [updated API](#/datasources/datasourceProxyPOSTByUIDcalls) instead +pub async fn datasource_proxy_pos_tcalls(configuration: &configuration::Configuration, datasource_proxy_route: &str, id: &str, body: Option) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/proxy/{id}/{datasource_proxy_route}", local_var_configuration.base_path, datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route), id=crate::apis::urlencode(id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&body); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Proxies all calls to the actual data source. The data source should support POST methods for the specific path and role as defined +pub async fn datasource_proxy_postby_ui_dcalls(configuration: &configuration::Configuration, datasource_proxy_route: &str, uid: &str, body: Option) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/proxy/uid/{uid}/{datasource_proxy_route}", local_var_configuration.base_path, datasource_proxy_route=crate::apis::urlencode(datasource_proxy_route), uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&body); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:delete` and scopes: `datasources:*`, `datasources:id:*` and `datasources:id:1` (single data source). Please refer to [updated API](#/datasources/deleteDataSourceByUID) instead +pub async fn delete_data_source_by_id(configuration: &configuration::Configuration, id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/{id}", local_var_configuration.base_path, id=crate::apis::urlencode(id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:delete` and scopes: `datasources:*`, `datasources:name:*` and `datasources:name:test_datasource` (single data source). +pub async fn delete_data_source_by_name(configuration: &configuration::Configuration, name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/name/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:delete` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:kLtEtcRGk` (single data source). +pub async fn delete_data_source_by_uid(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:id:*` and `datasources:id:1` (single data source). Please refer to [updated API](#/datasources/getDataSourceByUID) instead +pub async fn get_data_source_by_id(configuration: &configuration::Configuration, id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/{id}", local_var_configuration.base_path, id=crate::apis::urlencode(id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:name:*` and `datasources:name:test_datasource` (single data source). +pub async fn get_data_source_by_name(configuration: &configuration::Configuration, name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/name/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:kLtEtcRGk` (single data source). +pub async fn get_data_source_by_uid(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scopes: `datasources:*`, `datasources:name:*` and `datasources:name:test_datasource` (single data source). +pub async fn get_data_source_id_by_name(configuration: &configuration::Configuration, name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/id/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:read` and scope: `datasources:*`. +pub async fn get_data_sources(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Similar to creating a data source, `password` and `basicAuthPassword` should be defined under secureJsonData in order to be stored securely as an encrypted blob in the database. Then, the encrypted fields are listed under secureJsonFields section in the response. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:write` and scopes: `datasources:*`, `datasources:id:*` and `datasources:id:1` (single data source). Please refer to [updated API](#/datasources/updateDataSourceByUID) instead +pub async fn update_data_source_by_id(configuration: &configuration::Configuration, id: &str, update_data_source_command: models::UpdateDataSourceCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/{id}", local_var_configuration.base_path, id=crate::apis::urlencode(id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_data_source_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Similar to creating a data source, `password` and `basicAuthPassword` should be defined under secureJsonData in order to be stored securely as an encrypted blob in the database. Then, the encrypted fields are listed under secureJsonFields section in the response. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:write` and scopes: `datasources:*`, `datasources:uid:*` and `datasources:uid:1` (single data source). +pub async fn update_data_source_by_uid(configuration: &configuration::Configuration, uid: &str, update_data_source_command: models::UpdateDataSourceCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/datasources/uid/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_data_source_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/devices_api.rs b/openapi/src/apis/devices_api.rs new file mode 100755 index 00000000..3e2113a0 --- /dev/null +++ b/openapi/src/apis/devices_api.rs @@ -0,0 +1,116 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`list_devices`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListDevicesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_devices`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchDevicesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn list_devices(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/stats", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn search_devices(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/ds_api.rs b/openapi/src/apis/ds_api.rs new file mode 100755 index 00000000..6bda7d42 --- /dev/null +++ b/openapi/src/apis/ds_api.rs @@ -0,0 +1,69 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`query_metrics_with_expressions`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum QueryMetricsWithExpressionsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `datasources:query`. +pub async fn query_metrics_with_expressions(configuration: &configuration::Configuration, metric_request: models::MetricRequest) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/ds/query", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&metric_request); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/enterprise_api.rs b/openapi/src/apis/enterprise_api.rs new file mode 100755 index 00000000..61e40b2e --- /dev/null +++ b/openapi/src/apis/enterprise_api.rs @@ -0,0 +1,2775 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_team_group_api`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddTeamGroupApiError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`add_team_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddTeamRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`add_user_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddUserRoleError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`admin_provisioning_reload_access_control`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminProvisioningReloadAccessControlError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_recording_rule_write_target`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateRecordingRuleWriteTargetError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteLicenseTokenError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_recording_rule_write_target`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteRecordingRuleWriteTargetError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_access_control_status`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetAccessControlStatusError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_custom_permissions_csv`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCustomPermissionsCsvError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_custom_permissions_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCustomPermissionsReportError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetLicenseTokenError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_metadata`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetMetadataError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_recording_rule_write_target`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetRecordingRuleWriteTargetError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_report_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetReportSettingsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_reports`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetReportsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetRoleError { + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_role_assignments`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetRoleAssignmentsError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_saml_logout`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSamlLogoutError { + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_slo`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSloError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_status`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetStatusError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_sync_status`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSyncStatusError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_team_groups_api`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetTeamGroupsApiError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_recording_rules`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListRecordingRulesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListRolesError { + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_team_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListTeamRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_teams_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListTeamsRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_user_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListUserRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_users_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListUsersRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_acs`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostAcsError { + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostLicenseTokenError { + Status400(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_renew_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostRenewLicenseTokenError { + Status401(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_slo`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostSloError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`refresh_license_stats`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RefreshLicenseStatsError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_team_group_api_query`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveTeamGroupApiQueryError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_team_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveTeamRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_user_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveUserRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`render_report_pdfs`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RenderReportPdfsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`save_report_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SaveReportSettingsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_result`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchResultError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`send_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SendReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`send_test_email`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SendTestEmailError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_role_assignments`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetRoleAssignmentsError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_team_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetTeamRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_user_roles`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetUserRolesError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`test_create_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum TestCreateRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_role`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateRoleError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn add_team_group_api(configuration: &configuration::Configuration, team_id: i64, team_group_mapping: models::TeamGroupMapping) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{teamId}/groups", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&team_group_mapping); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `teams.roles:add` and scope `permissions:type:delegate`. +pub async fn add_team_role(configuration: &configuration::Configuration, team_id: i64, add_team_role_command: models::AddTeamRoleCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_team_role_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Assign a role to a specific user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:add` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only assign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign a role which will allow to do that. This is done to prevent escalation of privileges. +pub async fn add_user_role(configuration: &configuration::Configuration, user_id: i64, add_user_role_command: models::AddUserRoleCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles", local_var_configuration.base_path, userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_user_role_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn admin_provisioning_reload_access_control(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/provisioning/access-control/reload", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn create_recording_rule(configuration: &configuration::Configuration, recording_rule_json: models::RecordingRuleJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&recording_rule_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// It returns a 422 if there is not an existing prometheus data source configured. +pub async fn create_recording_rule_write_target(configuration: &configuration::Configuration, prometheus_remote_write_target_json: models::PrometheusRemoteWriteTargetJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/writer", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&prometheus_remote_write_target_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid license. You need to have a permission with action `reports.admin:create`. +pub async fn create_report(configuration: &configuration::Configuration, create_or_update_report_config: models::CreateOrUpdateReportConfig) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_or_update_report_config); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Creates a new custom role and maps given permissions to that role. Note that roles with the same prefix as Fixed Roles can’t be created. You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to create a custom role which allows to do that. This is done to prevent escalation of privileges. +pub async fn create_role(configuration: &configuration::Configuration, create_role_form: models::CreateRoleForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_role_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Removes the license stored in the Grafana database. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:delete`. +pub async fn delete_license_token(configuration: &configuration::Configuration, delete_token_command: models::DeleteTokenCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&delete_token_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_recording_rule(configuration: &configuration::Configuration, recording_rule_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/{recordingRuleID}", local_var_configuration.base_path, recordingRuleID=recording_rule_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_recording_rule_write_target(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/writer", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.delete` with scope `reports:id:`. +pub async fn delete_report(configuration: &configuration::Configuration, id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/{id}", local_var_configuration.base_path, id=id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Delete a role with the given UID, and it’s permissions. If the role is assigned to a built-in role, the deletion operation will fail, unless force query param is set to true, and in that case all assignments will also be deleted. You need to have a permission with action `roles:delete` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only delete a custom role with the same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to delete a custom role which allows to do that. +pub async fn delete_role(configuration: &configuration::Configuration, role_uid: &str, force: Option, global: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = force { + local_var_req_builder = local_var_req_builder.query(&[("force", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = global { + local_var_req_builder = local_var_req_builder.query(&[("global", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns an indicator to check if fine-grained access control is enabled or not. You need to have a permission with action `status:accesscontrol` and scope `services:accesscontrol`. +pub async fn get_access_control_status(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/status", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing.reports:read`. +pub async fn get_custom_permissions_csv(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/custom-permissions-csv", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing.reports:read`. +pub async fn get_custom_permissions_report(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/custom-permissions", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing:read`. +pub async fn get_license_token(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_metadata(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/metadata", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_recording_rule_write_target(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/writer", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:id:`. +pub async fn get_report(configuration: &configuration::Configuration, id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/{id}", local_var_configuration.base_path, id=id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:read`x. +pub async fn get_report_settings(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/settings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:*`. +pub async fn get_reports(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get a role for the given UID. You need to have a permission with action `roles:read` and scope `roles:*`. +pub async fn get_role(configuration: &configuration::Configuration, role_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get role assignments for the role with the given UID. You need to have a permission with action `teams.roles:list` and scope `teams:id:*` and `users.roles:list` and scope `users:id:*`. +pub async fn get_role_assignments(configuration: &configuration::Configuration, role_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}/assignments", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_saml_logout(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/logout/saml", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. +pub async fn get_slo(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/slo", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_status(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/check", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `ldap.status:read`. +pub async fn get_sync_status(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/ldap-sync-status", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_team_groups_api(configuration: &configuration::Configuration, team_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{teamId}/groups", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn list_recording_rules(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Gets all existing roles. The response contains all global and organization local roles, for the organization which user is signed in. You need to have a permission with action `roles:read` and scope `roles:*`. +pub async fn list_roles(configuration: &configuration::Configuration, delegatable: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = delegatable { + local_var_req_builder = local_var_req_builder.query(&[("delegatable", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `teams.roles:read` and scope `teams:id:`. +pub async fn list_team_roles(configuration: &configuration::Configuration, team_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Lists the roles that have been directly assigned to the given teams. You need to have a permission with action `teams.roles:read` and scope `teams:id:*`. +pub async fn list_teams_roles(configuration: &configuration::Configuration, roles_search_query: models::RolesSearchQuery) -> Result>, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/roles/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&roles_search_query); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Lists the roles that have been directly assigned to a given user. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:`. +pub async fn list_user_roles(configuration: &configuration::Configuration, user_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles", local_var_configuration.base_path, userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Lists the roles that have been directly assigned to the given users. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. You need to have a permission with action `users.roles:read` and scope `users:id:*`. +pub async fn list_users_roles(configuration: &configuration::Configuration, roles_search_query: models::RolesSearchQuery) -> Result>, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/roles/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&roles_search_query); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn post_acs(configuration: &configuration::Configuration, relay_state: Option<&str>) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/acs", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = relay_state { + local_var_req_builder = local_var_req_builder.query(&[("RelayState", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing:update`. +pub async fn post_license_token(configuration: &configuration::Configuration, delete_token_command: models::DeleteTokenCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&delete_token_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Manually ask license issuer for a new token. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:update`. +pub async fn post_renew_license_token(configuration: &configuration::Configuration, body: serde_json::Value) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token/renew", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&body); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. +pub async fn post_slo(configuration: &configuration::Configuration, saml_request: Option<&str>, saml_response: Option<&str>) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/slo", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = saml_request { + local_var_req_builder = local_var_req_builder.query(&[("SAMLRequest", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = saml_response { + local_var_req_builder = local_var_req_builder.query(&[("SAMLResponse", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing:read`. +pub async fn refresh_license_stats(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/refresh-stats", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn remove_team_group_api_query(configuration: &configuration::Configuration, team_id: i64, group_id: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{teamId}/groups", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = group_id { + local_var_req_builder = local_var_req_builder.query(&[("groupId", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `teams.roles:remove` and scope `permissions:type:delegate`. +pub async fn remove_team_role(configuration: &configuration::Configuration, role_uid: &str, team_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid), teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Revoke a role from a user. For bulk updates consider Set user role assignments. You need to have a permission with action `users.roles:remove` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to unassign a role which will allow to do that. This is done to prevent escalation of privileges. +pub async fn remove_user_role(configuration: &configuration::Configuration, role_uid: &str, user_id: i64, global: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid), userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = global { + local_var_req_builder = local_var_req_builder.query(&[("global", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to all users and with a valid license. +pub async fn render_report_pdfs(configuration: &configuration::Configuration, dashboard_id: Option<&str>, orientation: Option<&str>, layout: Option<&str>, title: Option<&str>, scale_factor: Option<&str>, include_tables: Option<&str>) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/render/pdfs", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = dashboard_id { + local_var_req_builder = local_var_req_builder.query(&[("dashboardID", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = orientation { + local_var_req_builder = local_var_req_builder.query(&[("orientation", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = layout { + local_var_req_builder = local_var_req_builder.query(&[("layout", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = title { + local_var_req_builder = local_var_req_builder.query(&[("title", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = scale_factor { + local_var_req_builder = local_var_req_builder.query(&[("scaleFactor", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = include_tables { + local_var_req_builder = local_var_req_builder.query(&[("includeTables", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:write`xx. +pub async fn save_report_settings(configuration: &configuration::Configuration, report_settings: models::ReportSettings) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/settings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&report_settings); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns the result of the search through access-control role assignments. You need to have a permission with action `teams.roles:read` on scope `teams:*` and a permission with action `users.roles:read` on scope `users:*`. +pub async fn search_result(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/assignments/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Generate and send a report. This API waits for the report to be generated before returning. We recommend that you set the client’s timeout to at least 60 seconds. Available to org admins only and with a valid license. Only available in Grafana Enterprise v7.0+. This API endpoint is experimental and may be deprecated in a future release. On deprecation, a migration strategy will be provided and the endpoint will remain functional until the next major release of Grafana. You need to have a permission with action `reports:send`. +pub async fn send_report(configuration: &configuration::Configuration, report_email: models::ReportEmail) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/email", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&report_email); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid license. You need to have a permission with action `reports:send`. +pub async fn send_test_email(configuration: &configuration::Configuration, create_or_update_report_config: models::CreateOrUpdateReportConfig) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/test-email", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_or_update_report_config); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Set role assignments for the role with the given UID. You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate`, and `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate`. +pub async fn set_role_assignments(configuration: &configuration::Configuration, role_uid: &str, set_role_assignments_command: models::SetRoleAssignmentsCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}/assignments", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_role_assignments_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `teams.roles:add` and `teams.roles:remove` and scope `permissions:type:delegate` for each. +pub async fn set_team_roles(configuration: &configuration::Configuration, team_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/teams/{teamId}/roles", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Update the user’s role assignments to match the provided set of UIDs. This will remove any assigned roles that aren’t in the request and add roles that are in the set but are not already assigned to the user. If you want to add or remove a single role, consider using Add a user role assignment or Remove a user role assignment instead. You need to have a permission with action `users.roles:add` and `users.roles:remove` and scope `permissions:type:delegate` for each. `permissions:type:delegate` scope ensures that users can only assign or unassign roles which have same, or a subset of permissions which the user has. For example, if a user does not have required permissions for creating users, they won’t be able to assign or unassign a role which will allow to do that. This is done to prevent escalation of privileges. +pub async fn set_user_roles(configuration: &configuration::Configuration, user_id: i64, set_user_roles_command: models::SetUserRolesCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/users/{userId}/roles", local_var_configuration.base_path, userId=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&set_user_roles_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn test_create_recording_rule(configuration: &configuration::Configuration, recording_rule_json: models::RecordingRuleJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/test", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&recording_rule_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_recording_rule(configuration: &configuration::Configuration, recording_rule_json: models::RecordingRuleJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&recording_rule_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.admin:write` with scope `reports:id:`. +pub async fn update_report(configuration: &configuration::Configuration, id: i64, create_or_update_report_config: models::CreateOrUpdateReportConfig) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/{id}", local_var_configuration.base_path, id=id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_or_update_report_config); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `roles:write` and scope `permissions:type:delegate`. `permissions:type:delegate` scope ensures that users can only create custom roles with the same, or a subset of permissions which the user has. +pub async fn update_role(configuration: &configuration::Configuration, role_uid: &str, update_role_command: models::UpdateRoleCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/access-control/roles/{roleUID}", local_var_configuration.base_path, roleUID=crate::apis::urlencode(role_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_role_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/folder_permissions_api.rs b/openapi/src/apis/folder_permissions_api.rs new file mode 100755 index 00000000..61e5040b --- /dev/null +++ b/openapi/src/apis/folder_permissions_api.rs @@ -0,0 +1,117 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_folder_permission_list`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetFolderPermissionListError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_folder_permissions`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateFolderPermissionsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn get_folder_permission_list(configuration: &configuration::Configuration, folder_uid: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/{folder_uid}/permissions", local_var_configuration.base_path, folder_uid=crate::apis::urlencode(folder_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_folder_permissions(configuration: &configuration::Configuration, folder_uid: &str, update_dashboard_acl_command: models::UpdateDashboardAclCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/{folder_uid}/permissions", local_var_configuration.base_path, folder_uid=crate::apis::urlencode(folder_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_dashboard_acl_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/folders_api.rs b/openapi/src/apis/folders_api.rs new file mode 100755 index 00000000..b9a70bc4 --- /dev/null +++ b/openapi/src/apis/folders_api.rs @@ -0,0 +1,435 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_folder`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateFolderError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_folder`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteFolderError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_folder_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetFolderByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_folder_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetFolderByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_folder_descendant_counts`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetFolderDescendantCountsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_folders`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetFoldersError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`move_folder`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum MoveFolderError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_folder`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateFolderError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// If nested folders are enabled then it additionally expects the parent folder UID. +pub async fn create_folder(configuration: &configuration::Configuration, create_folder_command: models::CreateFolderCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_folder_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Deletes an existing folder identified by UID along with all dashboards (and their alerts) stored in the folder. This operation cannot be reverted. If nested folders are enabled then it also deletes all the subfolders. +pub async fn delete_folder(configuration: &configuration::Configuration, folder_uid: &str, force_delete_rules: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/{folder_uid}", local_var_configuration.base_path, folder_uid=crate::apis::urlencode(folder_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = force_delete_rules { + local_var_req_builder = local_var_req_builder.query(&[("forceDeleteRules", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns the folder identified by id. This is deprecated. Please refer to [updated API](#/folders/getFolderByUID) instead +pub async fn get_folder_by_id(configuration: &configuration::Configuration, folder_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/id/{folder_id}", local_var_configuration.base_path, folder_id=folder_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_folder_by_uid(configuration: &configuration::Configuration, folder_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/{folder_uid}", local_var_configuration.base_path, folder_uid=crate::apis::urlencode(folder_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_folder_descendant_counts(configuration: &configuration::Configuration, folder_uid: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/{folder_uid}/counts", local_var_configuration.base_path, folder_uid=crate::apis::urlencode(folder_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// It returns all folders that the authenticated user has permission to view. If nested folders are enabled, it expects an additional query parameter with the parent folder UID and returns the immediate subfolders that the authenticated user has permission to view. If the parameter is not supplied then it returns immediate subfolders under the root that the authenticated user has permission to view. +pub async fn get_folders(configuration: &configuration::Configuration, limit: Option, page: Option, parent_uid: Option<&str>, permission: Option<&str>) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = parent_uid { + local_var_req_builder = local_var_req_builder.query(&[("parentUid", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = permission { + local_var_req_builder = local_var_req_builder.query(&[("permission", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn move_folder(configuration: &configuration::Configuration, folder_uid: &str, move_folder_command: models::MoveFolderCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/{folder_uid}/move", local_var_configuration.base_path, folder_uid=crate::apis::urlencode(folder_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&move_folder_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_folder(configuration: &configuration::Configuration, folder_uid: &str, update_folder_command: models::UpdateFolderCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/folders/{folder_uid}", local_var_configuration.base_path, folder_uid=crate::apis::urlencode(folder_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_folder_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/get_current_org_api.rs b/openapi/src/apis/get_current_org_api.rs new file mode 100755 index 00000000..e84bc8f6 --- /dev/null +++ b/openapi/src/apis/get_current_org_api.rs @@ -0,0 +1,68 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_current_org_quota`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCurrentOrgQuotaError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `orgs.quotas:read` and scope `org:id:1` (orgIDScope). +pub async fn get_current_org_quota(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/quotas", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/ldap_debug_api.rs b/openapi/src/apis/ldap_debug_api.rs new file mode 100755 index 00000000..17a22c06 --- /dev/null +++ b/openapi/src/apis/ldap_debug_api.rs @@ -0,0 +1,67 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_sync_status`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSyncStatusError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// You need to have a permission with action `ldap.status:read`. +pub async fn get_sync_status(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/ldap-sync-status", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/library_elements_api.rs b/openapi/src/apis/library_elements_api.rs new file mode 100755 index 00000000..50ca191d --- /dev/null +++ b/openapi/src/apis/library_elements_api.rs @@ -0,0 +1,395 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_library_element`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateLibraryElementError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_library_element_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteLibraryElementByUidError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_library_element_by_name`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetLibraryElementByNameError { + Status401(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_library_element_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetLibraryElementByUidError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_library_element_connections`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetLibraryElementConnectionsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_library_elements`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetLibraryElementsError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_library_element`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateLibraryElementError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status412(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Creates a new library element. +pub async fn create_library_element(configuration: &configuration::Configuration, create_library_element_command: models::CreateLibraryElementCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/library-elements", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_library_element_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Deletes an existing library element as specified by the UID. This operation cannot be reverted. You cannot delete a library element that is connected. This operation cannot be reverted. +pub async fn delete_library_element_by_uid(configuration: &configuration::Configuration, library_element_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/library-elements/{library_element_uid}", local_var_configuration.base_path, library_element_uid=crate::apis::urlencode(library_element_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns a library element with the given name. +pub async fn get_library_element_by_name(configuration: &configuration::Configuration, library_element_name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/library-elements/name/{library_element_name}", local_var_configuration.base_path, library_element_name=crate::apis::urlencode(library_element_name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns a library element with the given UID. +pub async fn get_library_element_by_uid(configuration: &configuration::Configuration, library_element_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/library-elements/{library_element_uid}", local_var_configuration.base_path, library_element_uid=crate::apis::urlencode(library_element_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns a list of connections for a library element based on the UID specified. +pub async fn get_library_element_connections(configuration: &configuration::Configuration, library_element_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/library-elements/{library_element_uid}/connections/", local_var_configuration.base_path, library_element_uid=crate::apis::urlencode(library_element_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns a list of all library elements the authenticated user has permission to view. Use the `perPage` query parameter to control the maximum number of library elements returned; the default limit is `100`. You can also use the `page` query parameter to fetch library elements from any page other than the first one. +pub async fn get_library_elements(configuration: &configuration::Configuration, search_string: Option<&str>, kind: Option, sort_direction: Option<&str>, type_filter: Option<&str>, exclude_uid: Option<&str>, folder_filter: Option<&str>, per_page: Option, page: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/library-elements", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = search_string { + local_var_req_builder = local_var_req_builder.query(&[("searchString", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = kind { + local_var_req_builder = local_var_req_builder.query(&[("kind", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = sort_direction { + local_var_req_builder = local_var_req_builder.query(&[("sortDirection", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = type_filter { + local_var_req_builder = local_var_req_builder.query(&[("typeFilter", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = exclude_uid { + local_var_req_builder = local_var_req_builder.query(&[("excludeUid", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = folder_filter { + local_var_req_builder = local_var_req_builder.query(&[("folderFilter", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = per_page { + local_var_req_builder = local_var_req_builder.query(&[("perPage", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Updates an existing library element identified by uid. +pub async fn update_library_element(configuration: &configuration::Configuration, library_element_uid: &str, patch_library_element_command: models::PatchLibraryElementCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/library-elements/{library_element_uid}", local_var_configuration.base_path, library_element_uid=crate::apis::urlencode(library_element_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&patch_library_element_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/licensing_api.rs b/openapi/src/apis/licensing_api.rs new file mode 100755 index 00000000..a2a2db4a --- /dev/null +++ b/openapi/src/apis/licensing_api.rs @@ -0,0 +1,399 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`delete_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteLicenseTokenError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_custom_permissions_csv`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCustomPermissionsCsvError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_custom_permissions_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCustomPermissionsReportError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetLicenseTokenError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_status`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetStatusError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostLicenseTokenError { + Status400(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_renew_license_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostRenewLicenseTokenError { + Status401(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`refresh_license_stats`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RefreshLicenseStatsError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Removes the license stored in the Grafana database. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:delete`. +pub async fn delete_license_token(configuration: &configuration::Configuration, delete_token_command: models::DeleteTokenCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&delete_token_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing.reports:read`. +pub async fn get_custom_permissions_csv(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/custom-permissions-csv", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing.reports:read`. +pub async fn get_custom_permissions_report(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/custom-permissions", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing:read`. +pub async fn get_license_token(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_status(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/check", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing:update`. +pub async fn post_license_token(configuration: &configuration::Configuration, delete_token_command: models::DeleteTokenCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&delete_token_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Manually ask license issuer for a new token. Available in Grafana Enterprise v7.4+. You need to have a permission with action `licensing:update`. +pub async fn post_renew_license_token(configuration: &configuration::Configuration, body: serde_json::Value) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/token/renew", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&body); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `licensing:read`. +pub async fn refresh_license_stats(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/licensing/refresh-stats", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/mod.rs b/openapi/src/apis/mod.rs new file mode 100755 index 00000000..55e5a9ed --- /dev/null +++ b/openapi/src/apis/mod.rs @@ -0,0 +1,138 @@ +use std::error; +use std::fmt; + +#[derive(Debug, Clone)] +pub struct ResponseContent { + pub status: reqwest::StatusCode, + pub content: String, + pub entity: Option, +} + +#[derive(Debug)] +pub enum Error { + Reqwest(reqwest::Error), + Serde(serde_json::Error), + Io(std::io::Error), + ResponseError(ResponseContent), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let (module, e) = match self { + Error::Reqwest(e) => ("reqwest", e.to_string()), + Error::Serde(e) => ("serde", e.to_string()), + Error::Io(e) => ("IO", e.to_string()), + Error::ResponseError(e) => ("response", format!("status code {}", e.status)), + }; + write!(f, "error in {}: {}", module, e) + } +} + +impl error::Error for Error { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + Some(match self { + Error::Reqwest(e) => e, + Error::Serde(e) => e, + Error::Io(e) => e, + Error::ResponseError(_) => return None, + }) + } +} + +impl From for Error { + fn from(e: reqwest::Error) -> Self { + Error::Reqwest(e) + } +} + +impl From for Error { + fn from(e: serde_json::Error) -> Self { + Error::Serde(e) + } +} + +impl From for Error { + fn from(e: std::io::Error) -> Self { + Error::Io(e) + } +} + +pub fn urlencode>(s: T) -> String { + ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect() +} + +pub fn parse_deep_object(prefix: &str, value: &serde_json::Value) -> Vec<(String, String)> { + if let serde_json::Value::Object(object) = value { + let mut params = vec![]; + + for (key, value) in object { + match value { + serde_json::Value::Object(_) => params.append(&mut parse_deep_object( + &format!("{}[{}]", prefix, key), + value, + )), + serde_json::Value::Array(array) => { + for (i, value) in array.iter().enumerate() { + params.append(&mut parse_deep_object( + &format!("{}[{}][{}]", prefix, key, i), + value, + )); + } + }, + serde_json::Value::String(s) => params.push((format!("{}[{}]", prefix, key), s.clone())), + _ => params.push((format!("{}[{}]", prefix, key), value.to_string())), + } + } + + return params; + } + + unimplemented!("Only objects are supported with style=deepObject") +} + +pub mod access_control_api; +pub mod access_control_provisioning_api; +pub mod admin_api; +pub mod admin_ldap_api; +pub mod admin_provisioning_api; +pub mod admin_users_api; +pub mod annotations_api; +pub mod api_keys_api; +pub mod correlations_api; +pub mod dashboard_permissions_api; +pub mod dashboard_public_api; +pub mod dashboard_versions_api; +pub mod dashboards_api; +pub mod datasources_api; +pub mod devices_api; +pub mod ds_api; +pub mod enterprise_api; +pub mod folder_permissions_api; +pub mod folders_api; +pub mod get_current_org_api; +pub mod ldap_debug_api; +pub mod library_elements_api; +pub mod licensing_api; +pub mod org_api; +pub mod org_invites_api; +pub mod org_preferences_api; +pub mod orgs_api; +pub mod playlists_api; +pub mod provisioning_api; +pub mod query_history_api; +pub mod recording_rules_api; +pub mod reports_api; +pub mod saml_api; +pub mod search_api; +pub mod service_accounts_api; +pub mod signed_in_user_api; +pub mod signing_keys_api; +pub mod snapshots_api; +pub mod sso_settings_api; +pub mod sync_team_groups_api; +pub mod teams_api; +pub mod user_api; +pub mod user_preferences_api; +pub mod users_api; + +pub mod configuration; diff --git a/openapi/src/apis/org_api.rs b/openapi/src/apis/org_api.rs new file mode 100755 index 00000000..cb380d06 --- /dev/null +++ b/openapi/src/apis/org_api.rs @@ -0,0 +1,421 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_org_user_to_current_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddOrgUserToCurrentOrgError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_current_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetCurrentOrgError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_org_users_for_current_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrgUsersForCurrentOrgError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_org_users_for_current_org_lookup`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrgUsersForCurrentOrgLookupError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_org_user_for_current_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveOrgUserForCurrentOrgError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_current_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateCurrentOrgError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_current_org_address`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateCurrentOrgAddressError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_org_user_for_current_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateOrgUserForCurrentOrgError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Adds a global user to the current organization. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:add` with scope `users:*`. +pub async fn add_org_user_to_current_org(configuration: &configuration::Configuration, add_org_user_command: models::AddOrgUserCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/users", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_org_user_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_current_org(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns all org users within the current organization. Accessible to users with org admin role. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:read` with scope `users:*`. +pub async fn get_org_users_for_current_org(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/users", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns all org users within the current organization, but with less detailed information. Accessible to users with org admin role, admin in any folder or admin of any team. Mainly used by Grafana UI for providing list of users when adding team members and when editing folder/dashboard permissions. +pub async fn get_org_users_for_current_org_lookup(configuration: &configuration::Configuration, query: Option<&str>, limit: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/users/lookup", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = query { + local_var_req_builder = local_var_req_builder.query(&[("query", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:remove` with scope `users:*`. +pub async fn remove_org_user_for_current_org(configuration: &configuration::Configuration, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/users/{user_id}", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_current_org(configuration: &configuration::Configuration, update_org_form: models::UpdateOrgForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_org_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_current_org_address(configuration: &configuration::Configuration, update_org_address_form: models::UpdateOrgAddressForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/address", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_org_address_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users.role:update` with scope `users:*`. +pub async fn update_org_user_for_current_org(configuration: &configuration::Configuration, user_id: i64, update_org_user_command: models::UpdateOrgUserCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/users/{user_id}", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_org_user_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/org_invites_api.rs b/openapi/src/apis/org_invites_api.rs new file mode 100755 index 00000000..f19b41ee --- /dev/null +++ b/openapi/src/apis/org_invites_api.rs @@ -0,0 +1,166 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_org_invite`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddOrgInviteError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status412(), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_pending_org_invites`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPendingOrgInvitesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`revoke_invite`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RevokeInviteError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn add_org_invite(configuration: &configuration::Configuration, add_invite_form: models::AddInviteForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/invites", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_invite_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_pending_org_invites(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/invites", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn revoke_invite(configuration: &configuration::Configuration, invitation_code: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/invites/{invitation_code}/revoke", local_var_configuration.base_path, invitation_code=crate::apis::urlencode(invitation_code)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/org_preferences_api.rs b/openapi/src/apis/org_preferences_api.rs new file mode 100755 index 00000000..43d5d920 --- /dev/null +++ b/openapi/src/apis/org_preferences_api.rs @@ -0,0 +1,166 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_org_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrgPreferencesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`patch_org_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PatchOrgPreferencesError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_org_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateOrgPreferencesError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn get_org_preferences(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/preferences", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn patch_org_preferences(configuration: &configuration::Configuration, patch_prefs_cmd: models::PatchPrefsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/preferences", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&patch_prefs_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_org_preferences(configuration: &configuration::Configuration, update_prefs_cmd: models::UpdatePrefsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/org/preferences", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_prefs_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/orgs_api.rs b/openapi/src/apis/orgs_api.rs new file mode 100755 index 00000000..1c32a7f9 --- /dev/null +++ b/openapi/src/apis/orgs_api.rs @@ -0,0 +1,662 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_org_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddOrgUserError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateOrgError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_org_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteOrgByIdError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_org_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrgByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_org_by_name`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrgByNameError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_org_quota`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrgQuotaError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_org_users`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetOrgUsersError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_org_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveOrgUserError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_org_users`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchOrgUsersError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_orgs`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchOrgsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateOrgError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_org_address`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateOrgAddressError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_org_quota`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateOrgQuotaError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_org_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateOrgUserError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Adds a global user to the current organization. If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:add` with scope `users:*`. +pub async fn add_org_user(configuration: &configuration::Configuration, org_id: i64, add_org_user_command: models::AddOrgUserCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/users", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_org_user_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Only works if [users.allow_org_create](https://grafana.com/docs/grafana/latest/administration/configuration/#allow_org_create) is set. +pub async fn create_org(configuration: &configuration::Configuration, create_org_command: models::CreateOrgCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_org_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_org_by_id(configuration: &configuration::Configuration, org_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_org_by_id(configuration: &configuration::Configuration, org_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_org_by_name(configuration: &configuration::Configuration, org_name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/name/{org_name}", local_var_configuration.base_path, org_name=crate::apis::urlencode(org_name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `orgs.quotas:read` and scope `org:id:1` (orgIDScope). +pub async fn get_org_quota(configuration: &configuration::Configuration, org_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/quotas", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:read` with scope `users:*`. +pub async fn get_org_users(configuration: &configuration::Configuration, org_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/users", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:remove` with scope `users:*`. +pub async fn remove_org_user(configuration: &configuration::Configuration, org_id: i64, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/users/{user_id}", local_var_configuration.base_path, org_id=org_id, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users:read` with scope `users:*`. +pub async fn search_org_users(configuration: &configuration::Configuration, org_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/users/search", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn search_orgs(configuration: &configuration::Configuration, page: Option, perpage: Option, name: Option<&str>, query: Option<&str>) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = perpage { + local_var_req_builder = local_var_req_builder.query(&[("perpage", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = name { + local_var_req_builder = local_var_req_builder.query(&[("name", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = query { + local_var_req_builder = local_var_req_builder.query(&[("query", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_org(configuration: &configuration::Configuration, org_id: i64, update_org_form: models::UpdateOrgForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_org_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_org_address(configuration: &configuration::Configuration, org_id: i64, update_org_address_form: models::UpdateOrgAddressForm) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/address", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_org_address_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `orgs.quotas:write` and scope `org:id:1` (orgIDScope). +pub async fn update_org_quota(configuration: &configuration::Configuration, quota_target: &str, org_id: i64, update_quota_cmd: models::UpdateQuotaCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/quotas/{quota_target}", local_var_configuration.base_path, quota_target=crate::apis::urlencode(quota_target), org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_quota_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// If you are running Grafana Enterprise and have Fine-grained access control enabled you need to have a permission with action: `org.users.role:update` with scope `users:*`. +pub async fn update_org_user(configuration: &configuration::Configuration, org_id: i64, user_id: i64, update_org_user_command: models::UpdateOrgUserCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/orgs/{org_id}/users/{user_id}", local_var_configuration.base_path, org_id=org_id, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_org_user_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/playlists_api.rs b/openapi/src/apis/playlists_api.rs new file mode 100755 index 00000000..122764fb --- /dev/null +++ b/openapi/src/apis/playlists_api.rs @@ -0,0 +1,317 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_playlist`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreatePlaylistError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_playlist`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeletePlaylistError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_playlist`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPlaylistError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_playlist_items`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetPlaylistItemsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_playlists`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchPlaylistsError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_playlist`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdatePlaylistError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn create_playlist(configuration: &configuration::Configuration, create_playlist_command: models::CreatePlaylistCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/playlists", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_playlist_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_playlist(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/playlists/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_playlist(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/playlists/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_playlist_items(configuration: &configuration::Configuration, uid: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/playlists/{uid}/items", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn search_playlists(configuration: &configuration::Configuration, query: Option<&str>, limit: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/playlists", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = query { + local_var_req_builder = local_var_req_builder.query(&[("query", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_playlist(configuration: &configuration::Configuration, uid: &str, update_playlist_command: models::UpdatePlaylistCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/playlists/{uid}", local_var_configuration.base_path, uid=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_playlist_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/provisioning_api.rs b/openapi/src/apis/provisioning_api.rs new file mode 100755 index 00000000..4bd22e3b --- /dev/null +++ b/openapi/src/apis/provisioning_api.rs @@ -0,0 +1,1534 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`route_delete_alert_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteDeleteAlertRuleError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_delete_alert_rule_group`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteDeleteAlertRuleGroupError { + Status403(models::ForbiddenError), + Status404(serde_json::Value), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_delete_contactpoints`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteDeleteContactpointsError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_delete_mute_timing`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteDeleteMuteTimingError { + Status409(models::GenericPublicError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_delete_template`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteDeleteTemplateError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_export_mute_timing`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteExportMuteTimingError { + Status403(serde_json::Value), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_export_mute_timings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteExportMuteTimingsError { + Status403(serde_json::Value), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_alert_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetAlertRuleError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_alert_rule_export`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetAlertRuleExportError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_alert_rule_group`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetAlertRuleGroupError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_alert_rule_group_export`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetAlertRuleGroupExportError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_alert_rules`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetAlertRulesError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_alert_rules_export`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetAlertRulesExportError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_contactpoints`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetContactpointsError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_contactpoints_export`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetContactpointsExportError { + Status403(serde_json::Value), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_mute_timing`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetMuteTimingError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_mute_timings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetMuteTimingsError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_policy_tree`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetPolicyTreeError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_policy_tree_export`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetPolicyTreeExportError { + Status404(serde_json::Value), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_template`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetTemplateError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_get_templates`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteGetTemplatesError { + Status404(), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_post_alert_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePostAlertRuleError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_post_contactpoints`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePostContactpointsError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_post_mute_timing`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePostMuteTimingError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_put_alert_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePutAlertRuleError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_put_alert_rule_group`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePutAlertRuleGroupError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_put_contactpoint`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePutContactpointError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_put_mute_timing`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePutMuteTimingError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_put_policy_tree`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePutPolicyTreeError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_put_template`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RoutePutTemplateError { + Status400(models::ValidationError), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`route_reset_policy_tree`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RouteResetPolicyTreeError { + UnknownValue(serde_json::Value), +} + + +pub async fn route_delete_alert_rule(configuration: &configuration::Configuration, uid: &str, x_disable_provenance: Option<&str>) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/alert-rules/{UID}", local_var_configuration.base_path, UID=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Delete rule group +pub async fn route_delete_alert_rule_group(configuration: &configuration::Configuration, folder_uid: &str, group: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}", local_var_configuration.base_path, FolderUID=crate::apis::urlencode(folder_uid), Group=crate::apis::urlencode(group)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_delete_contactpoints(configuration: &configuration::Configuration, uid: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/contact-points/{UID}", local_var_configuration.base_path, UID=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_delete_mute_timing(configuration: &configuration::Configuration, name: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/mute-timings/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_delete_template(configuration: &configuration::Configuration, name: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/templates/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_export_mute_timing(configuration: &configuration::Configuration, name: &str, download: Option, format: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/mute-timings/{name}/export", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = download { + local_var_req_builder = local_var_req_builder.query(&[("download", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = format { + local_var_req_builder = local_var_req_builder.query(&[("format", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_export_mute_timings(configuration: &configuration::Configuration, download: Option, format: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/mute-timings/export", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = download { + local_var_req_builder = local_var_req_builder.query(&[("download", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = format { + local_var_req_builder = local_var_req_builder.query(&[("format", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_alert_rule(configuration: &configuration::Configuration, uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/alert-rules/{UID}", local_var_configuration.base_path, UID=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_alert_rule_export(configuration: &configuration::Configuration, uid: &str, download: Option, format: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/alert-rules/{UID}/export", local_var_configuration.base_path, UID=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = download { + local_var_req_builder = local_var_req_builder.query(&[("download", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = format { + local_var_req_builder = local_var_req_builder.query(&[("format", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_alert_rule_group(configuration: &configuration::Configuration, folder_uid: &str, group: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}", local_var_configuration.base_path, FolderUID=crate::apis::urlencode(folder_uid), Group=crate::apis::urlencode(group)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_alert_rule_group_export(configuration: &configuration::Configuration, folder_uid: &str, group: &str, download: Option, format: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}/export", local_var_configuration.base_path, FolderUID=crate::apis::urlencode(folder_uid), Group=crate::apis::urlencode(group)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = download { + local_var_req_builder = local_var_req_builder.query(&[("download", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = format { + local_var_req_builder = local_var_req_builder.query(&[("format", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_alert_rules(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/alert-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_alert_rules_export(configuration: &configuration::Configuration, download: Option, format: Option<&str>, folder_uid: Option>, group: Option<&str>, rule_uid: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/alert-rules/export", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = download { + local_var_req_builder = local_var_req_builder.query(&[("download", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = format { + local_var_req_builder = local_var_req_builder.query(&[("format", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = folder_uid { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("folderUid".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("folderUid", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = group { + local_var_req_builder = local_var_req_builder.query(&[("group", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = rule_uid { + local_var_req_builder = local_var_req_builder.query(&[("ruleUid", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_contactpoints(configuration: &configuration::Configuration, name: Option<&str>) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/contact-points", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = name { + local_var_req_builder = local_var_req_builder.query(&[("name", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_contactpoints_export(configuration: &configuration::Configuration, download: Option, format: Option<&str>, decrypt: Option, name: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/contact-points/export", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = download { + local_var_req_builder = local_var_req_builder.query(&[("download", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = format { + local_var_req_builder = local_var_req_builder.query(&[("format", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = decrypt { + local_var_req_builder = local_var_req_builder.query(&[("decrypt", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = name { + local_var_req_builder = local_var_req_builder.query(&[("name", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_mute_timing(configuration: &configuration::Configuration, name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/mute-timings/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_mute_timings(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/mute-timings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_policy_tree(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/policies", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_policy_tree_export(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/policies/export", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_template(configuration: &configuration::Configuration, name: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/templates/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_get_templates(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/templates", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_post_alert_rule(configuration: &configuration::Configuration, x_disable_provenance: Option<&str>, provisioned_alert_rule: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/alert-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&provisioned_alert_rule); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_post_contactpoints(configuration: &configuration::Configuration, x_disable_provenance: Option<&str>, embedded_contact_point: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/contact-points", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&embedded_contact_point); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_post_mute_timing(configuration: &configuration::Configuration, x_disable_provenance: Option<&str>, mute_time_interval: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/mute-timings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&mute_time_interval); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_put_alert_rule(configuration: &configuration::Configuration, uid: &str, x_disable_provenance: Option<&str>, provisioned_alert_rule: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/alert-rules/{UID}", local_var_configuration.base_path, UID=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&provisioned_alert_rule); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_put_alert_rule_group(configuration: &configuration::Configuration, folder_uid: &str, group: &str, x_disable_provenance: Option<&str>, alert_rule_group: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}", local_var_configuration.base_path, FolderUID=crate::apis::urlencode(folder_uid), Group=crate::apis::urlencode(group)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&alert_rule_group); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_put_contactpoint(configuration: &configuration::Configuration, uid: &str, x_disable_provenance: Option<&str>, embedded_contact_point: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/contact-points/{UID}", local_var_configuration.base_path, UID=crate::apis::urlencode(uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&embedded_contact_point); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_put_mute_timing(configuration: &configuration::Configuration, name: &str, x_disable_provenance: Option<&str>, mute_time_interval: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/mute-timings/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&mute_time_interval); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_put_policy_tree(configuration: &configuration::Configuration, x_disable_provenance: Option<&str>, route: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/policies", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&route); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_put_template(configuration: &configuration::Configuration, name: &str, x_disable_provenance: Option<&str>, notification_template_content: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/templates/{name}", local_var_configuration.base_path, name=crate::apis::urlencode(name)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(local_var_param_value) = x_disable_provenance { + local_var_req_builder = local_var_req_builder.header("X-Disable-Provenance", local_var_param_value.to_string()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(¬ification_template_content); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn route_reset_policy_tree(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/provisioning/policies", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/query_history_api.rs b/openapi/src/apis/query_history_api.rs new file mode 100755 index 00000000..d23579ed --- /dev/null +++ b/openapi/src/apis/query_history_api.rs @@ -0,0 +1,337 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_query`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateQueryError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_query`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteQueryError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`patch_query_comment`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PatchQueryCommentError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_queries`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchQueriesError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`star_query`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum StarQueryError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`unstar_query`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UnstarQueryError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Adds new query to query history. +pub async fn create_query(configuration: &configuration::Configuration, create_query_in_query_history_command: models::CreateQueryInQueryHistoryCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/query-history", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_query_in_query_history_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Deletes an existing query in query history as specified by the UID. This operation cannot be reverted. +pub async fn delete_query(configuration: &configuration::Configuration, query_history_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/query-history/{query_history_uid}", local_var_configuration.base_path, query_history_uid=crate::apis::urlencode(query_history_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Updates comment for query in query history as specified by the UID. +pub async fn patch_query_comment(configuration: &configuration::Configuration, query_history_uid: &str, patch_query_comment_in_query_history_command: models::PatchQueryCommentInQueryHistoryCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/query-history/{query_history_uid}", local_var_configuration.base_path, query_history_uid=crate::apis::urlencode(query_history_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&patch_query_comment_in_query_history_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns a list of queries in the query history that matches the search criteria. Query history search supports pagination. Use the `limit` parameter to control the maximum number of queries returned; the default limit is 100. You can also use the `page` query parameter to fetch queries from any page other than the first one. +pub async fn search_queries(configuration: &configuration::Configuration, datasource_uid: Option>, search_string: Option<&str>, only_starred: Option, sort: Option<&str>, page: Option, limit: Option, from: Option, to: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/query-history", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = datasource_uid { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("datasourceUid".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("datasourceUid", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = search_string { + local_var_req_builder = local_var_req_builder.query(&[("searchString", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = only_starred { + local_var_req_builder = local_var_req_builder.query(&[("onlyStarred", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = sort { + local_var_req_builder = local_var_req_builder.query(&[("sort", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = from { + local_var_req_builder = local_var_req_builder.query(&[("from", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = to { + local_var_req_builder = local_var_req_builder.query(&[("to", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Adds star to query in query history as specified by the UID. +pub async fn star_query(configuration: &configuration::Configuration, query_history_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/query-history/star/{query_history_uid}", local_var_configuration.base_path, query_history_uid=crate::apis::urlencode(query_history_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Removes star from query in query history as specified by the UID. +pub async fn unstar_query(configuration: &configuration::Configuration, query_history_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/query-history/star/{query_history_uid}", local_var_configuration.base_path, query_history_uid=crate::apis::urlencode(query_history_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/recording_rules_api.rs b/openapi/src/apis/recording_rules_api.rs new file mode 100755 index 00000000..463dd4b4 --- /dev/null +++ b/openapi/src/apis/recording_rules_api.rs @@ -0,0 +1,417 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_recording_rule_write_target`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateRecordingRuleWriteTargetError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_recording_rule_write_target`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteRecordingRuleWriteTargetError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_recording_rule_write_target`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetRecordingRuleWriteTargetError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_recording_rules`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListRecordingRulesError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`test_create_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum TestCreateRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_recording_rule`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateRecordingRuleError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn create_recording_rule(configuration: &configuration::Configuration, recording_rule_json: models::RecordingRuleJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&recording_rule_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// It returns a 422 if there is not an existing prometheus data source configured. +pub async fn create_recording_rule_write_target(configuration: &configuration::Configuration, prometheus_remote_write_target_json: models::PrometheusRemoteWriteTargetJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/writer", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&prometheus_remote_write_target_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_recording_rule(configuration: &configuration::Configuration, recording_rule_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/{recordingRuleID}", local_var_configuration.base_path, recordingRuleID=recording_rule_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_recording_rule_write_target(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/writer", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_recording_rule_write_target(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/writer", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn list_recording_rules(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn test_create_recording_rule(configuration: &configuration::Configuration, recording_rule_json: models::RecordingRuleJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules/test", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&recording_rule_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_recording_rule(configuration: &configuration::Configuration, recording_rule_json: models::RecordingRuleJson) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/recording-rules", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&recording_rule_json); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/reports_api.rs b/openapi/src/apis/reports_api.rs new file mode 100755 index 00000000..00ae9dc7 --- /dev/null +++ b/openapi/src/apis/reports_api.rs @@ -0,0 +1,544 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_report_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetReportSettingsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_reports`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetReportsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`render_report_pdfs`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RenderReportPdfsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`save_report_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SaveReportSettingsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`send_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SendReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`send_test_email`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SendTestEmailError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_report`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateReportError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Available to org admins only and with a valid license. You need to have a permission with action `reports.admin:create`. +pub async fn create_report(configuration: &configuration::Configuration, create_or_update_report_config: models::CreateOrUpdateReportConfig) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_or_update_report_config); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.delete` with scope `reports:id:`. +pub async fn delete_report(configuration: &configuration::Configuration, id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/{id}", local_var_configuration.base_path, id=id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:id:`. +pub async fn get_report(configuration: &configuration::Configuration, id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/{id}", local_var_configuration.base_path, id=id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:read`x. +pub async fn get_report_settings(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/settings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports:read` with scope `reports:*`. +pub async fn get_reports(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to all users and with a valid license. +pub async fn render_report_pdfs(configuration: &configuration::Configuration, dashboard_id: Option<&str>, orientation: Option<&str>, layout: Option<&str>, title: Option<&str>, scale_factor: Option<&str>, include_tables: Option<&str>) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/render/pdfs", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = dashboard_id { + local_var_req_builder = local_var_req_builder.query(&[("dashboardID", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = orientation { + local_var_req_builder = local_var_req_builder.query(&[("orientation", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = layout { + local_var_req_builder = local_var_req_builder.query(&[("layout", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = title { + local_var_req_builder = local_var_req_builder.query(&[("title", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = scale_factor { + local_var_req_builder = local_var_req_builder.query(&[("scaleFactor", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = include_tables { + local_var_req_builder = local_var_req_builder.query(&[("includeTables", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.settings:write`xx. +pub async fn save_report_settings(configuration: &configuration::Configuration, report_settings: models::ReportSettings) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/settings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&report_settings); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Generate and send a report. This API waits for the report to be generated before returning. We recommend that you set the client’s timeout to at least 60 seconds. Available to org admins only and with a valid license. Only available in Grafana Enterprise v7.0+. This API endpoint is experimental and may be deprecated in a future release. On deprecation, a migration strategy will be provided and the endpoint will remain functional until the next major release of Grafana. You need to have a permission with action `reports:send`. +pub async fn send_report(configuration: &configuration::Configuration, report_email: models::ReportEmail) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/email", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&report_email); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid license. You need to have a permission with action `reports:send`. +pub async fn send_test_email(configuration: &configuration::Configuration, create_or_update_report_config: models::CreateOrUpdateReportConfig) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/test-email", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_or_update_report_config); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Available to org admins only and with a valid or expired license. You need to have a permission with action `reports.admin:write` with scope `reports:id:`. +pub async fn update_report(configuration: &configuration::Configuration, id: i64, create_or_update_report_config: models::CreateOrUpdateReportConfig) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/reports/{id}", local_var_configuration.base_path, id=id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_or_update_report_config); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/saml_api.rs b/openapi/src/apis/saml_api.rs new file mode 100755 index 00000000..eac64a73 --- /dev/null +++ b/openapi/src/apis/saml_api.rs @@ -0,0 +1,264 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_metadata`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetMetadataError { + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_saml_logout`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSamlLogoutError { + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_slo`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSloError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_acs`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostAcsError { + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`post_slo`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PostSloError { + Status400(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn get_metadata(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/metadata", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_saml_logout(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/logout/saml", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. +pub async fn get_slo(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/slo", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn post_acs(configuration: &configuration::Configuration, relay_state: Option<&str>) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/acs", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = relay_state { + local_var_req_builder = local_var_req_builder.query(&[("RelayState", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// There might be two possible requests: 1. Logout response (callback) when Grafana initiates single logout and IdP returns response to logout request. 2. Logout request when another SP initiates single logout and IdP sends logout request to the Grafana, or in case of IdP-initiated logout. +pub async fn post_slo(configuration: &configuration::Configuration, saml_request: Option<&str>, saml_response: Option<&str>) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/saml/slo", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = saml_request { + local_var_req_builder = local_var_req_builder.query(&[("SAMLRequest", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = saml_response { + local_var_req_builder = local_var_req_builder.query(&[("SAMLResponse", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/search_api.rs b/openapi/src/apis/search_api.rs new file mode 100755 index 00000000..0f146337 --- /dev/null +++ b/openapi/src/apis/search_api.rs @@ -0,0 +1,163 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`list_sort_options`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListSortOptionsError { + Status401(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchError { + Status401(models::ErrorResponseBody), + Status422(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn list_sort_options(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/search/sorting", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn search(configuration: &configuration::Configuration, query: Option<&str>, tag: Option>, r#type: Option<&str>, dashboard_ids: Option>, dashboard_uids: Option>, folder_ids: Option>, folder_uids: Option>, starred: Option, limit: Option, page: Option, permission: Option<&str>, sort: Option<&str>) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = query { + local_var_req_builder = local_var_req_builder.query(&[("query", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = tag { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("tag".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("tag", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = r#type { + local_var_req_builder = local_var_req_builder.query(&[("type", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = dashboard_ids { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("dashboardIds".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("dashboardIds", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = dashboard_uids { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("dashboardUIDs".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("dashboardUIDs", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = folder_ids { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("folderIds".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("folderIds", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = folder_uids { + local_var_req_builder = match "multi" { + "multi" => local_var_req_builder.query(&local_var_str.into_iter().map(|p| ("folderUIDs".to_owned(), p.to_string())).collect::>()), + _ => local_var_req_builder.query(&[("folderUIDs", &local_var_str.into_iter().map(|p| p.to_string()).collect::>().join(",").to_string())]), + }; + } + if let Some(ref local_var_str) = starred { + local_var_req_builder = local_var_req_builder.query(&[("starred", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = permission { + local_var_req_builder = local_var_req_builder.query(&[("permission", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = sort { + local_var_req_builder = local_var_req_builder.query(&[("sort", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/service_accounts_api.rs b/openapi/src/apis/service_accounts_api.rs new file mode 100755 index 00000000..228f7361 --- /dev/null +++ b/openapi/src/apis/service_accounts_api.rs @@ -0,0 +1,440 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_service_account`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateServiceAccountError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateTokenError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_service_account`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteServiceAccountError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteTokenError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_tokens`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListTokensError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`retrieve_service_account`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RetrieveServiceAccountError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_org_service_accounts_with_paging`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchOrgServiceAccountsWithPagingError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_service_account`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateServiceAccountError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:*` Requires basic authentication and that the authenticated user is a Grafana Admin. +pub async fn create_service_account(configuration: &configuration::Configuration, create_service_account_form: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_service_account_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:id:1` (single service account) +pub async fn create_token(configuration: &configuration::Configuration, service_account_id: i64, add_service_account_token_command: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts/{serviceAccountId}/tokens", local_var_configuration.base_path, serviceAccountId=service_account_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_service_account_token_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:delete` scope: `serviceaccounts:id:1` (single service account) +pub async fn delete_service_account(configuration: &configuration::Configuration, service_account_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts/{serviceAccountId}", local_var_configuration.base_path, serviceAccountId=service_account_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:id:1` (single service account) Requires basic authentication and that the authenticated user is a Grafana Admin. +pub async fn delete_token(configuration: &configuration::Configuration, token_id: i64, service_account_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts/{serviceAccountId}/tokens/{tokenId}", local_var_configuration.base_path, tokenId=token_id, serviceAccountId=service_account_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:read` scope: `global:serviceaccounts:id:1` (single service account) Requires basic authentication and that the authenticated user is a Grafana Admin. +pub async fn list_tokens(configuration: &configuration::Configuration, service_account_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts/{serviceAccountId}/tokens", local_var_configuration.base_path, serviceAccountId=service_account_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:read` scope: `serviceaccounts:id:1` (single service account) +pub async fn retrieve_service_account(configuration: &configuration::Configuration, service_account_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts/{serviceAccountId}", local_var_configuration.base_path, serviceAccountId=service_account_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:read` scope: `serviceaccounts:*` +pub async fn search_org_service_accounts_with_paging(configuration: &configuration::Configuration, disabled: Option, expired_tokens: Option, query: Option<&str>, perpage: Option, page: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = disabled { + local_var_req_builder = local_var_req_builder.query(&[("Disabled", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = expired_tokens { + local_var_req_builder = local_var_req_builder.query(&[("expiredTokens", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = query { + local_var_req_builder = local_var_req_builder.query(&[("query", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = perpage { + local_var_req_builder = local_var_req_builder.query(&[("perpage", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Required permissions (See note in the [introduction](https://grafana.com/docs/grafana/latest/developers/http_api/serviceaccount/#service-account-api) for an explanation): action: `serviceaccounts:write` scope: `serviceaccounts:id:1` (single service account) +pub async fn update_service_account(configuration: &configuration::Configuration, service_account_id: i64, update_service_account_form: Option) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/serviceaccounts/{serviceAccountId}", local_var_configuration.base_path, serviceAccountId=service_account_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_service_account_form); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/signed_in_user_api.rs b/openapi/src/apis/signed_in_user_api.rs new file mode 100755 index 00000000..5d2a5442 --- /dev/null +++ b/openapi/src/apis/signed_in_user_api.rs @@ -0,0 +1,746 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`change_user_password`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ChangeUserPasswordError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`clear_help_flags`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ClearHelpFlagsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_signed_in_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSignedInUserError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_signed_in_user_org_list`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSignedInUserOrgListError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_signed_in_user_team_list`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSignedInUserTeamListError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_user_auth_tokens`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserAuthTokensError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_user_quotas`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserQuotasError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`revoke_user_auth_token`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RevokeUserAuthTokenError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`set_help_flag`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SetHelpFlagError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`star_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum StarDashboardError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`star_dashboard_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum StarDashboardByUidError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`unstar_dashboard`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UnstarDashboardError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`unstar_dashboard_by_uid`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UnstarDashboardByUidError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_signed_in_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateSignedInUserError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`user_set_using_org`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UserSetUsingOrgError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Changes the password for the user. +pub async fn change_user_password(configuration: &configuration::Configuration, change_user_password_command: models::ChangeUserPasswordCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/password", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&change_user_password_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn clear_help_flags(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/helpflags/clear", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get (current authenticated user) +pub async fn get_signed_in_user(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Return a list of all organizations of the current user. +pub async fn get_signed_in_user_org_list(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/orgs", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Return a list of all teams that the current user is member of. +pub async fn get_signed_in_user_team_list(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/teams", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Return a list of all auth tokens (devices) that the actual user currently have logged in from. +pub async fn get_user_auth_tokens(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/auth-tokens", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_user_quotas(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/quotas", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Revokes the given auth token (device) for the actual user. User of issued auth token (device) will no longer be logged in and will be required to authenticate again upon next activity. +pub async fn revoke_user_auth_token(configuration: &configuration::Configuration, revoke_auth_token_cmd: models::RevokeAuthTokenCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/revoke-auth-token", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&revoke_auth_token_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn set_help_flag(configuration: &configuration::Configuration, flag_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/helpflags/{flag_id}", local_var_configuration.base_path, flag_id=crate::apis::urlencode(flag_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Stars the given Dashboard for the actual user. +pub async fn star_dashboard(configuration: &configuration::Configuration, dashboard_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/stars/dashboard/{dashboard_id}", local_var_configuration.base_path, dashboard_id=crate::apis::urlencode(dashboard_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Stars the given Dashboard for the actual user. +pub async fn star_dashboard_by_uid(configuration: &configuration::Configuration, dashboard_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/stars/dashboard/uid/{dashboard_uid}", local_var_configuration.base_path, dashboard_uid=crate::apis::urlencode(dashboard_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Deletes the starring of the given Dashboard for the actual user. +pub async fn unstar_dashboard(configuration: &configuration::Configuration, dashboard_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/stars/dashboard/{dashboard_id}", local_var_configuration.base_path, dashboard_id=crate::apis::urlencode(dashboard_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Deletes the starring of the given Dashboard for the actual user. +pub async fn unstar_dashboard_by_uid(configuration: &configuration::Configuration, dashboard_uid: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/stars/dashboard/uid/{dashboard_uid}", local_var_configuration.base_path, dashboard_uid=crate::apis::urlencode(dashboard_uid)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_signed_in_user(configuration: &configuration::Configuration, update_user_command: models::UpdateUserCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_user_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Switch user context to the given organization. +pub async fn user_set_using_org(configuration: &configuration::Configuration, org_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/using/{org_id}", local_var_configuration.base_path, org_id=org_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/signing_keys_api.rs b/openapi/src/apis/signing_keys_api.rs new file mode 100755 index 00000000..c4d4adc4 --- /dev/null +++ b/openapi/src/apis/signing_keys_api.rs @@ -0,0 +1,65 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`retrieve_jwks`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RetrieveJwksError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Required permissions None +pub async fn retrieve_jwks(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/signing-keys/keys", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/snapshots_api.rs b/openapi/src/apis/snapshots_api.rs new file mode 100755 index 00000000..8c21cf51 --- /dev/null +++ b/openapi/src/apis/snapshots_api.rs @@ -0,0 +1,312 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`create_dashboard_snapshot`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateDashboardSnapshotError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_dashboard_snapshot`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteDashboardSnapshotError { + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_dashboard_snapshot_by_delete_key`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteDashboardSnapshotByDeleteKeyError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_dashboard_snapshot`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetDashboardSnapshotError { + Status400(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_sharing_options`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetSharingOptionsError { + Status401(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_dashboard_snapshots`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchDashboardSnapshotsError { + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// Snapshot public mode should be enabled or authentication is required. +pub async fn create_dashboard_snapshot(configuration: &configuration::Configuration, create_dashboard_snapshot_command: models::CreateDashboardSnapshotCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/snapshots", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_dashboard_snapshot_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_dashboard_snapshot(configuration: &configuration::Configuration, key: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/snapshots/{key}", local_var_configuration.base_path, key=crate::apis::urlencode(key)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Snapshot public mode should be enabled or authentication is required. +pub async fn delete_dashboard_snapshot_by_delete_key(configuration: &configuration::Configuration, delete_key: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/snapshots-delete/{deleteKey}", local_var_configuration.base_path, deleteKey=crate::apis::urlencode(delete_key)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_dashboard_snapshot(configuration: &configuration::Configuration, key: &str) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/snapshots/{key}", local_var_configuration.base_path, key=crate::apis::urlencode(key)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_sharing_options(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/snapshot/shared-options", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn search_dashboard_snapshots(configuration: &configuration::Configuration, query: Option<&str>, limit: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/dashboard/snapshots", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = query { + local_var_req_builder = local_var_req_builder.query(&[("query", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = limit { + local_var_req_builder = local_var_req_builder.query(&[("limit", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/sso_settings_api.rs b/openapi/src/apis/sso_settings_api.rs new file mode 100755 index 00000000..af906bd3 --- /dev/null +++ b/openapi/src/apis/sso_settings_api.rs @@ -0,0 +1,219 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_provider_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetProviderSettingsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`list_all_providers_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ListAllProvidersSettingsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_provider_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveProviderSettingsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_provider_settings`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateProviderSettingsError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +/// You need to have a permission with action `settings:read` with scope `settings:auth.:*`. +pub async fn get_provider_settings(configuration: &configuration::Configuration, key: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/sso-settings/{key}", local_var_configuration.base_path, key=crate::apis::urlencode(key)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// You need to have a permission with action `settings:read` with scope `settings:auth.:*`. +pub async fn list_all_providers_settings(configuration: &configuration::Configuration, ) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/sso-settings", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Removes the SSO Settings for a provider. You need to have a permission with action `settings:write` and scope `settings:auth.:*`. +pub async fn remove_provider_settings(configuration: &configuration::Configuration, key: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/sso-settings/{key}", local_var_configuration.base_path, key=crate::apis::urlencode(key)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Inserts or updates the SSO Settings for a provider. You need to have a permission with action `settings:write` and scope `settings:auth.:*`. +pub async fn update_provider_settings(configuration: &configuration::Configuration, key: &str, update_provider_settings_request: models::UpdateProviderSettingsRequest) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/v1/sso-settings/{key}", local_var_configuration.base_path, key=crate::apis::urlencode(key)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_provider_settings_request); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/sync_team_groups_api.rs b/openapi/src/apis/sync_team_groups_api.rs new file mode 100755 index 00000000..cc035f07 --- /dev/null +++ b/openapi/src/apis/sync_team_groups_api.rs @@ -0,0 +1,172 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_team_group_api`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddTeamGroupApiError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_team_groups_api`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetTeamGroupsApiError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_team_group_api_query`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveTeamGroupApiQueryError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn add_team_group_api(configuration: &configuration::Configuration, team_id: i64, team_group_mapping: models::TeamGroupMapping) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{teamId}/groups", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&team_group_mapping); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_team_groups_api(configuration: &configuration::Configuration, team_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{teamId}/groups", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn remove_team_group_api_query(configuration: &configuration::Configuration, team_id: i64, group_id: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{teamId}/groups", local_var_configuration.base_path, teamId=team_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = group_id { + local_var_req_builder = local_var_req_builder.query(&[("groupId", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/teams_api.rs b/openapi/src/apis/teams_api.rs new file mode 100755 index 00000000..3a021827 --- /dev/null +++ b/openapi/src/apis/teams_api.rs @@ -0,0 +1,571 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`add_team_member`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AddTeamMemberError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`create_team`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum CreateTeamError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`delete_team_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum DeleteTeamByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_team_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetTeamByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_team_members`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetTeamMembersError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_team_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetTeamPreferencesError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`remove_team_member`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum RemoveTeamMemberError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_teams`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchTeamsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_team`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateTeamError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_team_member`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateTeamMemberError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_team_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateTeamPreferencesError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn add_team_member(configuration: &configuration::Configuration, team_id: &str, add_team_member_command: models::AddTeamMemberCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}/members", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&add_team_member_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn create_team(configuration: &configuration::Configuration, create_team_command: models::CreateTeamCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&create_team_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn delete_team_by_id(configuration: &configuration::Configuration, team_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_team_by_id(configuration: &configuration::Configuration, team_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_team_members(configuration: &configuration::Configuration, team_id: &str) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}/members", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_team_preferences(configuration: &configuration::Configuration, team_id: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}/preferences", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn remove_team_member(configuration: &configuration::Configuration, team_id: &str, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}/members/{user_id}", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id), user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::DELETE, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn search_teams(configuration: &configuration::Configuration, page: Option, perpage: Option, name: Option<&str>, query: Option<&str>) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = perpage { + local_var_req_builder = local_var_req_builder.query(&[("perpage", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = name { + local_var_req_builder = local_var_req_builder.query(&[("name", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = query { + local_var_req_builder = local_var_req_builder.query(&[("query", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_team(configuration: &configuration::Configuration, team_id: &str, update_team_command: models::UpdateTeamCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_team_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_team_member(configuration: &configuration::Configuration, team_id: &str, user_id: i64, update_team_member_command: models::UpdateTeamMemberCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}/members/{user_id}", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id), user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_team_member_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn update_team_preferences(configuration: &configuration::Configuration, team_id: &str, update_prefs_cmd: models::UpdatePrefsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/teams/{team_id}/preferences", local_var_configuration.base_path, team_id=crate::apis::urlencode(team_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_prefs_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/user_api.rs b/openapi/src/apis/user_api.rs new file mode 100755 index 00000000..6d211e93 --- /dev/null +++ b/openapi/src/apis/user_api.rs @@ -0,0 +1,64 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`update_user_email`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserEmailError { + UnknownValue(serde_json::Value), +} + + +/// Update the email of user given a verification code. +pub async fn update_user_email(configuration: &configuration::Configuration, ) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/email/update", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/user_preferences_api.rs b/openapi/src/apis/user_preferences_api.rs new file mode 100755 index 00000000..eb99e889 --- /dev/null +++ b/openapi/src/apis/user_preferences_api.rs @@ -0,0 +1,164 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_user_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserPreferencesError { + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`patch_user_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PatchUserPreferencesError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_user_preferences`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserPreferencesError { + Status400(models::ErrorResponseBody), + Status401(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn get_user_preferences(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/preferences", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn patch_user_preferences(configuration: &configuration::Configuration, patch_prefs_cmd: models::PatchPrefsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/preferences", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&patch_prefs_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Omitting a key (`theme`, `homeDashboardId`, `timezone`) will cause the current value to be replaced with the system default value. +pub async fn update_user_preferences(configuration: &configuration::Configuration, update_prefs_cmd: models::UpdatePrefsCmd) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/user/preferences", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_prefs_cmd); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/apis/users_api.rs b/openapi/src/apis/users_api.rs new file mode 100755 index 00000000..4da1dcba --- /dev/null +++ b/openapi/src/apis/users_api.rs @@ -0,0 +1,373 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + + +use reqwest; + +use crate::{apis::ResponseContent, models}; +use super::{Error, configuration}; + + +/// struct for typed errors of method [`get_user_by_id`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserByIdError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_user_by_login_or_email`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserByLoginOrEmailError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_user_org_list`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserOrgListError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`get_user_teams`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum GetUserTeamsError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_users`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchUsersError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`search_users_with_paging`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SearchUsersWithPagingError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + +/// struct for typed errors of method [`update_user`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum UpdateUserError { + Status401(models::ErrorResponseBody), + Status403(models::ErrorResponseBody), + Status404(models::ErrorResponseBody), + Status409(models::ErrorResponseBody), + Status500(models::ErrorResponseBody), + UnknownValue(serde_json::Value), +} + + +pub async fn get_user_by_id(configuration: &configuration::Configuration, user_id: i64) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/users/{user_id}", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn get_user_by_login_or_email(configuration: &configuration::Configuration, login_or_email: &str) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/users/lookup", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + local_var_req_builder = local_var_req_builder.query(&[("loginOrEmail", &login_or_email.to_string())]); + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get organizations for user identified by id. +pub async fn get_user_org_list(configuration: &configuration::Configuration, user_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/users/{user_id}/orgs", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Get teams for user identified by id. +pub async fn get_user_teams(configuration: &configuration::Configuration, user_id: i64) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/users/{user_id}/teams", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Returns all users that the authenticated user has permission to view, admin permission required. +pub async fn search_users(configuration: &configuration::Configuration, perpage: Option, page: Option) -> Result, Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/users", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_str) = perpage { + local_var_req_builder = local_var_req_builder.query(&[("perpage", &local_var_str.to_string())]); + } + if let Some(ref local_var_str) = page { + local_var_req_builder = local_var_req_builder.query(&[("page", &local_var_str.to_string())]); + } + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +pub async fn search_users_with_paging(configuration: &configuration::Configuration, ) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/users/search", local_var_configuration.base_path); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::GET, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + +/// Update the user identified by id. +pub async fn update_user(configuration: &configuration::Configuration, user_id: i64, update_user_command: models::UpdateUserCommand) -> Result> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/users/{user_id}", local_var_configuration.base_path, user_id=user_id); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PUT, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_apikey) = local_var_configuration.api_key { + let local_var_key = local_var_apikey.key.clone(); + let local_var_value = match local_var_apikey.prefix { + Some(ref local_var_prefix) => format!("{} {}", local_var_prefix, local_var_key), + None => local_var_key, + }; + local_var_req_builder = local_var_req_builder.header("Authorization", local_var_value); + }; + if let Some(ref local_var_auth_conf) = local_var_configuration.basic_auth { + local_var_req_builder = local_var_req_builder.basic_auth(local_var_auth_conf.0.to_owned(), local_var_auth_conf.1.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&update_user_command); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/openapi/src/lib.rs b/openapi/src/lib.rs new file mode 100755 index 00000000..1ac11419 --- /dev/null +++ b/openapi/src/lib.rs @@ -0,0 +1,12 @@ +#![allow(unused_imports)] + +#[macro_use] +extern crate serde_derive; + +extern crate serde; +extern crate serde_json; +extern crate url; +extern crate reqwest; + +pub mod apis; +pub mod models; diff --git a/openapi/src/models/active_sync_status_dto.rs b/openapi/src/models/active_sync_status_dto.rs new file mode 100755 index 00000000..ce563c80 --- /dev/null +++ b/openapi/src/models/active_sync_status_dto.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// ActiveSyncStatusDto : ActiveSyncStatusDTO holds the information for LDAP background Sync +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ActiveSyncStatusDto { + #[serde(rename = "enabled", skip_serializing_if = "Option::is_none")] + pub enabled: Option, + #[serde(rename = "nextSync", skip_serializing_if = "Option::is_none")] + pub next_sync: Option, + #[serde(rename = "prevSync", skip_serializing_if = "Option::is_none")] + pub prev_sync: Option>, + #[serde(rename = "schedule", skip_serializing_if = "Option::is_none")] + pub schedule: Option, +} + +impl ActiveSyncStatusDto { + /// ActiveSyncStatusDTO holds the information for LDAP background Sync + pub fn new() -> ActiveSyncStatusDto { + ActiveSyncStatusDto { + enabled: None, + next_sync: None, + prev_sync: None, + schedule: None, + } + } +} + diff --git a/openapi/src/models/active_user_stats.rs b/openapi/src/models/active_user_stats.rs new file mode 100755 index 00000000..41dd7239 --- /dev/null +++ b/openapi/src/models/active_user_stats.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ActiveUserStats { + #[serde(rename = "active_admins_and_editors", skip_serializing_if = "Option::is_none")] + pub active_admins_and_editors: Option, + #[serde(rename = "active_anonymous_devices", skip_serializing_if = "Option::is_none")] + pub active_anonymous_devices: Option, + #[serde(rename = "active_users", skip_serializing_if = "Option::is_none")] + pub active_users: Option, + #[serde(rename = "active_viewers", skip_serializing_if = "Option::is_none")] + pub active_viewers: Option, +} + +impl ActiveUserStats { + pub fn new() -> ActiveUserStats { + ActiveUserStats { + active_admins_and_editors: None, + active_anonymous_devices: None, + active_users: None, + active_viewers: None, + } + } +} + diff --git a/openapi/src/models/add_api_key_command.rs b/openapi/src/models/add_api_key_command.rs new file mode 100755 index 00000000..afb580ad --- /dev/null +++ b/openapi/src/models/add_api_key_command.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddApiKeyCommand { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "secondsToLive", skip_serializing_if = "Option::is_none")] + pub seconds_to_live: Option, +} + +impl AddApiKeyCommand { + pub fn new() -> AddApiKeyCommand { + AddApiKeyCommand { + name: None, + role: None, + seconds_to_live: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/add_data_source_200_response.rs b/openapi/src/models/add_data_source_200_response.rs new file mode 100755 index 00000000..dad51a2f --- /dev/null +++ b/openapi/src/models/add_data_source_200_response.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddDataSource200Response { + #[serde(rename = "datasource")] + pub datasource: Box, + /// ID Identifier of the new data source. + #[serde(rename = "id")] + pub id: i64, + /// Message Message of the deleted dashboard. + #[serde(rename = "message")] + pub message: String, + /// Name of the new data source. + #[serde(rename = "name")] + pub name: String, +} + +impl AddDataSource200Response { + pub fn new(datasource: models::DataSource, id: i64, message: String, name: String) -> AddDataSource200Response { + AddDataSource200Response { + datasource: Box::new(datasource), + id, + message, + name, + } + } +} + diff --git a/openapi/src/models/add_data_source_command.rs b/openapi/src/models/add_data_source_command.rs new file mode 100755 index 00000000..cc09e8f3 --- /dev/null +++ b/openapi/src/models/add_data_source_command.rs @@ -0,0 +1,64 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AddDataSourceCommand : Also acts as api DTO +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddDataSourceCommand { + #[serde(rename = "access", skip_serializing_if = "Option::is_none")] + pub access: Option, + #[serde(rename = "basicAuth", skip_serializing_if = "Option::is_none")] + pub basic_auth: Option, + #[serde(rename = "basicAuthUser", skip_serializing_if = "Option::is_none")] + pub basic_auth_user: Option, + #[serde(rename = "database", skip_serializing_if = "Option::is_none")] + pub database: Option, + #[serde(rename = "isDefault", skip_serializing_if = "Option::is_none")] + pub is_default: Option, + #[serde(rename = "jsonData", skip_serializing_if = "Option::is_none")] + pub json_data: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "secureJsonData", skip_serializing_if = "Option::is_none")] + pub secure_json_data: Option>, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "user", skip_serializing_if = "Option::is_none")] + pub user: Option, + #[serde(rename = "withCredentials", skip_serializing_if = "Option::is_none")] + pub with_credentials: Option, +} + +impl AddDataSourceCommand { + /// Also acts as api DTO + pub fn new() -> AddDataSourceCommand { + AddDataSourceCommand { + access: None, + basic_auth: None, + basic_auth_user: None, + database: None, + is_default: None, + json_data: None, + name: None, + secure_json_data: None, + r#type: None, + uid: None, + url: None, + user: None, + with_credentials: None, + } + } +} + diff --git a/openapi/src/models/add_invite_form.rs b/openapi/src/models/add_invite_form.rs new file mode 100755 index 00000000..fa325aad --- /dev/null +++ b/openapi/src/models/add_invite_form.rs @@ -0,0 +1,53 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddInviteForm { + #[serde(rename = "loginOrEmail", skip_serializing_if = "Option::is_none")] + pub login_or_email: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "sendEmail", skip_serializing_if = "Option::is_none")] + pub send_email: Option, +} + +impl AddInviteForm { + pub fn new() -> AddInviteForm { + AddInviteForm { + login_or_email: None, + name: None, + role: None, + send_email: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/add_org_user_command.rs b/openapi/src/models/add_org_user_command.rs new file mode 100755 index 00000000..2871ecae --- /dev/null +++ b/openapi/src/models/add_org_user_command.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddOrgUserCommand { + #[serde(rename = "loginOrEmail", skip_serializing_if = "Option::is_none")] + pub login_or_email: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, +} + +impl AddOrgUserCommand { + pub fn new() -> AddOrgUserCommand { + AddOrgUserCommand { + login_or_email: None, + role: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/add_service_account_token_command.rs b/openapi/src/models/add_service_account_token_command.rs new file mode 100755 index 00000000..7f8aeddc --- /dev/null +++ b/openapi/src/models/add_service_account_token_command.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddServiceAccountTokenCommand { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "secondsToLive", skip_serializing_if = "Option::is_none")] + pub seconds_to_live: Option, +} + +impl AddServiceAccountTokenCommand { + pub fn new() -> AddServiceAccountTokenCommand { + AddServiceAccountTokenCommand { + name: None, + seconds_to_live: None, + } + } +} + diff --git a/openapi/src/models/add_team_member_command.rs b/openapi/src/models/add_team_member_command.rs new file mode 100755 index 00000000..5bf47e93 --- /dev/null +++ b/openapi/src/models/add_team_member_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddTeamMemberCommand { + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl AddTeamMemberCommand { + pub fn new() -> AddTeamMemberCommand { + AddTeamMemberCommand { + user_id: None, + } + } +} + diff --git a/openapi/src/models/add_team_role_command.rs b/openapi/src/models/add_team_role_command.rs new file mode 100755 index 00000000..0db2d743 --- /dev/null +++ b/openapi/src/models/add_team_role_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddTeamRoleCommand { + #[serde(rename = "roleUid", skip_serializing_if = "Option::is_none")] + pub role_uid: Option, +} + +impl AddTeamRoleCommand { + pub fn new() -> AddTeamRoleCommand { + AddTeamRoleCommand { + role_uid: None, + } + } +} + diff --git a/openapi/src/models/add_user_role_command.rs b/openapi/src/models/add_user_role_command.rs new file mode 100755 index 00000000..1c4f98a5 --- /dev/null +++ b/openapi/src/models/add_user_role_command.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AddUserRoleCommand { + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option, + #[serde(rename = "roleUid", skip_serializing_if = "Option::is_none")] + pub role_uid: Option, +} + +impl AddUserRoleCommand { + pub fn new() -> AddUserRoleCommand { + AddUserRoleCommand { + global: None, + role_uid: None, + } + } +} + diff --git a/openapi/src/models/address.rs b/openapi/src/models/address.rs new file mode 100755 index 00000000..56be8660 --- /dev/null +++ b/openapi/src/models/address.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Address { + #[serde(rename = "address1", skip_serializing_if = "Option::is_none")] + pub address1: Option, + #[serde(rename = "address2", skip_serializing_if = "Option::is_none")] + pub address2: Option, + #[serde(rename = "city", skip_serializing_if = "Option::is_none")] + pub city: Option, + #[serde(rename = "country", skip_serializing_if = "Option::is_none")] + pub country: Option, + #[serde(rename = "state", skip_serializing_if = "Option::is_none")] + pub state: Option, + #[serde(rename = "zipCode", skip_serializing_if = "Option::is_none")] + pub zip_code: Option, +} + +impl Address { + pub fn new() -> Address { + Address { + address1: None, + address2: None, + city: None, + country: None, + state: None, + zip_code: None, + } + } +} + diff --git a/openapi/src/models/admin_create_user_form.rs b/openapi/src/models/admin_create_user_form.rs new file mode 100755 index 00000000..b74d41cd --- /dev/null +++ b/openapi/src/models/admin_create_user_form.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AdminCreateUserForm { + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "password", skip_serializing_if = "Option::is_none")] + pub password: Option, +} + +impl AdminCreateUserForm { + pub fn new() -> AdminCreateUserForm { + AdminCreateUserForm { + email: None, + login: None, + name: None, + org_id: None, + password: None, + } + } +} + diff --git a/openapi/src/models/admin_create_user_response.rs b/openapi/src/models/admin_create_user_response.rs new file mode 100755 index 00000000..3d67da07 --- /dev/null +++ b/openapi/src/models/admin_create_user_response.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AdminCreateUserResponse { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, +} + +impl AdminCreateUserResponse { + pub fn new() -> AdminCreateUserResponse { + AdminCreateUserResponse { + id: None, + message: None, + } + } +} + diff --git a/openapi/src/models/admin_stats.rs b/openapi/src/models/admin_stats.rs new file mode 100755 index 00000000..76041a8d --- /dev/null +++ b/openapi/src/models/admin_stats.rs @@ -0,0 +1,95 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AdminStats { + #[serde(rename = "activeAdmins", skip_serializing_if = "Option::is_none")] + pub active_admins: Option, + #[serde(rename = "activeDevices", skip_serializing_if = "Option::is_none")] + pub active_devices: Option, + #[serde(rename = "activeEditors", skip_serializing_if = "Option::is_none")] + pub active_editors: Option, + #[serde(rename = "activeSessions", skip_serializing_if = "Option::is_none")] + pub active_sessions: Option, + #[serde(rename = "activeUsers", skip_serializing_if = "Option::is_none")] + pub active_users: Option, + #[serde(rename = "activeViewers", skip_serializing_if = "Option::is_none")] + pub active_viewers: Option, + #[serde(rename = "admins", skip_serializing_if = "Option::is_none")] + pub admins: Option, + #[serde(rename = "alerts", skip_serializing_if = "Option::is_none")] + pub alerts: Option, + #[serde(rename = "dailyActiveAdmins", skip_serializing_if = "Option::is_none")] + pub daily_active_admins: Option, + #[serde(rename = "dailyActiveEditors", skip_serializing_if = "Option::is_none")] + pub daily_active_editors: Option, + #[serde(rename = "dailyActiveSessions", skip_serializing_if = "Option::is_none")] + pub daily_active_sessions: Option, + #[serde(rename = "dailyActiveUsers", skip_serializing_if = "Option::is_none")] + pub daily_active_users: Option, + #[serde(rename = "dailyActiveViewers", skip_serializing_if = "Option::is_none")] + pub daily_active_viewers: Option, + #[serde(rename = "dashboards", skip_serializing_if = "Option::is_none")] + pub dashboards: Option, + #[serde(rename = "datasources", skip_serializing_if = "Option::is_none")] + pub datasources: Option, + #[serde(rename = "editors", skip_serializing_if = "Option::is_none")] + pub editors: Option, + #[serde(rename = "monthlyActiveUsers", skip_serializing_if = "Option::is_none")] + pub monthly_active_users: Option, + #[serde(rename = "orgs", skip_serializing_if = "Option::is_none")] + pub orgs: Option, + #[serde(rename = "playlists", skip_serializing_if = "Option::is_none")] + pub playlists: Option, + #[serde(rename = "snapshots", skip_serializing_if = "Option::is_none")] + pub snapshots: Option, + #[serde(rename = "stars", skip_serializing_if = "Option::is_none")] + pub stars: Option, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option, + #[serde(rename = "users", skip_serializing_if = "Option::is_none")] + pub users: Option, + #[serde(rename = "viewers", skip_serializing_if = "Option::is_none")] + pub viewers: Option, +} + +impl AdminStats { + pub fn new() -> AdminStats { + AdminStats { + active_admins: None, + active_devices: None, + active_editors: None, + active_sessions: None, + active_users: None, + active_viewers: None, + admins: None, + alerts: None, + daily_active_admins: None, + daily_active_editors: None, + daily_active_sessions: None, + daily_active_users: None, + daily_active_viewers: None, + dashboards: None, + datasources: None, + editors: None, + monthly_active_users: None, + orgs: None, + playlists: None, + snapshots: None, + stars: None, + tags: None, + users: None, + viewers: None, + } + } +} + diff --git a/openapi/src/models/admin_update_user_password_form.rs b/openapi/src/models/admin_update_user_password_form.rs new file mode 100755 index 00000000..f9398310 --- /dev/null +++ b/openapi/src/models/admin_update_user_password_form.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AdminUpdateUserPasswordForm { + #[serde(rename = "password", skip_serializing_if = "Option::is_none")] + pub password: Option, +} + +impl AdminUpdateUserPasswordForm { + pub fn new() -> AdminUpdateUserPasswordForm { + AdminUpdateUserPasswordForm { + password: None, + } + } +} + diff --git a/openapi/src/models/admin_update_user_permissions_form.rs b/openapi/src/models/admin_update_user_permissions_form.rs new file mode 100755 index 00000000..41185c23 --- /dev/null +++ b/openapi/src/models/admin_update_user_permissions_form.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AdminUpdateUserPermissionsForm { + #[serde(rename = "isGrafanaAdmin", skip_serializing_if = "Option::is_none")] + pub is_grafana_admin: Option, +} + +impl AdminUpdateUserPermissionsForm { + pub fn new() -> AdminUpdateUserPermissionsForm { + AdminUpdateUserPermissionsForm { + is_grafana_admin: None, + } + } +} + diff --git a/openapi/src/models/alert.rs b/openapi/src/models/alert.rs new file mode 100755 index 00000000..fe0b0fbc --- /dev/null +++ b/openapi/src/models/alert.rs @@ -0,0 +1,33 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Alert : Alert alert +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Alert { + /// generator URL Format: uri + #[serde(rename = "generatorURL", skip_serializing_if = "Option::is_none")] + pub generator_url: Option, + /// LabelSet label set + #[serde(rename = "labels")] + pub labels: std::collections::HashMap, +} + +impl Alert { + /// Alert alert + pub fn new(labels: std::collections::HashMap) -> Alert { + Alert { + generator_url: None, + labels, + } + } +} + diff --git a/openapi/src/models/alert_discovery.rs b/openapi/src/models/alert_discovery.rs new file mode 100755 index 00000000..de3b4867 --- /dev/null +++ b/openapi/src/models/alert_discovery.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertDiscovery { + #[serde(rename = "alerts")] + pub alerts: Vec, +} + +impl AlertDiscovery { + pub fn new(alerts: Vec) -> AlertDiscovery { + AlertDiscovery { + alerts, + } + } +} + diff --git a/openapi/src/models/alert_group.rs b/openapi/src/models/alert_group.rs new file mode 100755 index 00000000..f933ffd8 --- /dev/null +++ b/openapi/src/models/alert_group.rs @@ -0,0 +1,36 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AlertGroup : AlertGroup alert group +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertGroup { + /// alerts + #[serde(rename = "alerts")] + pub alerts: Vec, + /// LabelSet label set + #[serde(rename = "labels")] + pub labels: std::collections::HashMap, + #[serde(rename = "receiver")] + pub receiver: Box, +} + +impl AlertGroup { + /// AlertGroup alert group + pub fn new(alerts: Vec, labels: std::collections::HashMap, receiver: models::Receiver) -> AlertGroup { + AlertGroup { + alerts, + labels, + receiver: Box::new(receiver), + } + } +} + diff --git a/openapi/src/models/alert_instances_response.rs b/openapi/src/models/alert_instances_response.rs new file mode 100755 index 00000000..bb740900 --- /dev/null +++ b/openapi/src/models/alert_instances_response.rs @@ -0,0 +1,27 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertInstancesResponse { + /// Instances is an array of arrow encoded dataframes each frame has a single row, and a column for each instance (alert identified by unique labels) with a boolean value (firing/not firing) + #[serde(rename = "instances", skip_serializing_if = "Option::is_none")] + pub instances: Option>>, +} + +impl AlertInstancesResponse { + pub fn new() -> AlertInstancesResponse { + AlertInstancesResponse { + instances: None, + } + } +} + diff --git a/openapi/src/models/alert_manager.rs b/openapi/src/models/alert_manager.rs new file mode 100755 index 00000000..7d87f811 --- /dev/null +++ b/openapi/src/models/alert_manager.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertManager { + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl AlertManager { + pub fn new() -> AlertManager { + AlertManager { + url: None, + } + } +} + diff --git a/openapi/src/models/alert_managers_result.rs b/openapi/src/models/alert_managers_result.rs new file mode 100755 index 00000000..49b48d8a --- /dev/null +++ b/openapi/src/models/alert_managers_result.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertManagersResult { + #[serde(rename = "activeAlertManagers", skip_serializing_if = "Option::is_none")] + pub active_alert_managers: Option>, + #[serde(rename = "droppedAlertManagers", skip_serializing_if = "Option::is_none")] + pub dropped_alert_managers: Option>, +} + +impl AlertManagersResult { + pub fn new() -> AlertManagersResult { + AlertManagersResult { + active_alert_managers: None, + dropped_alert_managers: None, + } + } +} + diff --git a/openapi/src/models/alert_query.rs b/openapi/src/models/alert_query.rs new file mode 100755 index 00000000..1469af9c --- /dev/null +++ b/openapi/src/models/alert_query.rs @@ -0,0 +1,42 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertQuery { + /// Grafana data source unique identifier; it should be '__expr__' for a Server Side Expression operation. + #[serde(rename = "datasourceUid", skip_serializing_if = "Option::is_none")] + pub datasource_uid: Option, + /// JSON is the raw JSON query and includes the above properties as well as custom properties. + #[serde(rename = "model", skip_serializing_if = "Option::is_none")] + pub model: Option, + /// QueryType is an optional identifier for the type of query. It can be used to distinguish different types of queries. + #[serde(rename = "queryType", skip_serializing_if = "Option::is_none")] + pub query_type: Option, + /// RefID is the unique identifier of the query, set by the frontend call. + #[serde(rename = "refId", skip_serializing_if = "Option::is_none")] + pub ref_id: Option, + #[serde(rename = "relativeTimeRange", skip_serializing_if = "Option::is_none")] + pub relative_time_range: Option>, +} + +impl AlertQuery { + pub fn new() -> AlertQuery { + AlertQuery { + datasource_uid: None, + model: None, + query_type: None, + ref_id: None, + relative_time_range: None, + } + } +} + diff --git a/openapi/src/models/alert_query_export.rs b/openapi/src/models/alert_query_export.rs new file mode 100755 index 00000000..a03a0804 --- /dev/null +++ b/openapi/src/models/alert_query_export.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertQueryExport { + #[serde(rename = "datasourceUid", skip_serializing_if = "Option::is_none")] + pub datasource_uid: Option, + #[serde(rename = "model", skip_serializing_if = "Option::is_none")] + pub model: Option, + #[serde(rename = "queryType", skip_serializing_if = "Option::is_none")] + pub query_type: Option, + #[serde(rename = "refId", skip_serializing_if = "Option::is_none")] + pub ref_id: Option, + #[serde(rename = "relativeTimeRange", skip_serializing_if = "Option::is_none")] + pub relative_time_range: Option>, +} + +impl AlertQueryExport { + pub fn new() -> AlertQueryExport { + AlertQueryExport { + datasource_uid: None, + model: None, + query_type: None, + ref_id: None, + relative_time_range: None, + } + } +} + diff --git a/openapi/src/models/alert_response.rs b/openapi/src/models/alert_response.rs new file mode 100755 index 00000000..2fa2bb4b --- /dev/null +++ b/openapi/src/models/alert_response.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertResponse { + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "error", skip_serializing_if = "Option::is_none")] + pub error: Option, + #[serde(rename = "errorType", skip_serializing_if = "Option::is_none")] + pub error_type: Option, + #[serde(rename = "status")] + pub status: String, +} + +impl AlertResponse { + pub fn new(status: String) -> AlertResponse { + AlertResponse { + data: None, + error: None, + error_type: None, + status, + } + } +} + diff --git a/openapi/src/models/alert_rule_export.rs b/openapi/src/models/alert_rule_export.rs new file mode 100755 index 00000000..2136f54c --- /dev/null +++ b/openapi/src/models/alert_rule_export.rs @@ -0,0 +1,95 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertRuleExport { + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + #[serde(rename = "condition", skip_serializing_if = "Option::is_none")] + pub condition: Option, + #[serde(rename = "dasboardUid", skip_serializing_if = "Option::is_none")] + pub dasboard_uid: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "execErrState", skip_serializing_if = "Option::is_none")] + pub exec_err_state: Option, + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "for", skip_serializing_if = "Option::is_none")] + pub r#for: Option, + #[serde(rename = "isPaused", skip_serializing_if = "Option::is_none")] + pub is_paused: Option, + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "noDataState", skip_serializing_if = "Option::is_none")] + pub no_data_state: Option, + #[serde(rename = "notification_settings", skip_serializing_if = "Option::is_none")] + pub notification_settings: Option>, + #[serde(rename = "panelId", skip_serializing_if = "Option::is_none")] + pub panel_id: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl AlertRuleExport { + pub fn new() -> AlertRuleExport { + AlertRuleExport { + annotations: None, + condition: None, + dasboard_uid: None, + data: None, + exec_err_state: None, + r#for: None, + is_paused: None, + labels: None, + no_data_state: None, + notification_settings: None, + panel_id: None, + title: None, + uid: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum ExecErrState { + #[serde(rename = "OK")] + Ok, + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "Error")] + Error, +} + +impl Default for ExecErrState { + fn default() -> ExecErrState { + Self::Ok + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum NoDataState { + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "NoData")] + NoData, + #[serde(rename = "OK")] + Ok, +} + +impl Default for NoDataState { + fn default() -> NoDataState { + Self::Alerting + } +} + diff --git a/openapi/src/models/alert_rule_group.rs b/openapi/src/models/alert_rule_group.rs new file mode 100755 index 00000000..0219a9f0 --- /dev/null +++ b/openapi/src/models/alert_rule_group.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertRuleGroup { + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "rules", skip_serializing_if = "Option::is_none")] + pub rules: Option>, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, +} + +impl AlertRuleGroup { + pub fn new() -> AlertRuleGroup { + AlertRuleGroup { + folder_uid: None, + interval: None, + rules: None, + title: None, + } + } +} + diff --git a/openapi/src/models/alert_rule_group_export.rs b/openapi/src/models/alert_rule_group_export.rs new file mode 100755 index 00000000..34615be5 --- /dev/null +++ b/openapi/src/models/alert_rule_group_export.rs @@ -0,0 +1,39 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertRuleGroupExport { + #[serde(rename = "folder", skip_serializing_if = "Option::is_none")] + pub folder: Option, + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "rules", skip_serializing_if = "Option::is_none")] + pub rules: Option>, +} + +impl AlertRuleGroupExport { + pub fn new() -> AlertRuleGroupExport { + AlertRuleGroupExport { + folder: None, + interval: None, + name: None, + org_id: None, + rules: None, + } + } +} + diff --git a/openapi/src/models/alert_rule_group_metadata.rs b/openapi/src/models/alert_rule_group_metadata.rs new file mode 100755 index 00000000..e5ca4445 --- /dev/null +++ b/openapi/src/models/alert_rule_group_metadata.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertRuleGroupMetadata { + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, +} + +impl AlertRuleGroupMetadata { + pub fn new() -> AlertRuleGroupMetadata { + AlertRuleGroupMetadata { + interval: None, + } + } +} + diff --git a/openapi/src/models/alert_rule_notification_settings.rs b/openapi/src/models/alert_rule_notification_settings.rs new file mode 100755 index 00000000..1fc5b3e0 --- /dev/null +++ b/openapi/src/models/alert_rule_notification_settings.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertRuleNotificationSettings { + /// Override the labels by which incoming alerts are grouped together. For example, multiple alerts coming in for cluster=A and alertname=LatencyHigh would be batched into a single group. To aggregate by all possible labels use the special value '...' as the sole label name. This effectively disables aggregation entirely, passing through all alerts as-is. This is unlikely to be what you want, unless you have a very low alert volume or your upstream notification system performs its own grouping. Must include 'alertname' and 'grafana_folder' if not using '...'. + #[serde(rename = "group_by", skip_serializing_if = "Option::is_none")] + pub group_by: Option>, + /// Override how long to wait before sending a notification about new alerts that are added to a group of alerts for which an initial notification has already been sent. (Usually ~5m or more.) + #[serde(rename = "group_interval", skip_serializing_if = "Option::is_none")] + pub group_interval: Option, + /// Override how long to initially wait to send a notification for a group of alerts. Allows to wait for an inhibiting alert to arrive or collect more initial alerts for the same group. (Usually ~0s to few minutes.) + #[serde(rename = "group_wait", skip_serializing_if = "Option::is_none")] + pub group_wait: Option, + /// Override the times when notifications should be muted. These must match the name of a mute time interval defined in the alertmanager configuration mute_time_intervals section. When muted it will not send any notifications, but otherwise acts normally. + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + /// Name of the receiver to send notifications to. + #[serde(rename = "receiver")] + pub receiver: String, + /// Override how long to wait before sending a notification again if it has already been sent successfully for an alert. (Usually ~3h or more). Note that this parameter is implicitly bound by Alertmanager's `--data.retention` configuration flag. Notifications will be resent after either repeat_interval or the data retention period have passed, whichever occurs first. `repeat_interval` should not be less than `group_interval`. + #[serde(rename = "repeat_interval", skip_serializing_if = "Option::is_none")] + pub repeat_interval: Option, +} + +impl AlertRuleNotificationSettings { + pub fn new(receiver: String) -> AlertRuleNotificationSettings { + AlertRuleNotificationSettings { + group_by: None, + group_interval: None, + group_wait: None, + mute_time_intervals: None, + receiver, + repeat_interval: None, + } + } +} + diff --git a/openapi/src/models/alert_rule_notification_settings_export.rs b/openapi/src/models/alert_rule_notification_settings_export.rs new file mode 100755 index 00000000..fc808ad1 --- /dev/null +++ b/openapi/src/models/alert_rule_notification_settings_export.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertRuleNotificationSettingsExport { + #[serde(rename = "group_by", skip_serializing_if = "Option::is_none")] + pub group_by: Option>, + #[serde(rename = "group_interval", skip_serializing_if = "Option::is_none")] + pub group_interval: Option, + #[serde(rename = "group_wait", skip_serializing_if = "Option::is_none")] + pub group_wait: Option, + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + #[serde(rename = "receiver", skip_serializing_if = "Option::is_none")] + pub receiver: Option, + #[serde(rename = "repeat_interval", skip_serializing_if = "Option::is_none")] + pub repeat_interval: Option, +} + +impl AlertRuleNotificationSettingsExport { + pub fn new() -> AlertRuleNotificationSettingsExport { + AlertRuleNotificationSettingsExport { + group_by: None, + group_interval: None, + group_wait: None, + mute_time_intervals: None, + receiver: None, + repeat_interval: None, + } + } +} + diff --git a/openapi/src/models/alert_status.rs b/openapi/src/models/alert_status.rs new file mode 100755 index 00000000..00278738 --- /dev/null +++ b/openapi/src/models/alert_status.rs @@ -0,0 +1,49 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AlertStatus : AlertStatus alert status +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertStatus { + /// inhibited by + #[serde(rename = "inhibitedBy")] + pub inhibited_by: Vec, + /// silenced by + #[serde(rename = "silencedBy")] + pub silenced_by: Vec, + /// state + #[serde(rename = "state")] + pub state: State, +} + +impl AlertStatus { + /// AlertStatus alert status + pub fn new(inhibited_by: Vec, silenced_by: Vec, state: State) -> AlertStatus { + AlertStatus { + inhibited_by, + silenced_by, + state, + } + } +} +/// state +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum State { + #[serde(rename = "[unprocessed active suppressed]")] + LeftSquareBracketUnprocessedActiveSuppressedRightSquareBracket, +} + +impl Default for State { + fn default() -> State { + Self::LeftSquareBracketUnprocessedActiveSuppressedRightSquareBracket + } +} + diff --git a/openapi/src/models/alerting_file_export.rs b/openapi/src/models/alerting_file_export.rs new file mode 100755 index 00000000..69b5ab1c --- /dev/null +++ b/openapi/src/models/alerting_file_export.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertingFileExport { + #[serde(rename = "apiVersion", skip_serializing_if = "Option::is_none")] + pub api_version: Option, + #[serde(rename = "contactPoints", skip_serializing_if = "Option::is_none")] + pub contact_points: Option>, + #[serde(rename = "groups", skip_serializing_if = "Option::is_none")] + pub groups: Option>, + #[serde(rename = "muteTimes", skip_serializing_if = "Option::is_none")] + pub mute_times: Option>, + #[serde(rename = "policies", skip_serializing_if = "Option::is_none")] + pub policies: Option>, +} + +impl AlertingFileExport { + pub fn new() -> AlertingFileExport { + AlertingFileExport { + api_version: None, + contact_points: None, + groups: None, + mute_times: None, + policies: None, + } + } +} + diff --git a/openapi/src/models/alerting_rule.rs b/openapi/src/models/alerting_rule.rs new file mode 100755 index 00000000..14b89fc6 --- /dev/null +++ b/openapi/src/models/alerting_rule.rs @@ -0,0 +1,73 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AlertingRule : adapted from cortex +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertingRule { + #[serde(rename = "activeAt")] + pub active_at: String, + #[serde(rename = "alerts", skip_serializing_if = "Option::is_none")] + pub alerts: Option>, + /// The custom marshaling for labels.Labels ends up doing this anyways. + #[serde(rename = "annotations")] + pub annotations: std::collections::HashMap, + #[serde(rename = "duration", skip_serializing_if = "Option::is_none")] + pub duration: Option, + #[serde(rename = "evaluationTime", skip_serializing_if = "Option::is_none")] + pub evaluation_time: Option, + #[serde(rename = "health")] + pub health: String, + /// The custom marshaling for labels.Labels ends up doing this anyways. + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "lastError", skip_serializing_if = "Option::is_none")] + pub last_error: Option, + #[serde(rename = "lastEvaluation", skip_serializing_if = "Option::is_none")] + pub last_evaluation: Option, + #[serde(rename = "name")] + pub name: String, + #[serde(rename = "query")] + pub query: String, + /// State can be \"pending\", \"firing\", \"inactive\". + #[serde(rename = "state")] + pub state: String, + #[serde(rename = "totals", skip_serializing_if = "Option::is_none")] + pub totals: Option>, + #[serde(rename = "totalsFiltered", skip_serializing_if = "Option::is_none")] + pub totals_filtered: Option>, + #[serde(rename = "type")] + pub r#type: String, +} + +impl AlertingRule { + /// adapted from cortex + pub fn new(active_at: String, annotations: std::collections::HashMap, health: String, name: String, query: String, state: String, r#type: String) -> AlertingRule { + AlertingRule { + active_at, + alerts: None, + annotations, + duration: None, + evaluation_time: None, + health, + labels: None, + last_error: None, + last_evaluation: None, + name, + query, + state, + totals: None, + totals_filtered: None, + r#type, + } + } +} + diff --git a/openapi/src/models/alerting_status.rs b/openapi/src/models/alerting_status.rs new file mode 100755 index 00000000..dfeb5abf --- /dev/null +++ b/openapi/src/models/alerting_status.rs @@ -0,0 +1,45 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertingStatus { + #[serde(rename = "alertmanagersChoice", skip_serializing_if = "Option::is_none")] + pub alertmanagers_choice: Option, + #[serde(rename = "numExternalAlertmanagers", skip_serializing_if = "Option::is_none")] + pub num_external_alertmanagers: Option, +} + +impl AlertingStatus { + pub fn new() -> AlertingStatus { + AlertingStatus { + alertmanagers_choice: None, + num_external_alertmanagers: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum AlertmanagersChoice { + #[serde(rename = "all")] + All, + #[serde(rename = "internal")] + Internal, + #[serde(rename = "external")] + External, +} + +impl Default for AlertmanagersChoice { + fn default() -> AlertmanagersChoice { + Self::All + } +} + diff --git a/openapi/src/models/alertmanager_config.rs b/openapi/src/models/alertmanager_config.rs new file mode 100755 index 00000000..ad7d3612 --- /dev/null +++ b/openapi/src/models/alertmanager_config.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AlertmanagerConfig : AlertmanagerConfig alertmanager config +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertmanagerConfig { + /// original + #[serde(rename = "original")] + pub original: String, +} + +impl AlertmanagerConfig { + /// AlertmanagerConfig alertmanager config + pub fn new(original: String) -> AlertmanagerConfig { + AlertmanagerConfig { + original, + } + } +} + diff --git a/openapi/src/models/alertmanager_status.rs b/openapi/src/models/alertmanager_status.rs new file mode 100755 index 00000000..96a20e68 --- /dev/null +++ b/openapi/src/models/alertmanager_status.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AlertmanagerStatus : AlertmanagerStatus alertmanager status +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AlertmanagerStatus { + #[serde(rename = "cluster")] + pub cluster: Box, + #[serde(rename = "config")] + pub config: Box, + /// uptime + #[serde(rename = "uptime")] + pub uptime: String, + #[serde(rename = "versionInfo")] + pub version_info: Box, +} + +impl AlertmanagerStatus { + /// AlertmanagerStatus alertmanager status + pub fn new(cluster: models::ClusterStatus, config: models::AlertmanagerConfig, uptime: String, version_info: models::VersionInfo) -> AlertmanagerStatus { + AlertmanagerStatus { + cluster: Box::new(cluster), + config: Box::new(config), + uptime, + version_info: Box::new(version_info), + } + } +} + diff --git a/openapi/src/models/annotation.rs b/openapi/src/models/annotation.rs new file mode 100755 index 00000000..6d0abcf4 --- /dev/null +++ b/openapi/src/models/annotation.rs @@ -0,0 +1,80 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Annotation { + #[serde(rename = "alertId", skip_serializing_if = "Option::is_none")] + pub alert_id: Option, + #[serde(rename = "alertName", skip_serializing_if = "Option::is_none")] + pub alert_name: Option, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + #[serde(rename = "dashboardUID", skip_serializing_if = "Option::is_none")] + pub dashboard_uid: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option, + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "newState", skip_serializing_if = "Option::is_none")] + pub new_state: Option, + #[serde(rename = "panelId", skip_serializing_if = "Option::is_none")] + pub panel_id: Option, + #[serde(rename = "prevState", skip_serializing_if = "Option::is_none")] + pub prev_state: Option, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "time", skip_serializing_if = "Option::is_none")] + pub time: Option, + #[serde(rename = "timeEnd", skip_serializing_if = "Option::is_none")] + pub time_end: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl Annotation { + pub fn new() -> Annotation { + Annotation { + alert_id: None, + alert_name: None, + avatar_url: None, + created: None, + dashboard_id: None, + dashboard_uid: None, + data: None, + email: None, + id: None, + login: None, + new_state: None, + panel_id: None, + prev_state: None, + tags: None, + text: None, + time: None, + time_end: None, + updated: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/annotation_actions.rs b/openapi/src/models/annotation_actions.rs new file mode 100755 index 00000000..b4b687c1 --- /dev/null +++ b/openapi/src/models/annotation_actions.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AnnotationActions { + #[serde(rename = "canAdd", skip_serializing_if = "Option::is_none")] + pub can_add: Option, + #[serde(rename = "canDelete", skip_serializing_if = "Option::is_none")] + pub can_delete: Option, + #[serde(rename = "canEdit", skip_serializing_if = "Option::is_none")] + pub can_edit: Option, +} + +impl AnnotationActions { + pub fn new() -> AnnotationActions { + AnnotationActions { + can_add: None, + can_delete: None, + can_edit: None, + } + } +} + diff --git a/openapi/src/models/annotation_event.rs b/openapi/src/models/annotation_event.rs new file mode 100755 index 00000000..86bce1ac --- /dev/null +++ b/openapi/src/models/annotation_event.rs @@ -0,0 +1,53 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AnnotationEvent { + #[serde(rename = "color", skip_serializing_if = "Option::is_none")] + pub color: Option, + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isRegion", skip_serializing_if = "Option::is_none")] + pub is_region: Option, + #[serde(rename = "panelId", skip_serializing_if = "Option::is_none")] + pub panel_id: Option, + #[serde(rename = "source", skip_serializing_if = "Option::is_none")] + pub source: Option>, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "time", skip_serializing_if = "Option::is_none")] + pub time: Option, + #[serde(rename = "timeEnd", skip_serializing_if = "Option::is_none")] + pub time_end: Option, +} + +impl AnnotationEvent { + pub fn new() -> AnnotationEvent { + AnnotationEvent { + color: None, + dashboard_id: None, + id: None, + is_region: None, + panel_id: None, + source: None, + tags: None, + text: None, + time: None, + time_end: None, + } + } +} + diff --git a/openapi/src/models/annotation_panel_filter.rs b/openapi/src/models/annotation_panel_filter.rs new file mode 100755 index 00000000..adff157d --- /dev/null +++ b/openapi/src/models/annotation_panel_filter.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AnnotationPanelFilter { + /// Should the specified panels be included or excluded + #[serde(rename = "exclude", skip_serializing_if = "Option::is_none")] + pub exclude: Option, + /// Panel IDs that should be included or excluded + #[serde(rename = "ids", skip_serializing_if = "Option::is_none")] + pub ids: Option>, +} + +impl AnnotationPanelFilter { + pub fn new() -> AnnotationPanelFilter { + AnnotationPanelFilter { + exclude: None, + ids: None, + } + } +} + diff --git a/openapi/src/models/annotation_permission.rs b/openapi/src/models/annotation_permission.rs new file mode 100755 index 00000000..98b093c4 --- /dev/null +++ b/openapi/src/models/annotation_permission.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AnnotationPermission { + #[serde(rename = "dashboard", skip_serializing_if = "Option::is_none")] + pub dashboard: Option>, + #[serde(rename = "organization", skip_serializing_if = "Option::is_none")] + pub organization: Option>, +} + +impl AnnotationPermission { + pub fn new() -> AnnotationPermission { + AnnotationPermission { + dashboard: None, + organization: None, + } + } +} + diff --git a/openapi/src/models/annotation_query.rs b/openapi/src/models/annotation_query.rs new file mode 100755 index 00000000..1be84957 --- /dev/null +++ b/openapi/src/models/annotation_query.rs @@ -0,0 +1,58 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AnnotationQuery : TODO docs FROM: AnnotationQuery in grafana-data/src/types/annotations.ts +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AnnotationQuery { + /// Set to 1 for the standard annotation query all dashboards have by default. + #[serde(rename = "builtIn", skip_serializing_if = "Option::is_none")] + pub built_in: Option, + #[serde(rename = "datasource", skip_serializing_if = "Option::is_none")] + pub datasource: Option>, + /// When enabled the annotation query is issued with every dashboard refresh + #[serde(rename = "enable", skip_serializing_if = "Option::is_none")] + pub enable: Option, + #[serde(rename = "filter", skip_serializing_if = "Option::is_none")] + pub filter: Option>, + /// Annotation queries can be toggled on or off at the top of the dashboard. When hide is true, the toggle is not shown in the dashboard. + #[serde(rename = "hide", skip_serializing_if = "Option::is_none")] + pub hide: Option, + /// Color to use for the annotation event markers + #[serde(rename = "iconColor", skip_serializing_if = "Option::is_none")] + pub icon_color: Option, + /// Name of annotation. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "target", skip_serializing_if = "Option::is_none")] + pub target: Option>, + /// TODO -- this should not exist here, it is based on the --grafana-- datasource + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, +} + +impl AnnotationQuery { + /// TODO docs FROM: AnnotationQuery in grafana-data/src/types/annotations.ts + pub fn new() -> AnnotationQuery { + AnnotationQuery { + built_in: None, + datasource: None, + enable: None, + filter: None, + hide: None, + icon_color: None, + name: None, + target: None, + r#type: None, + } + } +} + diff --git a/openapi/src/models/annotation_target.rs b/openapi/src/models/annotation_target.rs new file mode 100755 index 00000000..8ddabdf9 --- /dev/null +++ b/openapi/src/models/annotation_target.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AnnotationTarget : TODO: this should be a regular DataQuery that depends on the selected dashboard these match the properties of the \"grafana\" datasouce that is default in most dashboards +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AnnotationTarget { + /// Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change + #[serde(rename = "limit", skip_serializing_if = "Option::is_none")] + pub limit: Option, + /// Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change + #[serde(rename = "matchAny", skip_serializing_if = "Option::is_none")] + pub match_any: Option, + /// Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + /// Only required/valid for the grafana datasource... but code+tests is already depending on it so hard to change + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, +} + +impl AnnotationTarget { + /// TODO: this should be a regular DataQuery that depends on the selected dashboard these match the properties of the \"grafana\" datasouce that is default in most dashboards + pub fn new() -> AnnotationTarget { + AnnotationTarget { + limit: None, + match_any: None, + tags: None, + r#type: None, + } + } +} + diff --git a/openapi/src/models/api_key_dto.rs b/openapi/src/models/api_key_dto.rs new file mode 100755 index 00000000..17bf73ef --- /dev/null +++ b/openapi/src/models/api_key_dto.rs @@ -0,0 +1,60 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ApiKeyDto { + /// Metadata contains user accesses for a given resource Ex: map[string]bool{\"create\":true, \"delete\": true} + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "expiration", skip_serializing_if = "Option::is_none")] + pub expiration: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "lastUsedAt", skip_serializing_if = "Option::is_none")] + pub last_used_at: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, +} + +impl ApiKeyDto { + pub fn new() -> ApiKeyDto { + ApiKeyDto { + access_control: None, + expiration: None, + id: None, + last_used_at: None, + name: None, + role: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/api_rule_node.rs b/openapi/src/models/api_rule_node.rs new file mode 100755 index 00000000..70803bd2 --- /dev/null +++ b/openapi/src/models/api_rule_node.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ApiRuleNode { + #[serde(rename = "alert", skip_serializing_if = "Option::is_none")] + pub alert: Option, + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + #[serde(rename = "expr", skip_serializing_if = "Option::is_none")] + pub expr: Option, + #[serde(rename = "for", skip_serializing_if = "Option::is_none")] + pub r#for: Option, + #[serde(rename = "keep_firing_for", skip_serializing_if = "Option::is_none")] + pub keep_firing_for: Option, + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "record", skip_serializing_if = "Option::is_none")] + pub record: Option, +} + +impl ApiRuleNode { + pub fn new() -> ApiRuleNode { + ApiRuleNode { + alert: None, + annotations: None, + expr: None, + r#for: None, + keep_firing_for: None, + labels: None, + record: None, + } + } +} + diff --git a/openapi/src/models/assignments.rs b/openapi/src/models/assignments.rs new file mode 100755 index 00000000..461b1d9a --- /dev/null +++ b/openapi/src/models/assignments.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Assignments { + #[serde(rename = "builtInRoles", skip_serializing_if = "Option::is_none")] + pub built_in_roles: Option, + #[serde(rename = "serviceAccounts", skip_serializing_if = "Option::is_none")] + pub service_accounts: Option, + #[serde(rename = "teams", skip_serializing_if = "Option::is_none")] + pub teams: Option, + #[serde(rename = "users", skip_serializing_if = "Option::is_none")] + pub users: Option, +} + +impl Assignments { + pub fn new() -> Assignments { + Assignments { + built_in_roles: None, + service_accounts: None, + teams: None, + users: None, + } + } +} + diff --git a/openapi/src/models/attribute_type_and_value.rs b/openapi/src/models/attribute_type_and_value.rs new file mode 100755 index 00000000..c0a92b0e --- /dev/null +++ b/openapi/src/models/attribute_type_and_value.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// AttributeTypeAndValue : AttributeTypeAndValue mirrors the ASN.1 structure of the same name in RFC 5280, Section 4.1.2.4. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct AttributeTypeAndValue { + #[serde(rename = "Type", skip_serializing_if = "Option::is_none")] + pub r#type: Option>, + #[serde(rename = "Value", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")] + pub value: Option>, +} + +impl AttributeTypeAndValue { + /// AttributeTypeAndValue mirrors the ASN.1 structure of the same name in RFC 5280, Section 4.1.2.4. + pub fn new() -> AttributeTypeAndValue { + AttributeTypeAndValue { + r#type: None, + value: None, + } + } +} + diff --git a/openapi/src/models/authorization.rs b/openapi/src/models/authorization.rs new file mode 100755 index 00000000..c68c0152 --- /dev/null +++ b/openapi/src/models/authorization.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Authorization { + #[serde(rename = "credentials", skip_serializing_if = "Option::is_none")] + pub credentials: Option, + #[serde(rename = "credentials_file", skip_serializing_if = "Option::is_none")] + pub credentials_file: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, +} + +impl Authorization { + pub fn new() -> Authorization { + Authorization { + credentials: None, + credentials_file: None, + r#type: None, + } + } +} + diff --git a/openapi/src/models/backtest_config.rs b/openapi/src/models/backtest_config.rs new file mode 100755 index 00000000..6416b6de --- /dev/null +++ b/openapi/src/models/backtest_config.rs @@ -0,0 +1,71 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct BacktestConfig { + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + #[serde(rename = "condition", skip_serializing_if = "Option::is_none")] + pub condition: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "for", skip_serializing_if = "Option::is_none")] + pub r#for: Option, + #[serde(rename = "from", skip_serializing_if = "Option::is_none")] + pub from: Option, + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "no_data_state", skip_serializing_if = "Option::is_none")] + pub no_data_state: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "to", skip_serializing_if = "Option::is_none")] + pub to: Option, +} + +impl BacktestConfig { + pub fn new() -> BacktestConfig { + BacktestConfig { + annotations: None, + condition: None, + data: None, + r#for: None, + from: None, + interval: None, + labels: None, + no_data_state: None, + title: None, + to: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum NoDataState { + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "NoData")] + NoData, + #[serde(rename = "OK")] + Ok, +} + +impl Default for NoDataState { + fn default() -> NoDataState { + Self::Alerting + } +} + diff --git a/openapi/src/models/basic_auth.rs b/openapi/src/models/basic_auth.rs new file mode 100755 index 00000000..3cfcb5ff --- /dev/null +++ b/openapi/src/models/basic_auth.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct BasicAuth { + #[serde(rename = "password", skip_serializing_if = "Option::is_none")] + pub password: Option, + #[serde(rename = "password_file", skip_serializing_if = "Option::is_none")] + pub password_file: Option, + #[serde(rename = "username", skip_serializing_if = "Option::is_none")] + pub username: Option, + #[serde(rename = "username_file", skip_serializing_if = "Option::is_none")] + pub username_file: Option, +} + +impl BasicAuth { + pub fn new() -> BasicAuth { + BasicAuth { + password: None, + password_file: None, + username: None, + username_file: None, + } + } +} + diff --git a/openapi/src/models/calculate_dashboard_diff_request.rs b/openapi/src/models/calculate_dashboard_diff_request.rs new file mode 100755 index 00000000..9a729595 --- /dev/null +++ b/openapi/src/models/calculate_dashboard_diff_request.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CalculateDashboardDiffRequest { + #[serde(rename = "base", skip_serializing_if = "Option::is_none")] + pub base: Option>, + /// The type of diff to return Description: `basic` `json` + #[serde(rename = "diffType", skip_serializing_if = "Option::is_none")] + pub diff_type: Option, + #[serde(rename = "new", skip_serializing_if = "Option::is_none")] + pub new: Option>, +} + +impl CalculateDashboardDiffRequest { + pub fn new() -> CalculateDashboardDiffRequest { + CalculateDashboardDiffRequest { + base: None, + diff_type: None, + new: None, + } + } +} +/// The type of diff to return Description: `basic` `json` +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum DiffType { + #[serde(rename = "basic")] + Basic, + #[serde(rename = "json")] + Json, +} + +impl Default for DiffType { + fn default() -> DiffType { + Self::Basic + } +} + diff --git a/openapi/src/models/calculate_diff_target.rs b/openapi/src/models/calculate_diff_target.rs new file mode 100755 index 00000000..676e1475 --- /dev/null +++ b/openapi/src/models/calculate_diff_target.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CalculateDiffTarget { + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + #[serde(rename = "unsavedDashboard", skip_serializing_if = "Option::is_none")] + pub unsaved_dashboard: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl CalculateDiffTarget { + pub fn new() -> CalculateDiffTarget { + CalculateDiffTarget { + dashboard_id: None, + unsaved_dashboard: None, + version: None, + } + } +} + diff --git a/openapi/src/models/certificate.rs b/openapi/src/models/certificate.rs new file mode 100755 index 00000000..9412f3ab --- /dev/null +++ b/openapi/src/models/certificate.rs @@ -0,0 +1,163 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Certificate { + #[serde(rename = "AuthorityKeyId", skip_serializing_if = "Option::is_none")] + pub authority_key_id: Option>, + /// BasicConstraintsValid indicates whether IsCA, MaxPathLen, and MaxPathLenZero are valid. + #[serde(rename = "BasicConstraintsValid", skip_serializing_if = "Option::is_none")] + pub basic_constraints_valid: Option, + /// CRL Distribution Points + #[serde(rename = "CRLDistributionPoints", skip_serializing_if = "Option::is_none")] + pub crl_distribution_points: Option>, + /// Subject Alternate Name values. (Note that these values may not be valid if invalid values were contained within a parsed certificate. For example, an element of DNSNames may not be a valid DNS domain name.) + #[serde(rename = "DNSNames", skip_serializing_if = "Option::is_none")] + pub dns_names: Option>, + #[serde(rename = "EmailAddresses", skip_serializing_if = "Option::is_none")] + pub email_addresses: Option>, + #[serde(rename = "ExcludedDNSDomains", skip_serializing_if = "Option::is_none")] + pub excluded_dns_domains: Option>, + #[serde(rename = "ExcludedEmailAddresses", skip_serializing_if = "Option::is_none")] + pub excluded_email_addresses: Option>, + #[serde(rename = "ExcludedIPRanges", skip_serializing_if = "Option::is_none")] + pub excluded_ip_ranges: Option>, + #[serde(rename = "ExcludedURIDomains", skip_serializing_if = "Option::is_none")] + pub excluded_uri_domains: Option>, + #[serde(rename = "ExtKeyUsage", skip_serializing_if = "Option::is_none")] + pub ext_key_usage: Option>, + /// Extensions contains raw X.509 extensions. When parsing certificates, this can be used to extract non-critical extensions that are not parsed by this package. When marshaling certificates, the Extensions field is ignored, see ExtraExtensions. + #[serde(rename = "Extensions", skip_serializing_if = "Option::is_none")] + pub extensions: Option>, + /// ExtraExtensions contains extensions to be copied, raw, into any marshaled certificates. Values override any extensions that would otherwise be produced based on the other fields. The ExtraExtensions field is not populated when parsing certificates, see Extensions. + #[serde(rename = "ExtraExtensions", skip_serializing_if = "Option::is_none")] + pub extra_extensions: Option>, + #[serde(rename = "IPAddresses", skip_serializing_if = "Option::is_none")] + pub ip_addresses: Option>, + #[serde(rename = "IsCA", skip_serializing_if = "Option::is_none")] + pub is_ca: Option, + #[serde(rename = "Issuer", skip_serializing_if = "Option::is_none")] + pub issuer: Option>, + #[serde(rename = "IssuingCertificateURL", skip_serializing_if = "Option::is_none")] + pub issuing_certificate_url: Option>, + /// KeyUsage represents the set of actions that are valid for a given key. It's a bitmap of the KeyUsage* constants. + #[serde(rename = "KeyUsage", skip_serializing_if = "Option::is_none")] + pub key_usage: Option, + /// MaxPathLen and MaxPathLenZero indicate the presence and value of the BasicConstraints' \"pathLenConstraint\". When parsing a certificate, a positive non-zero MaxPathLen means that the field was specified, -1 means it was unset, and MaxPathLenZero being true mean that the field was explicitly set to zero. The case of MaxPathLen==0 with MaxPathLenZero==false should be treated equivalent to -1 (unset). When generating a certificate, an unset pathLenConstraint can be requested with either MaxPathLen == -1 or using the zero value for both MaxPathLen and MaxPathLenZero. + #[serde(rename = "MaxPathLen", skip_serializing_if = "Option::is_none")] + pub max_path_len: Option, + /// MaxPathLenZero indicates that BasicConstraintsValid==true and MaxPathLen==0 should be interpreted as an actual maximum path length of zero. Otherwise, that combination is interpreted as MaxPathLen not being set. + #[serde(rename = "MaxPathLenZero", skip_serializing_if = "Option::is_none")] + pub max_path_len_zero: Option, + #[serde(rename = "NotBefore", skip_serializing_if = "Option::is_none")] + pub not_before: Option, + /// RFC 5280, 4.2.2.1 (Authority Information Access) + #[serde(rename = "OCSPServer", skip_serializing_if = "Option::is_none")] + pub ocsp_server: Option>, + #[serde(rename = "PermittedDNSDomains", skip_serializing_if = "Option::is_none")] + pub permitted_dns_domains: Option>, + /// Name constraints + #[serde(rename = "PermittedDNSDomainsCritical", skip_serializing_if = "Option::is_none")] + pub permitted_dns_domains_critical: Option, + #[serde(rename = "PermittedEmailAddresses", skip_serializing_if = "Option::is_none")] + pub permitted_email_addresses: Option>, + #[serde(rename = "PermittedIPRanges", skip_serializing_if = "Option::is_none")] + pub permitted_ip_ranges: Option>, + #[serde(rename = "PermittedURIDomains", skip_serializing_if = "Option::is_none")] + pub permitted_uri_domains: Option>, + #[serde(rename = "PolicyIdentifiers", skip_serializing_if = "Option::is_none")] + pub policy_identifiers: Option>>, + #[serde(rename = "PublicKey", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")] + pub public_key: Option>, + #[serde(rename = "PublicKeyAlgorithm", skip_serializing_if = "Option::is_none")] + pub public_key_algorithm: Option, + #[serde(rename = "Raw", skip_serializing_if = "Option::is_none")] + pub raw: Option>, + #[serde(rename = "RawIssuer", skip_serializing_if = "Option::is_none")] + pub raw_issuer: Option>, + #[serde(rename = "RawSubject", skip_serializing_if = "Option::is_none")] + pub raw_subject: Option>, + #[serde(rename = "RawSubjectPublicKeyInfo", skip_serializing_if = "Option::is_none")] + pub raw_subject_public_key_info: Option>, + #[serde(rename = "RawTBSCertificate", skip_serializing_if = "Option::is_none")] + pub raw_tbs_certificate: Option>, + #[serde(rename = "SerialNumber", skip_serializing_if = "Option::is_none")] + pub serial_number: Option, + #[serde(rename = "Signature", skip_serializing_if = "Option::is_none")] + pub signature: Option>, + #[serde(rename = "SignatureAlgorithm", skip_serializing_if = "Option::is_none")] + pub signature_algorithm: Option, + #[serde(rename = "Subject", skip_serializing_if = "Option::is_none")] + pub subject: Option>, + #[serde(rename = "SubjectKeyId", skip_serializing_if = "Option::is_none")] + pub subject_key_id: Option>, + #[serde(rename = "URIs", skip_serializing_if = "Option::is_none")] + pub uris: Option>, + /// UnhandledCriticalExtensions contains a list of extension IDs that were not (fully) processed when parsing. Verify will fail if this slice is non-empty, unless verification is delegated to an OS library which understands all the critical extensions. Users can access these extensions using Extensions and can remove elements from this slice if they believe that they have been handled. + #[serde(rename = "UnhandledCriticalExtensions", skip_serializing_if = "Option::is_none")] + pub unhandled_critical_extensions: Option>>, + #[serde(rename = "UnknownExtKeyUsage", skip_serializing_if = "Option::is_none")] + pub unknown_ext_key_usage: Option>>, + #[serde(rename = "Version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl Certificate { + pub fn new() -> Certificate { + Certificate { + authority_key_id: None, + basic_constraints_valid: None, + crl_distribution_points: None, + dns_names: None, + email_addresses: None, + excluded_dns_domains: None, + excluded_email_addresses: None, + excluded_ip_ranges: None, + excluded_uri_domains: None, + ext_key_usage: None, + extensions: None, + extra_extensions: None, + ip_addresses: None, + is_ca: None, + issuer: None, + issuing_certificate_url: None, + key_usage: None, + max_path_len: None, + max_path_len_zero: None, + not_before: None, + ocsp_server: None, + permitted_dns_domains: None, + permitted_dns_domains_critical: None, + permitted_email_addresses: None, + permitted_ip_ranges: None, + permitted_uri_domains: None, + policy_identifiers: None, + public_key: None, + public_key_algorithm: None, + raw: None, + raw_issuer: None, + raw_subject: None, + raw_subject_public_key_info: None, + raw_tbs_certificate: None, + serial_number: None, + signature: None, + signature_algorithm: None, + subject: None, + subject_key_id: None, + uris: None, + unhandled_critical_extensions: None, + unknown_ext_key_usage: None, + version: None, + } + } +} + diff --git a/openapi/src/models/change_user_password_command.rs b/openapi/src/models/change_user_password_command.rs new file mode 100755 index 00000000..fa9042e5 --- /dev/null +++ b/openapi/src/models/change_user_password_command.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ChangeUserPasswordCommand { + #[serde(rename = "newPassword", skip_serializing_if = "Option::is_none")] + pub new_password: Option, + #[serde(rename = "oldPassword", skip_serializing_if = "Option::is_none")] + pub old_password: Option, +} + +impl ChangeUserPasswordCommand { + pub fn new() -> ChangeUserPasswordCommand { + ChangeUserPasswordCommand { + new_password: None, + old_password: None, + } + } +} + diff --git a/openapi/src/models/clear_help_flags_200_response.rs b/openapi/src/models/clear_help_flags_200_response.rs new file mode 100755 index 00000000..271dbf89 --- /dev/null +++ b/openapi/src/models/clear_help_flags_200_response.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ClearHelpFlags200Response { + #[serde(rename = "helpFlags1", skip_serializing_if = "Option::is_none")] + pub help_flags1: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, +} + +impl ClearHelpFlags200Response { + pub fn new() -> ClearHelpFlags200Response { + ClearHelpFlags200Response { + help_flags1: None, + message: None, + } + } +} + diff --git a/openapi/src/models/cluster_status.rs b/openapi/src/models/cluster_status.rs new file mode 100755 index 00000000..639c0ccb --- /dev/null +++ b/openapi/src/models/cluster_status.rs @@ -0,0 +1,49 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// ClusterStatus : ClusterStatus cluster status +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ClusterStatus { + /// name + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + /// peers + #[serde(rename = "peers", skip_serializing_if = "Option::is_none")] + pub peers: Option>, + /// status + #[serde(rename = "status")] + pub status: Status, +} + +impl ClusterStatus { + /// ClusterStatus cluster status + pub fn new(status: Status) -> ClusterStatus { + ClusterStatus { + name: None, + peers: None, + status, + } + } +} +/// status +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Status { + #[serde(rename = "[ready settling disabled]")] + LeftSquareBracketReadySettlingDisabledRightSquareBracket, +} + +impl Default for Status { + fn default() -> Status { + Self::LeftSquareBracketReadySettlingDisabledRightSquareBracket + } +} + diff --git a/openapi/src/models/config.rs b/openapi/src/models/config.rs new file mode 100755 index 00000000..53382dc1 --- /dev/null +++ b/openapi/src/models/config.rs @@ -0,0 +1,42 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Config { + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option>, + #[serde(rename = "inhibit_rules", skip_serializing_if = "Option::is_none")] + pub inhibit_rules: Option>, + /// MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0. + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + #[serde(rename = "route", skip_serializing_if = "Option::is_none")] + pub route: Option>, + #[serde(rename = "templates", skip_serializing_if = "Option::is_none")] + pub templates: Option>, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl Config { + pub fn new() -> Config { + Config { + global: None, + inhibit_rules: None, + mute_time_intervals: None, + route: None, + templates: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/contact_point_export.rs b/openapi/src/models/contact_point_export.rs new file mode 100755 index 00000000..cbb0e97a --- /dev/null +++ b/openapi/src/models/contact_point_export.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ContactPointExport { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "receivers", skip_serializing_if = "Option::is_none")] + pub receivers: Option>, +} + +impl ContactPointExport { + pub fn new() -> ContactPointExport { + ContactPointExport { + name: None, + org_id: None, + receivers: None, + } + } +} + diff --git a/openapi/src/models/cookie_preferences.rs b/openapi/src/models/cookie_preferences.rs new file mode 100755 index 00000000..e21abba2 --- /dev/null +++ b/openapi/src/models/cookie_preferences.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CookiePreferences { + #[serde(rename = "analytics", skip_serializing_if = "Option::is_none")] + pub analytics: Option, + #[serde(rename = "functional", skip_serializing_if = "Option::is_none")] + pub functional: Option, + #[serde(rename = "performance", skip_serializing_if = "Option::is_none")] + pub performance: Option, +} + +impl CookiePreferences { + pub fn new() -> CookiePreferences { + CookiePreferences { + analytics: None, + functional: None, + performance: None, + } + } +} + diff --git a/openapi/src/models/correlation.rs b/openapi/src/models/correlation.rs new file mode 100755 index 00000000..c7db8b6c --- /dev/null +++ b/openapi/src/models/correlation.rs @@ -0,0 +1,56 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Correlation : Correlation is the model for correlations definitions +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Correlation { + #[serde(rename = "config", skip_serializing_if = "Option::is_none")] + pub config: Option>, + /// Description of the correlation + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Label identifying the correlation + #[serde(rename = "label", skip_serializing_if = "Option::is_none")] + pub label: Option, + /// OrgID of the data source the correlation originates from + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + /// Provisioned True if the correlation was created during provisioning + #[serde(rename = "provisioned", skip_serializing_if = "Option::is_none")] + pub provisioned: Option, + /// UID of the data source the correlation originates from + #[serde(rename = "sourceUID", skip_serializing_if = "Option::is_none")] + pub source_uid: Option, + /// UID of the data source the correlation points to + #[serde(rename = "targetUID", skip_serializing_if = "Option::is_none")] + pub target_uid: Option, + /// Unique identifier of the correlation + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl Correlation { + /// Correlation is the model for correlations definitions + pub fn new() -> Correlation { + Correlation { + config: None, + description: None, + label: None, + org_id: None, + provisioned: None, + source_uid: None, + target_uid: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/correlation_config.rs b/openapi/src/models/correlation_config.rs new file mode 100755 index 00000000..9843a5a4 --- /dev/null +++ b/openapi/src/models/correlation_config.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CorrelationConfig { + /// Field used to attach the correlation link + #[serde(rename = "field")] + pub field: String, + /// Target data query + #[serde(rename = "target")] + pub target: serde_json::Value, + #[serde(rename = "transformations", skip_serializing_if = "Option::is_none")] + pub transformations: Option>, + #[serde(rename = "type")] + pub r#type: String, +} + +impl CorrelationConfig { + pub fn new(field: String, target: serde_json::Value, r#type: String) -> CorrelationConfig { + CorrelationConfig { + field, + target, + transformations: None, + r#type, + } + } +} + diff --git a/openapi/src/models/correlation_config_update_dto.rs b/openapi/src/models/correlation_config_update_dto.rs new file mode 100755 index 00000000..913e7d3d --- /dev/null +++ b/openapi/src/models/correlation_config_update_dto.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CorrelationConfigUpdateDto { + /// Field used to attach the correlation link + #[serde(rename = "field", skip_serializing_if = "Option::is_none")] + pub field: Option, + /// Target data query + #[serde(rename = "target", skip_serializing_if = "Option::is_none")] + pub target: Option, + /// Source data transformations + #[serde(rename = "transformations", skip_serializing_if = "Option::is_none")] + pub transformations: Option>, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, +} + +impl CorrelationConfigUpdateDto { + pub fn new() -> CorrelationConfigUpdateDto { + CorrelationConfigUpdateDto { + field: None, + target: None, + transformations: None, + r#type: None, + } + } +} + diff --git a/openapi/src/models/create_correlation_command.rs b/openapi/src/models/create_correlation_command.rs new file mode 100755 index 00000000..e6213ec3 --- /dev/null +++ b/openapi/src/models/create_correlation_command.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// CreateCorrelationCommand : CreateCorrelationCommand is the command for creating a correlation +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateCorrelationCommand { + #[serde(rename = "config", skip_serializing_if = "Option::is_none")] + pub config: Option>, + /// Optional description of the correlation + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Optional label identifying the correlation + #[serde(rename = "label", skip_serializing_if = "Option::is_none")] + pub label: Option, + /// True if correlation was created with provisioning. This makes it read-only. + #[serde(rename = "provisioned", skip_serializing_if = "Option::is_none")] + pub provisioned: Option, + /// Target data source UID to which the correlation is created. required if config.type = query + #[serde(rename = "targetUID", skip_serializing_if = "Option::is_none")] + pub target_uid: Option, +} + +impl CreateCorrelationCommand { + /// CreateCorrelationCommand is the command for creating a correlation + pub fn new() -> CreateCorrelationCommand { + CreateCorrelationCommand { + config: None, + description: None, + label: None, + provisioned: None, + target_uid: None, + } + } +} + diff --git a/openapi/src/models/create_correlation_response_body.rs b/openapi/src/models/create_correlation_response_body.rs new file mode 100755 index 00000000..75096c00 --- /dev/null +++ b/openapi/src/models/create_correlation_response_body.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// CreateCorrelationResponseBody : CreateCorrelationResponse is the response struct for CreateCorrelationCommand +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateCorrelationResponseBody { + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl CreateCorrelationResponseBody { + /// CreateCorrelationResponse is the response struct for CreateCorrelationCommand + pub fn new() -> CreateCorrelationResponseBody { + CreateCorrelationResponseBody { + message: None, + result: None, + } + } +} + diff --git a/openapi/src/models/create_dashboard_snapshot_200_response.rs b/openapi/src/models/create_dashboard_snapshot_200_response.rs new file mode 100755 index 00000000..6b0c04af --- /dev/null +++ b/openapi/src/models/create_dashboard_snapshot_200_response.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateDashboardSnapshot200Response { + /// Unique key used to delete the snapshot. It is different from the key so that only the creator can delete the snapshot. + #[serde(rename = "deleteKey", skip_serializing_if = "Option::is_none")] + pub delete_key: Option, + #[serde(rename = "deleteUrl", skip_serializing_if = "Option::is_none")] + pub delete_url: Option, + /// Snapshot id + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + /// Unique key + #[serde(rename = "key", skip_serializing_if = "Option::is_none")] + pub key: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl CreateDashboardSnapshot200Response { + pub fn new() -> CreateDashboardSnapshot200Response { + CreateDashboardSnapshot200Response { + delete_key: None, + delete_url: None, + id: None, + key: None, + url: None, + } + } +} + diff --git a/openapi/src/models/create_dashboard_snapshot_command.rs b/openapi/src/models/create_dashboard_snapshot_command.rs new file mode 100755 index 00000000..3895da6f --- /dev/null +++ b/openapi/src/models/create_dashboard_snapshot_command.rs @@ -0,0 +1,54 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateDashboardSnapshotCommand { + /// APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources +optional + #[serde(rename = "apiVersion", skip_serializing_if = "Option::is_none")] + pub api_version: Option, + #[serde(rename = "dashboard")] + pub dashboard: Box, + /// Unique key used to delete the snapshot. It is different from the `key` so that only the creator can delete the snapshot. Required if `external` is `true`. + #[serde(rename = "deleteKey", skip_serializing_if = "Option::is_none")] + pub delete_key: Option, + /// When the snapshot should expire in seconds in seconds. Default is never to expire. + #[serde(rename = "expires", skip_serializing_if = "Option::is_none")] + pub expires: Option, + /// these are passed when storing an external snapshot ref Save the snapshot on an external server rather than locally. + #[serde(rename = "external", skip_serializing_if = "Option::is_none")] + pub external: Option, + /// Define the unique key. Required if `external` is `true`. + #[serde(rename = "key", skip_serializing_if = "Option::is_none")] + pub key: Option, + /// Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +optional + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, + /// Snapshot name + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl CreateDashboardSnapshotCommand { + pub fn new(dashboard: models::Unstructured) -> CreateDashboardSnapshotCommand { + CreateDashboardSnapshotCommand { + api_version: None, + dashboard: Box::new(dashboard), + delete_key: None, + expires: None, + external: None, + key: None, + kind: None, + name: None, + } + } +} + diff --git a/openapi/src/models/create_folder_command.rs b/openapi/src/models/create_folder_command.rs new file mode 100755 index 00000000..2e8a41f6 --- /dev/null +++ b/openapi/src/models/create_folder_command.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// CreateFolderCommand : CreateFolderCommand captures the information required by the folder service to create a folder. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateFolderCommand { + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "parentUid", skip_serializing_if = "Option::is_none")] + pub parent_uid: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl CreateFolderCommand { + /// CreateFolderCommand captures the information required by the folder service to create a folder. + pub fn new() -> CreateFolderCommand { + CreateFolderCommand { + description: None, + parent_uid: None, + title: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/create_library_element_command.rs b/openapi/src/models/create_library_element_command.rs new file mode 100755 index 00000000..453964c6 --- /dev/null +++ b/openapi/src/models/create_library_element_command.rs @@ -0,0 +1,62 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// CreateLibraryElementCommand : CreateLibraryElementCommand is the command for adding a LibraryElement +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateLibraryElementCommand { + /// ID of the folder where the library element is stored. Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + /// UID of the folder where the library element is stored. + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + /// Kind of element to create, Use 1 for library panels or 2 for c. Description: 1 - library panels 2 - library variables + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, + /// The JSON model for the library element. + #[serde(rename = "model", skip_serializing_if = "Option::is_none")] + pub model: Option, + /// Name of the library element. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl CreateLibraryElementCommand { + /// CreateLibraryElementCommand is the command for adding a LibraryElement + pub fn new() -> CreateLibraryElementCommand { + CreateLibraryElementCommand { + folder_id: None, + folder_uid: None, + kind: None, + model: None, + name: None, + uid: None, + } + } +} +/// Kind of element to create, Use 1 for library panels or 2 for c. Description: 1 - library panels 2 - library variables +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Kind { + #[serde(rename = "1")] + Variant1, + #[serde(rename = "2")] + Variant2, +} + +impl Default for Kind { + fn default() -> Kind { + Self::Variant1 + } +} + diff --git a/openapi/src/models/create_or_update_report_config.rs b/openapi/src/models/create_or_update_report_config.rs new file mode 100755 index 00000000..678ba4df --- /dev/null +++ b/openapi/src/models/create_or_update_report_config.rs @@ -0,0 +1,59 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateOrUpdateReportConfig { + #[serde(rename = "dashboards", skip_serializing_if = "Option::is_none")] + pub dashboards: Option>, + #[serde(rename = "enableCsv", skip_serializing_if = "Option::is_none")] + pub enable_csv: Option, + #[serde(rename = "enableDashboardUrl", skip_serializing_if = "Option::is_none")] + pub enable_dashboard_url: Option, + #[serde(rename = "formats", skip_serializing_if = "Option::is_none")] + pub formats: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "options", skip_serializing_if = "Option::is_none")] + pub options: Option>, + #[serde(rename = "recipients", skip_serializing_if = "Option::is_none")] + pub recipients: Option, + #[serde(rename = "replyTo", skip_serializing_if = "Option::is_none")] + pub reply_to: Option, + #[serde(rename = "scaleFactor", skip_serializing_if = "Option::is_none")] + pub scale_factor: Option, + #[serde(rename = "schedule", skip_serializing_if = "Option::is_none")] + pub schedule: Option>, + #[serde(rename = "state", skip_serializing_if = "Option::is_none")] + pub state: Option, +} + +impl CreateOrUpdateReportConfig { + pub fn new() -> CreateOrUpdateReportConfig { + CreateOrUpdateReportConfig { + dashboards: None, + enable_csv: None, + enable_dashboard_url: None, + formats: None, + message: None, + name: None, + options: None, + recipients: None, + reply_to: None, + scale_factor: None, + schedule: None, + state: None, + } + } +} + diff --git a/openapi/src/models/create_org_200_response.rs b/openapi/src/models/create_org_200_response.rs new file mode 100755 index 00000000..6d7d3389 --- /dev/null +++ b/openapi/src/models/create_org_200_response.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateOrg200Response { + /// Message Message of the created org. + #[serde(rename = "message")] + pub message: String, + /// ID Identifier of the created org. + #[serde(rename = "orgId")] + pub org_id: i64, +} + +impl CreateOrg200Response { + pub fn new(message: String, org_id: i64) -> CreateOrg200Response { + CreateOrg200Response { + message, + org_id, + } + } +} + diff --git a/openapi/src/models/create_org_command.rs b/openapi/src/models/create_org_command.rs new file mode 100755 index 00000000..9a86bd43 --- /dev/null +++ b/openapi/src/models/create_org_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateOrgCommand { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl CreateOrgCommand { + pub fn new() -> CreateOrgCommand { + CreateOrgCommand { + name: None, + } + } +} + diff --git a/openapi/src/models/create_playlist_command.rs b/openapi/src/models/create_playlist_command.rs new file mode 100755 index 00000000..40ccb759 --- /dev/null +++ b/openapi/src/models/create_playlist_command.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreatePlaylistCommand { + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "items", skip_serializing_if = "Option::is_none")] + pub items: Option>, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl CreatePlaylistCommand { + pub fn new() -> CreatePlaylistCommand { + CreatePlaylistCommand { + interval: None, + items: None, + name: None, + } + } +} + diff --git a/openapi/src/models/create_query_in_query_history_command.rs b/openapi/src/models/create_query_in_query_history_command.rs new file mode 100755 index 00000000..e55e15d1 --- /dev/null +++ b/openapi/src/models/create_query_in_query_history_command.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// CreateQueryInQueryHistoryCommand : CreateQueryInQueryHistoryCommand is the command for adding query history +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateQueryInQueryHistoryCommand { + /// UID of the data source for which are queries stored. + #[serde(rename = "datasourceUid", skip_serializing_if = "Option::is_none")] + pub datasource_uid: Option, + #[serde(rename = "queries")] + pub queries: serde_json::Value, +} + +impl CreateQueryInQueryHistoryCommand { + /// CreateQueryInQueryHistoryCommand is the command for adding query history + pub fn new(queries: serde_json::Value) -> CreateQueryInQueryHistoryCommand { + CreateQueryInQueryHistoryCommand { + datasource_uid: None, + queries, + } + } +} + diff --git a/openapi/src/models/create_report_200_response.rs b/openapi/src/models/create_report_200_response.rs new file mode 100755 index 00000000..22d3510f --- /dev/null +++ b/openapi/src/models/create_report_200_response.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateReport200Response { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, +} + +impl CreateReport200Response { + pub fn new() -> CreateReport200Response { + CreateReport200Response { + id: None, + message: None, + } + } +} + diff --git a/openapi/src/models/create_role_form.rs b/openapi/src/models/create_role_form.rs new file mode 100755 index 00000000..c2900446 --- /dev/null +++ b/openapi/src/models/create_role_form.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateRoleForm { + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "displayName", skip_serializing_if = "Option::is_none")] + pub display_name: Option, + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option, + #[serde(rename = "group", skip_serializing_if = "Option::is_none")] + pub group: Option, + #[serde(rename = "hidden", skip_serializing_if = "Option::is_none")] + pub hidden: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "permissions", skip_serializing_if = "Option::is_none")] + pub permissions: Option>, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl CreateRoleForm { + pub fn new() -> CreateRoleForm { + CreateRoleForm { + description: None, + display_name: None, + global: None, + group: None, + hidden: None, + name: None, + permissions: None, + uid: None, + version: None, + } + } +} + diff --git a/openapi/src/models/create_service_account_form.rs b/openapi/src/models/create_service_account_form.rs new file mode 100755 index 00000000..d7a37578 --- /dev/null +++ b/openapi/src/models/create_service_account_form.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateServiceAccountForm { + #[serde(rename = "isDisabled", skip_serializing_if = "Option::is_none")] + pub is_disabled: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, +} + +impl CreateServiceAccountForm { + pub fn new() -> CreateServiceAccountForm { + CreateServiceAccountForm { + is_disabled: None, + name: None, + role: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/create_team_200_response.rs b/openapi/src/models/create_team_200_response.rs new file mode 100755 index 00000000..060bf196 --- /dev/null +++ b/openapi/src/models/create_team_200_response.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateTeam200Response { + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, +} + +impl CreateTeam200Response { + pub fn new() -> CreateTeam200Response { + CreateTeam200Response { + message: None, + team_id: None, + } + } +} + diff --git a/openapi/src/models/create_team_command.rs b/openapi/src/models/create_team_command.rs new file mode 100755 index 00000000..a28dd5e4 --- /dev/null +++ b/openapi/src/models/create_team_command.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct CreateTeamCommand { + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl CreateTeamCommand { + pub fn new() -> CreateTeamCommand { + CreateTeamCommand { + email: None, + name: None, + } + } +} + diff --git a/openapi/src/models/dashboard_acl_info_dto.rs b/openapi/src/models/dashboard_acl_info_dto.rs new file mode 100755 index 00000000..636e6500 --- /dev/null +++ b/openapi/src/models/dashboard_acl_info_dto.rs @@ -0,0 +1,108 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardAclInfoDto { + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + /// Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "inherited", skip_serializing_if = "Option::is_none")] + pub inherited: Option, + #[serde(rename = "isFolder", skip_serializing_if = "Option::is_none")] + pub is_folder: Option, + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, + #[serde(rename = "permissionName", skip_serializing_if = "Option::is_none")] + pub permission_name: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "slug", skip_serializing_if = "Option::is_none")] + pub slug: Option, + #[serde(rename = "team", skip_serializing_if = "Option::is_none")] + pub team: Option, + #[serde(rename = "teamAvatarUrl", skip_serializing_if = "Option::is_none")] + pub team_avatar_url: Option, + #[serde(rename = "teamEmail", skip_serializing_if = "Option::is_none")] + pub team_email: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "userAvatarUrl", skip_serializing_if = "Option::is_none")] + pub user_avatar_url: Option, + #[serde(rename = "userEmail", skip_serializing_if = "Option::is_none")] + pub user_email: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, + #[serde(rename = "userLogin", skip_serializing_if = "Option::is_none")] + pub user_login: Option, +} + +impl DashboardAclInfoDto { + pub fn new() -> DashboardAclInfoDto { + DashboardAclInfoDto { + created: None, + dashboard_id: None, + folder_id: None, + folder_uid: None, + inherited: None, + is_folder: None, + permission: None, + permission_name: None, + role: None, + slug: None, + team: None, + team_avatar_url: None, + team_email: None, + team_id: None, + title: None, + uid: None, + updated: None, + url: None, + user_avatar_url: None, + user_email: None, + user_id: None, + user_login: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/dashboard_acl_update_item.rs b/openapi/src/models/dashboard_acl_update_item.rs new file mode 100755 index 00000000..d6e37d6f --- /dev/null +++ b/openapi/src/models/dashboard_acl_update_item.rs @@ -0,0 +1,53 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardAclUpdateItem { + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl DashboardAclUpdateItem { + pub fn new() -> DashboardAclUpdateItem { + DashboardAclUpdateItem { + permission: None, + role: None, + team_id: None, + user_id: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/dashboard_create_command.rs b/openapi/src/models/dashboard_create_command.rs new file mode 100755 index 00000000..f72e760f --- /dev/null +++ b/openapi/src/models/dashboard_create_command.rs @@ -0,0 +1,48 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// DashboardCreateCommand : These are the values expected to be sent from an end user +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardCreateCommand { + /// APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources +optional + #[serde(rename = "apiVersion", skip_serializing_if = "Option::is_none")] + pub api_version: Option, + #[serde(rename = "dashboard")] + pub dashboard: Box, + /// When the snapshot should expire in seconds in seconds. Default is never to expire. + #[serde(rename = "expires", skip_serializing_if = "Option::is_none")] + pub expires: Option, + /// these are passed when storing an external snapshot ref Save the snapshot on an external server rather than locally. + #[serde(rename = "external", skip_serializing_if = "Option::is_none")] + pub external: Option, + /// Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +optional + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, + /// Snapshot name + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl DashboardCreateCommand { + /// These are the values expected to be sent from an end user +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + pub fn new(dashboard: models::Unstructured) -> DashboardCreateCommand { + DashboardCreateCommand { + api_version: None, + dashboard: Box::new(dashboard), + expires: None, + external: None, + kind: None, + name: None, + } + } +} + diff --git a/openapi/src/models/dashboard_full_with_meta.rs b/openapi/src/models/dashboard_full_with_meta.rs new file mode 100755 index 00000000..2fe9fa79 --- /dev/null +++ b/openapi/src/models/dashboard_full_with_meta.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardFullWithMeta { + #[serde(rename = "dashboard", skip_serializing_if = "Option::is_none")] + pub dashboard: Option, + #[serde(rename = "meta", skip_serializing_if = "Option::is_none")] + pub meta: Option>, +} + +impl DashboardFullWithMeta { + pub fn new() -> DashboardFullWithMeta { + DashboardFullWithMeta { + dashboard: None, + meta: None, + } + } +} + diff --git a/openapi/src/models/dashboard_meta.rs b/openapi/src/models/dashboard_meta.rs new file mode 100755 index 00000000..1eba315e --- /dev/null +++ b/openapi/src/models/dashboard_meta.rs @@ -0,0 +1,105 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardMeta { + #[serde(rename = "annotationsPermissions", skip_serializing_if = "Option::is_none")] + pub annotations_permissions: Option>, + #[serde(rename = "canAdmin", skip_serializing_if = "Option::is_none")] + pub can_admin: Option, + #[serde(rename = "canDelete", skip_serializing_if = "Option::is_none")] + pub can_delete: Option, + #[serde(rename = "canEdit", skip_serializing_if = "Option::is_none")] + pub can_edit: Option, + #[serde(rename = "canSave", skip_serializing_if = "Option::is_none")] + pub can_save: Option, + #[serde(rename = "canStar", skip_serializing_if = "Option::is_none")] + pub can_star: Option, + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "createdBy", skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[serde(rename = "expires", skip_serializing_if = "Option::is_none")] + pub expires: Option, + /// Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + #[serde(rename = "folderTitle", skip_serializing_if = "Option::is_none")] + pub folder_title: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "folderUrl", skip_serializing_if = "Option::is_none")] + pub folder_url: Option, + #[serde(rename = "hasAcl", skip_serializing_if = "Option::is_none")] + pub has_acl: Option, + #[serde(rename = "isFolder", skip_serializing_if = "Option::is_none")] + pub is_folder: Option, + #[serde(rename = "isSnapshot", skip_serializing_if = "Option::is_none")] + pub is_snapshot: Option, + #[serde(rename = "isStarred", skip_serializing_if = "Option::is_none")] + pub is_starred: Option, + #[serde(rename = "provisioned", skip_serializing_if = "Option::is_none")] + pub provisioned: Option, + #[serde(rename = "provisionedExternalId", skip_serializing_if = "Option::is_none")] + pub provisioned_external_id: Option, + #[serde(rename = "publicDashboardEnabled", skip_serializing_if = "Option::is_none")] + pub public_dashboard_enabled: Option, + #[serde(rename = "publicDashboardUid", skip_serializing_if = "Option::is_none")] + pub public_dashboard_uid: Option, + #[serde(rename = "slug", skip_serializing_if = "Option::is_none")] + pub slug: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "updatedBy", skip_serializing_if = "Option::is_none")] + pub updated_by: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl DashboardMeta { + pub fn new() -> DashboardMeta { + DashboardMeta { + annotations_permissions: None, + can_admin: None, + can_delete: None, + can_edit: None, + can_save: None, + can_star: None, + created: None, + created_by: None, + expires: None, + folder_id: None, + folder_title: None, + folder_uid: None, + folder_url: None, + has_acl: None, + is_folder: None, + is_snapshot: None, + is_starred: None, + provisioned: None, + provisioned_external_id: None, + public_dashboard_enabled: None, + public_dashboard_uid: None, + slug: None, + r#type: None, + updated: None, + updated_by: None, + url: None, + version: None, + } + } +} + diff --git a/openapi/src/models/dashboard_redirect.rs b/openapi/src/models/dashboard_redirect.rs new file mode 100755 index 00000000..e71b299a --- /dev/null +++ b/openapi/src/models/dashboard_redirect.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardRedirect { + #[serde(rename = "redirectUri", skip_serializing_if = "Option::is_none")] + pub redirect_uri: Option, +} + +impl DashboardRedirect { + pub fn new() -> DashboardRedirect { + DashboardRedirect { + redirect_uri: None, + } + } +} + diff --git a/openapi/src/models/dashboard_snapshot_dto.rs b/openapi/src/models/dashboard_snapshot_dto.rs new file mode 100755 index 00000000..43472088 --- /dev/null +++ b/openapi/src/models/dashboard_snapshot_dto.rs @@ -0,0 +1,46 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// DashboardSnapshotDto : DashboardSnapshotDTO without dashboard map +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardSnapshotDto { + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "expires", skip_serializing_if = "Option::is_none")] + pub expires: Option, + #[serde(rename = "external", skip_serializing_if = "Option::is_none")] + pub external: Option, + #[serde(rename = "externalUrl", skip_serializing_if = "Option::is_none")] + pub external_url: Option, + #[serde(rename = "key", skip_serializing_if = "Option::is_none")] + pub key: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, +} + +impl DashboardSnapshotDto { + /// DashboardSnapshotDTO without dashboard map + pub fn new() -> DashboardSnapshotDto { + DashboardSnapshotDto { + created: None, + expires: None, + external: None, + external_url: None, + key: None, + name: None, + updated: None, + } + } +} + diff --git a/openapi/src/models/dashboard_tag_cloud_item.rs b/openapi/src/models/dashboard_tag_cloud_item.rs new file mode 100755 index 00000000..11548f39 --- /dev/null +++ b/openapi/src/models/dashboard_tag_cloud_item.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardTagCloudItem { + #[serde(rename = "count", skip_serializing_if = "Option::is_none")] + pub count: Option, + #[serde(rename = "term", skip_serializing_if = "Option::is_none")] + pub term: Option, +} + +impl DashboardTagCloudItem { + pub fn new() -> DashboardTagCloudItem { + DashboardTagCloudItem { + count: None, + term: None, + } + } +} + diff --git a/openapi/src/models/dashboard_version_meta.rs b/openapi/src/models/dashboard_version_meta.rs new file mode 100755 index 00000000..a84532d1 --- /dev/null +++ b/openapi/src/models/dashboard_version_meta.rs @@ -0,0 +1,55 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// DashboardVersionMeta : DashboardVersionMeta extends the DashboardVersionDTO with the names associated with the UserIds, overriding the field with the same name from the DashboardVersionDTO model. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DashboardVersionMeta { + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "createdBy", skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "parentVersion", skip_serializing_if = "Option::is_none")] + pub parent_version: Option, + #[serde(rename = "restoredFrom", skip_serializing_if = "Option::is_none")] + pub restored_from: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl DashboardVersionMeta { + /// DashboardVersionMeta extends the DashboardVersionDTO with the names associated with the UserIds, overriding the field with the same name from the DashboardVersionDTO model. + pub fn new() -> DashboardVersionMeta { + DashboardVersionMeta { + created: None, + created_by: None, + dashboard_id: None, + data: None, + id: None, + message: None, + parent_version: None, + restored_from: None, + uid: None, + version: None, + } + } +} + diff --git a/openapi/src/models/data_link.rs b/openapi/src/models/data_link.rs new file mode 100755 index 00000000..8ad141e2 --- /dev/null +++ b/openapi/src/models/data_link.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// DataLink : DataLink define what +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DataLink { + #[serde(rename = "internal", skip_serializing_if = "Option::is_none")] + pub internal: Option>, + #[serde(rename = "targetBlank", skip_serializing_if = "Option::is_none")] + pub target_blank: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl DataLink { + /// DataLink define what + pub fn new() -> DataLink { + DataLink { + internal: None, + target_blank: None, + title: None, + url: None, + } + } +} + diff --git a/openapi/src/models/data_response.rs b/openapi/src/models/data_response.rs new file mode 100755 index 00000000..9fee4c0f --- /dev/null +++ b/openapi/src/models/data_response.rs @@ -0,0 +1,40 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// DataResponse : A map of RefIDs (unique query identifiers) to this type makes up the Responses property of a QueryDataResponse. The Error property is used to allow for partial success responses from the containing QueryDataResponse. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DataResponse { + /// Error is a property to be set if the corresponding DataQuery has an error. + #[serde(rename = "Error", skip_serializing_if = "Option::is_none")] + pub error: Option, + /// ErrorSource type defines the source of the error + #[serde(rename = "ErrorSource", skip_serializing_if = "Option::is_none")] + pub error_source: Option, + /// It is the main data container within a backend.DataResponse. There should be no `nil` entries in the Frames slice (making them pointers was a mistake). + #[serde(rename = "Frames", skip_serializing_if = "Option::is_none")] + pub frames: Option>, + #[serde(rename = "Status", skip_serializing_if = "Option::is_none")] + pub status: Option, +} + +impl DataResponse { + /// A map of RefIDs (unique query identifiers) to this type makes up the Responses property of a QueryDataResponse. The Error property is used to allow for partial success responses from the containing QueryDataResponse. + pub fn new() -> DataResponse { + DataResponse { + error: None, + error_source: None, + frames: None, + status: None, + } + } +} + diff --git a/openapi/src/models/data_source.rs b/openapi/src/models/data_source.rs new file mode 100755 index 00000000..d4125483 --- /dev/null +++ b/openapi/src/models/data_source.rs @@ -0,0 +1,81 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DataSource { + #[serde(rename = "access", skip_serializing_if = "Option::is_none")] + pub access: Option, + /// Metadata contains user accesses for a given resource Ex: map[string]bool{\"create\":true, \"delete\": true} + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "basicAuth", skip_serializing_if = "Option::is_none")] + pub basic_auth: Option, + #[serde(rename = "basicAuthUser", skip_serializing_if = "Option::is_none")] + pub basic_auth_user: Option, + #[serde(rename = "database", skip_serializing_if = "Option::is_none")] + pub database: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isDefault", skip_serializing_if = "Option::is_none")] + pub is_default: Option, + #[serde(rename = "jsonData", skip_serializing_if = "Option::is_none")] + pub json_data: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "readOnly", skip_serializing_if = "Option::is_none")] + pub read_only: Option, + #[serde(rename = "secureJsonFields", skip_serializing_if = "Option::is_none")] + pub secure_json_fields: Option>, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "typeLogoUrl", skip_serializing_if = "Option::is_none")] + pub type_logo_url: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "user", skip_serializing_if = "Option::is_none")] + pub user: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, + #[serde(rename = "withCredentials", skip_serializing_if = "Option::is_none")] + pub with_credentials: Option, +} + +impl DataSource { + pub fn new() -> DataSource { + DataSource { + access: None, + access_control: None, + basic_auth: None, + basic_auth_user: None, + database: None, + id: None, + is_default: None, + json_data: None, + name: None, + org_id: None, + read_only: None, + secure_json_fields: None, + r#type: None, + type_logo_url: None, + uid: None, + url: None, + user: None, + version: None, + with_credentials: None, + } + } +} + diff --git a/openapi/src/models/data_source_list_item_dto.rs b/openapi/src/models/data_source_list_item_dto.rs new file mode 100755 index 00000000..1a1fa6c3 --- /dev/null +++ b/openapi/src/models/data_source_list_item_dto.rs @@ -0,0 +1,68 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DataSourceListItemDto { + #[serde(rename = "access", skip_serializing_if = "Option::is_none")] + pub access: Option, + #[serde(rename = "basicAuth", skip_serializing_if = "Option::is_none")] + pub basic_auth: Option, + #[serde(rename = "database", skip_serializing_if = "Option::is_none")] + pub database: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isDefault", skip_serializing_if = "Option::is_none")] + pub is_default: Option, + #[serde(rename = "jsonData", skip_serializing_if = "Option::is_none")] + pub json_data: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "readOnly", skip_serializing_if = "Option::is_none")] + pub read_only: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "typeLogoUrl", skip_serializing_if = "Option::is_none")] + pub type_logo_url: Option, + #[serde(rename = "typeName", skip_serializing_if = "Option::is_none")] + pub type_name: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "user", skip_serializing_if = "Option::is_none")] + pub user: Option, +} + +impl DataSourceListItemDto { + pub fn new() -> DataSourceListItemDto { + DataSourceListItemDto { + access: None, + basic_auth: None, + database: None, + id: None, + is_default: None, + json_data: None, + name: None, + org_id: None, + read_only: None, + r#type: None, + type_logo_url: None, + type_name: None, + uid: None, + url: None, + user: None, + } + } +} + diff --git a/openapi/src/models/data_source_ref.rs b/openapi/src/models/data_source_ref.rs new file mode 100755 index 00000000..a459e1f9 --- /dev/null +++ b/openapi/src/models/data_source_ref.rs @@ -0,0 +1,33 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// DataSourceRef : Ref to a DataSource instance +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DataSourceRef { + /// The plugin type-id + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + /// Specific datasource instance + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl DataSourceRef { + /// Ref to a DataSource instance + pub fn new() -> DataSourceRef { + DataSourceRef { + r#type: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/delete_correlation_response_body.rs b/openapi/src/models/delete_correlation_response_body.rs new file mode 100755 index 00000000..bc1271ee --- /dev/null +++ b/openapi/src/models/delete_correlation_response_body.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DeleteCorrelationResponseBody { + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, +} + +impl DeleteCorrelationResponseBody { + pub fn new() -> DeleteCorrelationResponseBody { + DeleteCorrelationResponseBody { + message: None, + } + } +} + diff --git a/openapi/src/models/delete_dashboard_by_uid_200_response.rs b/openapi/src/models/delete_dashboard_by_uid_200_response.rs new file mode 100755 index 00000000..397a47f8 --- /dev/null +++ b/openapi/src/models/delete_dashboard_by_uid_200_response.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DeleteDashboardByUid200Response { + /// ID Identifier of the deleted dashboard. + #[serde(rename = "id")] + pub id: i64, + /// Message Message of the deleted dashboard. + #[serde(rename = "message")] + pub message: String, + /// Title Title of the deleted dashboard. + #[serde(rename = "title")] + pub title: String, +} + +impl DeleteDashboardByUid200Response { + pub fn new(id: i64, message: String, title: String) -> DeleteDashboardByUid200Response { + DeleteDashboardByUid200Response { + id, + message, + title, + } + } +} + diff --git a/openapi/src/models/delete_data_source_by_name_200_response.rs b/openapi/src/models/delete_data_source_by_name_200_response.rs new file mode 100755 index 00000000..79b760db --- /dev/null +++ b/openapi/src/models/delete_data_source_by_name_200_response.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DeleteDataSourceByName200Response { + /// ID Identifier of the deleted data source. + #[serde(rename = "id")] + pub id: i64, + /// Message Message of the deleted dashboard. + #[serde(rename = "message")] + pub message: String, +} + +impl DeleteDataSourceByName200Response { + pub fn new(id: i64, message: String) -> DeleteDataSourceByName200Response { + DeleteDataSourceByName200Response { + id, + message, + } + } +} + diff --git a/openapi/src/models/delete_folder_200_response.rs b/openapi/src/models/delete_folder_200_response.rs new file mode 100755 index 00000000..29242300 --- /dev/null +++ b/openapi/src/models/delete_folder_200_response.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DeleteFolder200Response { + /// ID Identifier of the deleted folder. + #[serde(rename = "id")] + pub id: i64, + /// Message Message of the deleted folder. + #[serde(rename = "message")] + pub message: String, + /// Title of the deleted folder. + #[serde(rename = "title")] + pub title: String, +} + +impl DeleteFolder200Response { + pub fn new(id: i64, message: String, title: String) -> DeleteFolder200Response { + DeleteFolder200Response { + id, + message, + title, + } + } +} + diff --git a/openapi/src/models/delete_token_command.rs b/openapi/src/models/delete_token_command.rs new file mode 100755 index 00000000..e0cc2f91 --- /dev/null +++ b/openapi/src/models/delete_token_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DeleteTokenCommand { + #[serde(rename = "instance", skip_serializing_if = "Option::is_none")] + pub instance: Option, +} + +impl DeleteTokenCommand { + pub fn new() -> DeleteTokenCommand { + DeleteTokenCommand { + instance: None, + } + } +} + diff --git a/openapi/src/models/description.rs b/openapi/src/models/description.rs new file mode 100755 index 00000000..b72e4a3e --- /dev/null +++ b/openapi/src/models/description.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Description { + #[serde(rename = "assignments", skip_serializing_if = "Option::is_none")] + pub assignments: Option>, + #[serde(rename = "permissions", skip_serializing_if = "Option::is_none")] + pub permissions: Option>, +} + +impl Description { + pub fn new() -> Description { + Description { + assignments: None, + permissions: None, + } + } +} + diff --git a/openapi/src/models/device_dto.rs b/openapi/src/models/device_dto.rs new file mode 100755 index 00000000..6ca12902 --- /dev/null +++ b/openapi/src/models/device_dto.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DeviceDto { + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "clientIp", skip_serializing_if = "Option::is_none")] + pub client_ip: Option, + #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(rename = "deviceId", skip_serializing_if = "Option::is_none")] + pub device_id: Option, + #[serde(rename = "lastSeenAt", skip_serializing_if = "Option::is_none")] + pub last_seen_at: Option, + #[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")] + pub updated_at: Option, + #[serde(rename = "userAgent", skip_serializing_if = "Option::is_none")] + pub user_agent: Option, +} + +impl DeviceDto { + pub fn new() -> DeviceDto { + DeviceDto { + avatar_url: None, + client_ip: None, + created_at: None, + device_id: None, + last_seen_at: None, + updated_at: None, + user_agent: None, + } + } +} + diff --git a/openapi/src/models/device_search_hit_dto.rs b/openapi/src/models/device_search_hit_dto.rs new file mode 100755 index 00000000..d2c7ab3b --- /dev/null +++ b/openapi/src/models/device_search_hit_dto.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DeviceSearchHitDto { + #[serde(rename = "clientIp", skip_serializing_if = "Option::is_none")] + pub client_ip: Option, + #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(rename = "deviceId", skip_serializing_if = "Option::is_none")] + pub device_id: Option, + #[serde(rename = "lastSeenAt", skip_serializing_if = "Option::is_none")] + pub last_seen_at: Option, + #[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")] + pub updated_at: Option, + #[serde(rename = "userAgent", skip_serializing_if = "Option::is_none")] + pub user_agent: Option, +} + +impl DeviceSearchHitDto { + pub fn new() -> DeviceSearchHitDto { + DeviceSearchHitDto { + client_ip: None, + created_at: None, + device_id: None, + last_seen_at: None, + updated_at: None, + user_agent: None, + } + } +} + diff --git a/openapi/src/models/discord_config.rs b/openapi/src/models/discord_config.rs new file mode 100755 index 00000000..9f54e074 --- /dev/null +++ b/openapi/src/models/discord_config.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DiscordConfig { + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "webhook_url", skip_serializing_if = "Option::is_none")] + pub webhook_url: Option>, + #[serde(rename = "webhook_url_file", skip_serializing_if = "Option::is_none")] + pub webhook_url_file: Option, +} + +impl DiscordConfig { + pub fn new() -> DiscordConfig { + DiscordConfig { + http_config: None, + message: None, + send_resolved: None, + title: None, + webhook_url: None, + webhook_url_file: None, + } + } +} + diff --git a/openapi/src/models/discovery_base.rs b/openapi/src/models/discovery_base.rs new file mode 100755 index 00000000..39a8f7be --- /dev/null +++ b/openapi/src/models/discovery_base.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct DiscoveryBase { + #[serde(rename = "error", skip_serializing_if = "Option::is_none")] + pub error: Option, + #[serde(rename = "errorType", skip_serializing_if = "Option::is_none")] + pub error_type: Option, + #[serde(rename = "status")] + pub status: String, +} + +impl DiscoveryBase { + pub fn new(status: String) -> DiscoveryBase { + DiscoveryBase { + error: None, + error_type: None, + status, + } + } +} + diff --git a/openapi/src/models/email_config.rs b/openapi/src/models/email_config.rs new file mode 100755 index 00000000..1925d8d3 --- /dev/null +++ b/openapi/src/models/email_config.rs @@ -0,0 +1,69 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct EmailConfig { + #[serde(rename = "auth_identity", skip_serializing_if = "Option::is_none")] + pub auth_identity: Option, + #[serde(rename = "auth_password", skip_serializing_if = "Option::is_none")] + pub auth_password: Option, + #[serde(rename = "auth_password_file", skip_serializing_if = "Option::is_none")] + pub auth_password_file: Option, + #[serde(rename = "auth_secret", skip_serializing_if = "Option::is_none")] + pub auth_secret: Option, + #[serde(rename = "auth_username", skip_serializing_if = "Option::is_none")] + pub auth_username: Option, + #[serde(rename = "from", skip_serializing_if = "Option::is_none")] + pub from: Option, + #[serde(rename = "headers", skip_serializing_if = "Option::is_none")] + pub headers: Option>, + #[serde(rename = "hello", skip_serializing_if = "Option::is_none")] + pub hello: Option, + #[serde(rename = "html", skip_serializing_if = "Option::is_none")] + pub html: Option, + #[serde(rename = "require_tls", skip_serializing_if = "Option::is_none")] + pub require_tls: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "smarthost", skip_serializing_if = "Option::is_none")] + pub smarthost: Option>, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "tls_config", skip_serializing_if = "Option::is_none")] + pub tls_config: Option>, + /// Email address to notify. + #[serde(rename = "to", skip_serializing_if = "Option::is_none")] + pub to: Option, +} + +impl EmailConfig { + pub fn new() -> EmailConfig { + EmailConfig { + auth_identity: None, + auth_password: None, + auth_password_file: None, + auth_secret: None, + auth_username: None, + from: None, + headers: None, + hello: None, + html: None, + require_tls: None, + send_resolved: None, + smarthost: None, + text: None, + tls_config: None, + to: None, + } + } +} + diff --git a/openapi/src/models/email_dto.rs b/openapi/src/models/email_dto.rs new file mode 100755 index 00000000..f6e56384 --- /dev/null +++ b/openapi/src/models/email_dto.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct EmailDto { + #[serde(rename = "recipient", skip_serializing_if = "Option::is_none")] + pub recipient: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl EmailDto { + pub fn new() -> EmailDto { + EmailDto { + recipient: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/embedded_contact_point.rs b/openapi/src/models/embedded_contact_point.rs new file mode 100755 index 00000000..7947e207 --- /dev/null +++ b/openapi/src/models/embedded_contact_point.rs @@ -0,0 +1,91 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// EmbeddedContactPoint : EmbeddedContactPoint is the contact point type that is used by grafanas embedded alertmanager implementation. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct EmbeddedContactPoint { + #[serde(rename = "disableResolveMessage", skip_serializing_if = "Option::is_none")] + pub disable_resolve_message: Option, + /// Name is used as grouping key in the UI. Contact points with the same name will be grouped in the UI. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "provenance", skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(rename = "settings")] + pub settings: serde_json::Value, + #[serde(rename = "type")] + pub r#type: Type, + /// UID is the unique identifier of the contact point. The UID can be set by the user. + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl EmbeddedContactPoint { + /// EmbeddedContactPoint is the contact point type that is used by grafanas embedded alertmanager implementation. + pub fn new(settings: serde_json::Value, r#type: Type) -> EmbeddedContactPoint { + EmbeddedContactPoint { + disable_resolve_message: None, + name: None, + provenance: None, + settings, + r#type, + uid: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Type { + #[serde(rename = "alertmanager")] + Alertmanager, + #[serde(rename = " dingding")] + Dingding, + #[serde(rename = " discord")] + Discord, + #[serde(rename = " email")] + Email, + #[serde(rename = " googlechat")] + Googlechat, + #[serde(rename = " kafka")] + Kafka, + #[serde(rename = " line")] + Line, + #[serde(rename = " opsgenie")] + Opsgenie, + #[serde(rename = " pagerduty")] + Pagerduty, + #[serde(rename = " pushover")] + Pushover, + #[serde(rename = " sensugo")] + Sensugo, + #[serde(rename = " slack")] + Slack, + #[serde(rename = " teams")] + Teams, + #[serde(rename = " telegram")] + Telegram, + #[serde(rename = " threema")] + Threema, + #[serde(rename = " victorops")] + Victorops, + #[serde(rename = " webhook")] + Webhook, + #[serde(rename = " wecom")] + Wecom, +} + +impl Default for Type { + fn default() -> Type { + Self::Alertmanager + } +} + diff --git a/openapi/src/models/enum_field_config.rs b/openapi/src/models/enum_field_config.rs new file mode 100755 index 00000000..0f9ed1f2 --- /dev/null +++ b/openapi/src/models/enum_field_config.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// EnumFieldConfig : Enum field config Vector values are used as lookup keys into the enum fields +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct EnumFieldConfig { + /// Color is the color value for a given index (empty is undefined) + #[serde(rename = "color", skip_serializing_if = "Option::is_none")] + pub color: Option>, + /// Description of the enum state + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option>, + /// Icon supports setting an icon for a given index value + #[serde(rename = "icon", skip_serializing_if = "Option::is_none")] + pub icon: Option>, + /// Value is the string display value for a given index + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option>, +} + +impl EnumFieldConfig { + /// Enum field config Vector values are used as lookup keys into the enum fields + pub fn new() -> EnumFieldConfig { + EnumFieldConfig { + color: None, + description: None, + icon: None, + text: None, + } + } +} + diff --git a/openapi/src/models/error_response_body.rs b/openapi/src/models/error_response_body.rs new file mode 100755 index 00000000..f36cf8ae --- /dev/null +++ b/openapi/src/models/error_response_body.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ErrorResponseBody { + /// Error An optional detailed description of the actual error. Only included if running in developer mode. + #[serde(rename = "error", skip_serializing_if = "Option::is_none")] + pub error: Option, + /// a human readable version of the error + #[serde(rename = "message")] + pub message: String, + /// Status An optional status to denote the cause of the error. For example, a 412 Precondition Failed error may include additional information of why that error happened. + #[serde(rename = "status", skip_serializing_if = "Option::is_none")] + pub status: Option, +} + +impl ErrorResponseBody { + pub fn new(message: String) -> ErrorResponseBody { + ErrorResponseBody { + error: None, + message, + status: None, + } + } +} + diff --git a/openapi/src/models/eval_alert_condition_command.rs b/openapi/src/models/eval_alert_condition_command.rs new file mode 100755 index 00000000..0266ace4 --- /dev/null +++ b/openapi/src/models/eval_alert_condition_command.rs @@ -0,0 +1,34 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// EvalAlertConditionCommand : EvalAlertConditionCommand is the command for evaluating a condition +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct EvalAlertConditionCommand { + #[serde(rename = "condition", skip_serializing_if = "Option::is_none")] + pub condition: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "now", skip_serializing_if = "Option::is_none")] + pub now: Option, +} + +impl EvalAlertConditionCommand { + /// EvalAlertConditionCommand is the command for evaluating a condition + pub fn new() -> EvalAlertConditionCommand { + EvalAlertConditionCommand { + condition: None, + data: None, + now: None, + } + } +} + diff --git a/openapi/src/models/eval_queries_payload.rs b/openapi/src/models/eval_queries_payload.rs new file mode 100755 index 00000000..6efea66f --- /dev/null +++ b/openapi/src/models/eval_queries_payload.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct EvalQueriesPayload { + #[serde(rename = "condition", skip_serializing_if = "Option::is_none")] + pub condition: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "now", skip_serializing_if = "Option::is_none")] + pub now: Option, +} + +impl EvalQueriesPayload { + pub fn new() -> EvalQueriesPayload { + EvalQueriesPayload { + condition: None, + data: None, + now: None, + } + } +} + diff --git a/openapi/src/models/extended_receiver.rs b/openapi/src/models/extended_receiver.rs new file mode 100755 index 00000000..6f7ef0b3 --- /dev/null +++ b/openapi/src/models/extended_receiver.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ExtendedReceiver { + #[serde(rename = "email_configs", skip_serializing_if = "Option::is_none")] + pub email_configs: Option>, + #[serde(rename = "grafana_managed_receiver", skip_serializing_if = "Option::is_none")] + pub grafana_managed_receiver: Option>, + #[serde(rename = "opsgenie_configs", skip_serializing_if = "Option::is_none")] + pub opsgenie_configs: Option>, + #[serde(rename = "pagerduty_configs", skip_serializing_if = "Option::is_none")] + pub pagerduty_configs: Option>, + #[serde(rename = "pushover_configs", skip_serializing_if = "Option::is_none")] + pub pushover_configs: Option>, + #[serde(rename = "slack_configs", skip_serializing_if = "Option::is_none")] + pub slack_configs: Option>, + #[serde(rename = "victorops_configs", skip_serializing_if = "Option::is_none")] + pub victorops_configs: Option>, + #[serde(rename = "webhook_configs", skip_serializing_if = "Option::is_none")] + pub webhook_configs: Option>, + #[serde(rename = "wechat_configs", skip_serializing_if = "Option::is_none")] + pub wechat_configs: Option>, +} + +impl ExtendedReceiver { + pub fn new() -> ExtendedReceiver { + ExtendedReceiver { + email_configs: None, + grafana_managed_receiver: None, + opsgenie_configs: None, + pagerduty_configs: None, + pushover_configs: None, + slack_configs: None, + victorops_configs: None, + webhook_configs: None, + wechat_configs: None, + } + } +} + diff --git a/openapi/src/models/extension.rs b/openapi/src/models/extension.rs new file mode 100755 index 00000000..5a906c72 --- /dev/null +++ b/openapi/src/models/extension.rs @@ -0,0 +1,34 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Extension : Extension represents the ASN.1 structure of the same name. See RFC 5280, section 4.2. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Extension { + #[serde(rename = "Critical", skip_serializing_if = "Option::is_none")] + pub critical: Option, + #[serde(rename = "Id", skip_serializing_if = "Option::is_none")] + pub id: Option>, + #[serde(rename = "Value", skip_serializing_if = "Option::is_none")] + pub value: Option>, +} + +impl Extension { + /// Extension represents the ASN.1 structure of the same name. See RFC 5280, section 4.2. + pub fn new() -> Extension { + Extension { + critical: None, + id: None, + value: None, + } + } +} + diff --git a/openapi/src/models/failed_user.rs b/openapi/src/models/failed_user.rs new file mode 100755 index 00000000..95af5db4 --- /dev/null +++ b/openapi/src/models/failed_user.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// FailedUser : FailedUser holds the information of an user that failed +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct FailedUser { + #[serde(rename = "Error", skip_serializing_if = "Option::is_none")] + pub error: Option, + #[serde(rename = "Login", skip_serializing_if = "Option::is_none")] + pub login: Option, +} + +impl FailedUser { + /// FailedUser holds the information of an user that failed + pub fn new() -> FailedUser { + FailedUser { + error: None, + login: None, + } + } +} + diff --git a/openapi/src/models/field.rs b/openapi/src/models/field.rs new file mode 100755 index 00000000..a66b73b8 --- /dev/null +++ b/openapi/src/models/field.rs @@ -0,0 +1,36 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Field : A Field is essentially a slice of various types with extra properties and methods. See NewField() for supported types. The slice data in the Field is a not exported, so methods on the Field are used to to manipulate its data. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Field { + #[serde(rename = "config", skip_serializing_if = "Option::is_none")] + pub config: Option>, + /// Labels are used to add metadata to an object. The JSON will always be sorted keys + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + /// Name is default identifier of the field. The name does not have to be unique, but the combination of name and Labels should be unique for proper behavior in all situations. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl Field { + /// A Field is essentially a slice of various types with extra properties and methods. See NewField() for supported types. The slice data in the Field is a not exported, so methods on the Field are used to to manipulate its data. + pub fn new() -> Field { + Field { + config: None, + labels: None, + name: None, + } + } +} + diff --git a/openapi/src/models/field_config.rs b/openapi/src/models/field_config.rs new file mode 100755 index 00000000..4cb93594 --- /dev/null +++ b/openapi/src/models/field_config.rs @@ -0,0 +1,91 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct FieldConfig { + /// Map values to a display color NOTE: this interface is under development in the frontend... so simple map for now + #[serde(rename = "color", skip_serializing_if = "Option::is_none")] + pub color: Option, + /// Panel Specific Values + #[serde(rename = "custom", skip_serializing_if = "Option::is_none")] + pub custom: Option, + #[serde(rename = "decimals", skip_serializing_if = "Option::is_none")] + pub decimals: Option, + /// Description is human readable field metadata + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// DisplayName overrides Grafana default naming, should not be used from a data source + #[serde(rename = "displayName", skip_serializing_if = "Option::is_none")] + pub display_name: Option, + /// DisplayNameFromDS overrides Grafana default naming strategy. + #[serde(rename = "displayNameFromDS", skip_serializing_if = "Option::is_none")] + pub display_name_from_ds: Option, + /// Filterable indicates if the Field's data can be filtered by additional calls. + #[serde(rename = "filterable", skip_serializing_if = "Option::is_none")] + pub filterable: Option, + /// Interval indicates the expected regular step between values in the series. When an interval exists, consumers can identify \"missing\" values when the expected value is not present. The grafana timeseries visualization will render disconnected values when missing values are found it the time field. The interval uses the same units as the values. For time.Time, this is defined in milliseconds. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + /// The behavior when clicking on a result + #[serde(rename = "links", skip_serializing_if = "Option::is_none")] + pub links: Option>, + #[serde(rename = "mappings", skip_serializing_if = "Option::is_none")] + pub mappings: Option>, + /// ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. + #[serde(rename = "max", skip_serializing_if = "Option::is_none")] + pub max: Option, + /// ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. + #[serde(rename = "min", skip_serializing_if = "Option::is_none")] + pub min: Option, + /// Alternative to empty string + #[serde(rename = "noValue", skip_serializing_if = "Option::is_none")] + pub no_value: Option, + /// Path is an explicit path to the field in the datasource. When the frame meta includes a path, this will default to `${frame.meta.path}/${field.name} When defined, this value can be used as an identifier within the datasource scope, and may be used as an identifier to update values in a subsequent request + #[serde(rename = "path", skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(rename = "thresholds", skip_serializing_if = "Option::is_none")] + pub thresholds: Option>, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option>, + /// Numeric Options + #[serde(rename = "unit", skip_serializing_if = "Option::is_none")] + pub unit: Option, + /// Writeable indicates that the datasource knows how to update this value + #[serde(rename = "writeable", skip_serializing_if = "Option::is_none")] + pub writeable: Option, +} + +impl FieldConfig { + pub fn new() -> FieldConfig { + FieldConfig { + color: None, + custom: None, + decimals: None, + description: None, + display_name: None, + display_name_from_ds: None, + filterable: None, + interval: None, + links: None, + mappings: None, + max: None, + min: None, + no_value: None, + path: None, + thresholds: None, + r#type: None, + unit: None, + writeable: None, + } + } +} + diff --git a/openapi/src/models/field_type_config.rs b/openapi/src/models/field_type_config.rs new file mode 100755 index 00000000..c187d780 --- /dev/null +++ b/openapi/src/models/field_type_config.rs @@ -0,0 +1,28 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// FieldTypeConfig : FieldTypeConfig has type specific configs, only one should be active at a time +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct FieldTypeConfig { + #[serde(rename = "enum", skip_serializing_if = "Option::is_none")] + pub r#enum: Option>, +} + +impl FieldTypeConfig { + /// FieldTypeConfig has type specific configs, only one should be active at a time + pub fn new() -> FieldTypeConfig { + FieldTypeConfig { + r#enum: None, + } + } +} + diff --git a/openapi/src/models/find_tags_result.rs b/openapi/src/models/find_tags_result.rs new file mode 100755 index 00000000..4686ed9e --- /dev/null +++ b/openapi/src/models/find_tags_result.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct FindTagsResult { + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, +} + +impl FindTagsResult { + pub fn new() -> FindTagsResult { + FindTagsResult { + tags: None, + } + } +} + diff --git a/openapi/src/models/float_histogram.rs b/openapi/src/models/float_histogram.rs new file mode 100755 index 00000000..dc9c843e --- /dev/null +++ b/openapi/src/models/float_histogram.rs @@ -0,0 +1,57 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// FloatHistogram : A FloatHistogram is needed by PromQL to handle operations that might result in fractional counts. Since the counts in a histogram are unlikely to be too large to be represented precisely by a float64, a FloatHistogram can also be used to represent a histogram with integer counts and thus serves as a more generalized representation. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct FloatHistogram { + /// Total number of observations. Must be zero or positive. + #[serde(rename = "Count", skip_serializing_if = "Option::is_none")] + pub count: Option, + /// or alternatively that we are dealing with a gauge histogram, where counter resets do not apply. + #[serde(rename = "CounterResetHint", skip_serializing_if = "Option::is_none")] + pub counter_reset_hint: Option, + /// Observation counts in buckets. Each represents an absolute count and must be zero or positive. + #[serde(rename = "PositiveBuckets", skip_serializing_if = "Option::is_none")] + pub positive_buckets: Option>, + /// Spans for positive and negative buckets (see Span below). + #[serde(rename = "PositiveSpans", skip_serializing_if = "Option::is_none")] + pub positive_spans: Option>, + /// Currently valid schema numbers are -4 <= n <= 8. They are all for base-2 bucket schemas, where 1 is a bucket boundary in each case, and then each power of two is divided into 2^n logarithmic buckets. Or in other words, each bucket boundary is the previous boundary times 2^(2^-n). + #[serde(rename = "Schema", skip_serializing_if = "Option::is_none")] + pub schema: Option, + /// Sum of observations. This is also used as the stale marker. + #[serde(rename = "Sum", skip_serializing_if = "Option::is_none")] + pub sum: Option, + /// Observations falling into the zero bucket. Must be zero or positive. + #[serde(rename = "ZeroCount", skip_serializing_if = "Option::is_none")] + pub zero_count: Option, + /// Width of the zero bucket. + #[serde(rename = "ZeroThreshold", skip_serializing_if = "Option::is_none")] + pub zero_threshold: Option, +} + +impl FloatHistogram { + /// A FloatHistogram is needed by PromQL to handle operations that might result in fractional counts. Since the counts in a histogram are unlikely to be too large to be represented precisely by a float64, a FloatHistogram can also be used to represent a histogram with integer counts and thus serves as a more generalized representation. + pub fn new() -> FloatHistogram { + FloatHistogram { + count: None, + counter_reset_hint: None, + positive_buckets: None, + positive_spans: None, + schema: None, + sum: None, + zero_count: None, + zero_threshold: None, + } + } +} + diff --git a/openapi/src/models/folder.rs b/openapi/src/models/folder.rs new file mode 100755 index 00000000..1050446a --- /dev/null +++ b/openapi/src/models/folder.rs @@ -0,0 +1,81 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Folder { + /// Metadata contains user accesses for a given resource Ex: map[string]bool{\"create\":true, \"delete\": true} + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "canAdmin", skip_serializing_if = "Option::is_none")] + pub can_admin: Option, + #[serde(rename = "canDelete", skip_serializing_if = "Option::is_none")] + pub can_delete: Option, + #[serde(rename = "canEdit", skip_serializing_if = "Option::is_none")] + pub can_edit: Option, + #[serde(rename = "canSave", skip_serializing_if = "Option::is_none")] + pub can_save: Option, + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "createdBy", skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[serde(rename = "hasAcl", skip_serializing_if = "Option::is_none")] + pub has_acl: Option, + /// Deprecated: use UID instead + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + /// only used if nested folders are enabled + #[serde(rename = "parentUid", skip_serializing_if = "Option::is_none")] + pub parent_uid: Option, + /// the parent folders starting from the root going down + #[serde(rename = "parents", skip_serializing_if = "Option::is_none")] + pub parents: Option>, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "updatedBy", skip_serializing_if = "Option::is_none")] + pub updated_by: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl Folder { + pub fn new() -> Folder { + Folder { + access_control: None, + can_admin: None, + can_delete: None, + can_edit: None, + can_save: None, + created: None, + created_by: None, + has_acl: None, + id: None, + org_id: None, + parent_uid: None, + parents: None, + title: None, + uid: None, + updated: None, + updated_by: None, + url: None, + version: None, + } + } +} + diff --git a/openapi/src/models/folder_search_hit.rs b/openapi/src/models/folder_search_hit.rs new file mode 100755 index 00000000..fee1c273 --- /dev/null +++ b/openapi/src/models/folder_search_hit.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct FolderSearchHit { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "parentUid", skip_serializing_if = "Option::is_none")] + pub parent_uid: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl FolderSearchHit { + pub fn new() -> FolderSearchHit { + FolderSearchHit { + id: None, + parent_uid: None, + title: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/forbidden_error.rs b/openapi/src/models/forbidden_error.rs new file mode 100755 index 00000000..a1659280 --- /dev/null +++ b/openapi/src/models/forbidden_error.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ForbiddenError { + #[serde(rename = "body", skip_serializing_if = "Option::is_none")] + pub body: Option>, +} + +impl ForbiddenError { + pub fn new() -> ForbiddenError { + ForbiddenError { + body: None, + } + } +} + diff --git a/openapi/src/models/frame.rs b/openapi/src/models/frame.rs new file mode 100755 index 00000000..b82a5950 --- /dev/null +++ b/openapi/src/models/frame.rs @@ -0,0 +1,40 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Frame : Each Field is well typed by its FieldType and supports optional Labels. A Frame is a general data container for Grafana. A Frame can be table data or time series data depending on its content and field types. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Frame { + /// Fields are the columns of a frame. All Fields must be of the same the length when marshalling the Frame for transmission. There should be no `nil` entries in the Fields slice (making them pointers was a mistake). + #[serde(rename = "Fields", skip_serializing_if = "Option::is_none")] + pub fields: Option>, + #[serde(rename = "Meta", skip_serializing_if = "Option::is_none")] + pub meta: Option>, + /// Name is used in some Grafana visualizations. + #[serde(rename = "Name", skip_serializing_if = "Option::is_none")] + pub name: Option, + /// RefID is a property that can be set to match a Frame to its originating query. + #[serde(rename = "RefID", skip_serializing_if = "Option::is_none")] + pub ref_id: Option, +} + +impl Frame { + /// Each Field is well typed by its FieldType and supports optional Labels. A Frame is a general data container for Grafana. A Frame can be table data or time series data depending on its content and field types. + pub fn new() -> Frame { + Frame { + fields: None, + meta: None, + name: None, + ref_id: None, + } + } +} + diff --git a/openapi/src/models/frame_meta.rs b/openapi/src/models/frame_meta.rs new file mode 100755 index 00000000..3e4a69b5 --- /dev/null +++ b/openapi/src/models/frame_meta.rs @@ -0,0 +1,75 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// FrameMeta : https://github.com/grafana/grafana/blob/master/packages/grafana-data/src/types/data.ts#L11 NOTE -- in javascript this can accept any `[key: string]: any;` however this interface only exposes the values we want to be exposed +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct FrameMeta { + /// Channel is the path to a stream in grafana live that has real-time updates for this data. + #[serde(rename = "channel", skip_serializing_if = "Option::is_none")] + pub channel: Option, + /// Custom datasource specific values. + #[serde(rename = "custom", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")] + pub custom: Option>, + /// nolint:revive + #[serde(rename = "dataTopic", skip_serializing_if = "Option::is_none")] + pub data_topic: Option, + /// ExecutedQueryString is the raw query sent to the underlying system. All macros and templating have been applied. When metadata contains this value, it will be shown in the query inspector. + #[serde(rename = "executedQueryString", skip_serializing_if = "Option::is_none")] + pub executed_query_string: Option, + /// Notices provide additional information about the data in the Frame that Grafana can display to the user in the user interface. + #[serde(rename = "notices", skip_serializing_if = "Option::is_none")] + pub notices: Option>, + /// Path is a browsable path on the datasource. + #[serde(rename = "path", skip_serializing_if = "Option::is_none")] + pub path: Option, + /// PathSeparator defines the separator pattern to decode a hierarchy. The default separator is '/'. + #[serde(rename = "pathSeparator", skip_serializing_if = "Option::is_none")] + pub path_separator: Option, + /// PreferredVisualizationPluginId sets the panel plugin id to use to render the data when using Explore. If the plugin cannot be found will fall back to PreferredVisualization. + #[serde(rename = "preferredVisualisationPluginId", skip_serializing_if = "Option::is_none")] + pub preferred_visualisation_plugin_id: Option, + #[serde(rename = "preferredVisualisationType", skip_serializing_if = "Option::is_none")] + pub preferred_visualisation_type: Option, + /// Stats is an array of query result statistics. + #[serde(rename = "stats", skip_serializing_if = "Option::is_none")] + pub stats: Option>, + /// A FrameType string, when present in a frame's metadata, asserts that the frame's structure conforms to the FrameType's specification. This property is currently optional, so FrameType may be FrameTypeUnknown even if the properties of the Frame correspond to a defined FrameType. +enum + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "typeVersion", skip_serializing_if = "Option::is_none")] + pub type_version: Option>, + /// Array of field indices which values create a unique id for each row. Ideally this should be globally unique ID but that isn't guarantied. Should help with keeping track and deduplicating rows in visualizations, especially with streaming data with frequent updates. + #[serde(rename = "uniqueRowIdFields", skip_serializing_if = "Option::is_none")] + pub unique_row_id_fields: Option>, +} + +impl FrameMeta { + /// https://github.com/grafana/grafana/blob/master/packages/grafana-data/src/types/data.ts#L11 NOTE -- in javascript this can accept any `[key: string]: any;` however this interface only exposes the values we want to be exposed + pub fn new() -> FrameMeta { + FrameMeta { + channel: None, + custom: None, + data_topic: None, + executed_query_string: None, + notices: None, + path: None, + path_separator: None, + preferred_visualisation_plugin_id: None, + preferred_visualisation_type: None, + stats: None, + r#type: None, + type_version: None, + unique_row_id_fields: None, + } + } +} + diff --git a/openapi/src/models/generic_public_error.rs b/openapi/src/models/generic_public_error.rs new file mode 100755 index 00000000..c7d34cbd --- /dev/null +++ b/openapi/src/models/generic_public_error.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GenericPublicError { + #[serde(rename = "body", skip_serializing_if = "Option::is_none")] + pub body: Option>, +} + +impl GenericPublicError { + pub fn new() -> GenericPublicError { + GenericPublicError { + body: None, + } + } +} + diff --git a/openapi/src/models/get_annotation_tags_response.rs b/openapi/src/models/get_annotation_tags_response.rs new file mode 100755 index 00000000..ebc11120 --- /dev/null +++ b/openapi/src/models/get_annotation_tags_response.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GetAnnotationTagsResponse { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl GetAnnotationTagsResponse { + pub fn new() -> GetAnnotationTagsResponse { + GetAnnotationTagsResponse { + result: None, + } + } +} + diff --git a/openapi/src/models/get_data_source_id_by_name_200_response.rs b/openapi/src/models/get_data_source_id_by_name_200_response.rs new file mode 100755 index 00000000..1fd9f796 --- /dev/null +++ b/openapi/src/models/get_data_source_id_by_name_200_response.rs @@ -0,0 +1,27 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GetDataSourceIdByName200Response { + /// ID Identifier of the data source. + #[serde(rename = "id")] + pub id: i64, +} + +impl GetDataSourceIdByName200Response { + pub fn new(id: i64) -> GetDataSourceIdByName200Response { + GetDataSourceIdByName200Response { + id, + } + } +} + diff --git a/openapi/src/models/get_home_dashboard_response.rs b/openapi/src/models/get_home_dashboard_response.rs new file mode 100755 index 00000000..ba4baba7 --- /dev/null +++ b/openapi/src/models/get_home_dashboard_response.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GetHomeDashboardResponse { + #[serde(rename = "dashboard", skip_serializing_if = "Option::is_none")] + pub dashboard: Option, + #[serde(rename = "meta", skip_serializing_if = "Option::is_none")] + pub meta: Option>, + #[serde(rename = "redirectUri", skip_serializing_if = "Option::is_none")] + pub redirect_uri: Option, +} + +impl GetHomeDashboardResponse { + pub fn new() -> GetHomeDashboardResponse { + GetHomeDashboardResponse { + dashboard: None, + meta: None, + redirect_uri: None, + } + } +} + diff --git a/openapi/src/models/get_sharing_options_200_response.rs b/openapi/src/models/get_sharing_options_200_response.rs new file mode 100755 index 00000000..f810434f --- /dev/null +++ b/openapi/src/models/get_sharing_options_200_response.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GetSharingOptions200Response { + #[serde(rename = "externalEnabled", skip_serializing_if = "Option::is_none")] + pub external_enabled: Option, + #[serde(rename = "externalSnapshotName", skip_serializing_if = "Option::is_none")] + pub external_snapshot_name: Option, + #[serde(rename = "externalSnapshotURL", skip_serializing_if = "Option::is_none")] + pub external_snapshot_url: Option, +} + +impl GetSharingOptions200Response { + pub fn new() -> GetSharingOptions200Response { + GetSharingOptions200Response { + external_enabled: None, + external_snapshot_name: None, + external_snapshot_url: None, + } + } +} + diff --git a/openapi/src/models/gettable_alert.rs b/openapi/src/models/gettable_alert.rs new file mode 100755 index 00000000..c98e84ff --- /dev/null +++ b/openapi/src/models/gettable_alert.rs @@ -0,0 +1,60 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// GettableAlert : GettableAlert gettable alert +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableAlert { + /// LabelSet label set + #[serde(rename = "annotations")] + pub annotations: std::collections::HashMap, + /// ends at + #[serde(rename = "endsAt")] + pub ends_at: String, + /// fingerprint + #[serde(rename = "fingerprint")] + pub fingerprint: String, + /// generator URL Format: uri + #[serde(rename = "generatorURL", skip_serializing_if = "Option::is_none")] + pub generator_url: Option, + /// LabelSet label set + #[serde(rename = "labels")] + pub labels: std::collections::HashMap, + /// receivers + #[serde(rename = "receivers")] + pub receivers: Vec, + /// starts at + #[serde(rename = "startsAt")] + pub starts_at: String, + #[serde(rename = "status")] + pub status: Box, + /// updated at + #[serde(rename = "updatedAt")] + pub updated_at: String, +} + +impl GettableAlert { + /// GettableAlert gettable alert + pub fn new(annotations: std::collections::HashMap, ends_at: String, fingerprint: String, labels: std::collections::HashMap, receivers: Vec, starts_at: String, status: models::AlertStatus, updated_at: String) -> GettableAlert { + GettableAlert { + annotations, + ends_at, + fingerprint, + generator_url: None, + labels, + receivers, + starts_at, + status: Box::new(status), + updated_at, + } + } +} + diff --git a/openapi/src/models/gettable_alertmanagers.rs b/openapi/src/models/gettable_alertmanagers.rs new file mode 100755 index 00000000..a07f477a --- /dev/null +++ b/openapi/src/models/gettable_alertmanagers.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableAlertmanagers { + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "status", skip_serializing_if = "Option::is_none")] + pub status: Option, +} + +impl GettableAlertmanagers { + pub fn new() -> GettableAlertmanagers { + GettableAlertmanagers { + data: None, + status: None, + } + } +} + diff --git a/openapi/src/models/gettable_api_alerting_config.rs b/openapi/src/models/gettable_api_alerting_config.rs new file mode 100755 index 00000000..7fcc4647 --- /dev/null +++ b/openapi/src/models/gettable_api_alerting_config.rs @@ -0,0 +1,49 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableApiAlertingConfig { + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option>, + #[serde(rename = "inhibit_rules", skip_serializing_if = "Option::is_none")] + pub inhibit_rules: Option>, + #[serde(rename = "muteTimeProvenances", skip_serializing_if = "Option::is_none")] + pub mute_time_provenances: Option>, + /// MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0. + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + /// Override with our superset receiver type + #[serde(rename = "receivers", skip_serializing_if = "Option::is_none")] + pub receivers: Option>, + #[serde(rename = "route", skip_serializing_if = "Option::is_none")] + pub route: Option>, + #[serde(rename = "templates", skip_serializing_if = "Option::is_none")] + pub templates: Option>, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl GettableApiAlertingConfig { + pub fn new() -> GettableApiAlertingConfig { + GettableApiAlertingConfig { + global: None, + inhibit_rules: None, + mute_time_provenances: None, + mute_time_intervals: None, + receivers: None, + route: None, + templates: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/gettable_api_receiver.rs b/openapi/src/models/gettable_api_receiver.rs new file mode 100755 index 00000000..99ac1884 --- /dev/null +++ b/openapi/src/models/gettable_api_receiver.rs @@ -0,0 +1,69 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableApiReceiver { + #[serde(rename = "discord_configs", skip_serializing_if = "Option::is_none")] + pub discord_configs: Option>, + #[serde(rename = "email_configs", skip_serializing_if = "Option::is_none")] + pub email_configs: Option>, + #[serde(rename = "grafana_managed_receiver_configs", skip_serializing_if = "Option::is_none")] + pub grafana_managed_receiver_configs: Option>, + #[serde(rename = "msteams_configs", skip_serializing_if = "Option::is_none")] + pub msteams_configs: Option>, + /// A unique identifier for this receiver. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "opsgenie_configs", skip_serializing_if = "Option::is_none")] + pub opsgenie_configs: Option>, + #[serde(rename = "pagerduty_configs", skip_serializing_if = "Option::is_none")] + pub pagerduty_configs: Option>, + #[serde(rename = "pushover_configs", skip_serializing_if = "Option::is_none")] + pub pushover_configs: Option>, + #[serde(rename = "slack_configs", skip_serializing_if = "Option::is_none")] + pub slack_configs: Option>, + #[serde(rename = "sns_configs", skip_serializing_if = "Option::is_none")] + pub sns_configs: Option>, + #[serde(rename = "telegram_configs", skip_serializing_if = "Option::is_none")] + pub telegram_configs: Option>, + #[serde(rename = "victorops_configs", skip_serializing_if = "Option::is_none")] + pub victorops_configs: Option>, + #[serde(rename = "webex_configs", skip_serializing_if = "Option::is_none")] + pub webex_configs: Option>, + #[serde(rename = "webhook_configs", skip_serializing_if = "Option::is_none")] + pub webhook_configs: Option>, + #[serde(rename = "wechat_configs", skip_serializing_if = "Option::is_none")] + pub wechat_configs: Option>, +} + +impl GettableApiReceiver { + pub fn new() -> GettableApiReceiver { + GettableApiReceiver { + discord_configs: None, + email_configs: None, + grafana_managed_receiver_configs: None, + msteams_configs: None, + name: None, + opsgenie_configs: None, + pagerduty_configs: None, + pushover_configs: None, + slack_configs: None, + sns_configs: None, + telegram_configs: None, + victorops_configs: None, + webex_configs: None, + webhook_configs: None, + wechat_configs: None, + } + } +} + diff --git a/openapi/src/models/gettable_extended_rule_node.rs b/openapi/src/models/gettable_extended_rule_node.rs new file mode 100755 index 00000000..120dfda7 --- /dev/null +++ b/openapi/src/models/gettable_extended_rule_node.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableExtendedRuleNode { + #[serde(rename = "alert", skip_serializing_if = "Option::is_none")] + pub alert: Option, + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + #[serde(rename = "expr", skip_serializing_if = "Option::is_none")] + pub expr: Option, + #[serde(rename = "for", skip_serializing_if = "Option::is_none")] + pub r#for: Option, + #[serde(rename = "grafana_alert", skip_serializing_if = "Option::is_none")] + pub grafana_alert: Option>, + #[serde(rename = "keep_firing_for", skip_serializing_if = "Option::is_none")] + pub keep_firing_for: Option, + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "record", skip_serializing_if = "Option::is_none")] + pub record: Option, +} + +impl GettableExtendedRuleNode { + pub fn new() -> GettableExtendedRuleNode { + GettableExtendedRuleNode { + alert: None, + annotations: None, + expr: None, + r#for: None, + grafana_alert: None, + keep_firing_for: None, + labels: None, + record: None, + } + } +} + diff --git a/openapi/src/models/gettable_grafana_receiver.rs b/openapi/src/models/gettable_grafana_receiver.rs new file mode 100755 index 00000000..975f303c --- /dev/null +++ b/openapi/src/models/gettable_grafana_receiver.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableGrafanaReceiver { + #[serde(rename = "disableResolveMessage", skip_serializing_if = "Option::is_none")] + pub disable_resolve_message: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "provenance", skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(rename = "secureFields", skip_serializing_if = "Option::is_none")] + pub secure_fields: Option>, + #[serde(rename = "settings", skip_serializing_if = "Option::is_none")] + pub settings: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl GettableGrafanaReceiver { + pub fn new() -> GettableGrafanaReceiver { + GettableGrafanaReceiver { + disable_resolve_message: None, + name: None, + provenance: None, + secure_fields: None, + settings: None, + r#type: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/gettable_grafana_receivers.rs b/openapi/src/models/gettable_grafana_receivers.rs new file mode 100755 index 00000000..7e7c09fb --- /dev/null +++ b/openapi/src/models/gettable_grafana_receivers.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableGrafanaReceivers { + #[serde(rename = "grafana_managed_receiver_configs", skip_serializing_if = "Option::is_none")] + pub grafana_managed_receiver_configs: Option>, +} + +impl GettableGrafanaReceivers { + pub fn new() -> GettableGrafanaReceivers { + GettableGrafanaReceivers { + grafana_managed_receiver_configs: None, + } + } +} + diff --git a/openapi/src/models/gettable_grafana_rule.rs b/openapi/src/models/gettable_grafana_rule.rs new file mode 100755 index 00000000..66e136f9 --- /dev/null +++ b/openapi/src/models/gettable_grafana_rule.rs @@ -0,0 +1,103 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableGrafanaRule { + #[serde(rename = "condition", skip_serializing_if = "Option::is_none")] + pub condition: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "exec_err_state", skip_serializing_if = "Option::is_none")] + pub exec_err_state: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "intervalSeconds", skip_serializing_if = "Option::is_none")] + pub interval_seconds: Option, + #[serde(rename = "is_paused", skip_serializing_if = "Option::is_none")] + pub is_paused: Option, + #[serde(rename = "namespace_uid", skip_serializing_if = "Option::is_none")] + pub namespace_uid: Option, + #[serde(rename = "no_data_state", skip_serializing_if = "Option::is_none")] + pub no_data_state: Option, + #[serde(rename = "notification_settings", skip_serializing_if = "Option::is_none")] + pub notification_settings: Option>, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "provenance", skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(rename = "rule_group", skip_serializing_if = "Option::is_none")] + pub rule_group: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl GettableGrafanaRule { + pub fn new() -> GettableGrafanaRule { + GettableGrafanaRule { + condition: None, + data: None, + exec_err_state: None, + id: None, + interval_seconds: None, + is_paused: None, + namespace_uid: None, + no_data_state: None, + notification_settings: None, + org_id: None, + provenance: None, + rule_group: None, + title: None, + uid: None, + updated: None, + version: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum ExecErrState { + #[serde(rename = "OK")] + Ok, + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "Error")] + Error, +} + +impl Default for ExecErrState { + fn default() -> ExecErrState { + Self::Ok + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum NoDataState { + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "NoData")] + NoData, + #[serde(rename = "OK")] + Ok, +} + +impl Default for NoDataState { + fn default() -> NoDataState { + Self::Alerting + } +} + diff --git a/openapi/src/models/gettable_historic_user_config.rs b/openapi/src/models/gettable_historic_user_config.rs new file mode 100755 index 00000000..c6522eb8 --- /dev/null +++ b/openapi/src/models/gettable_historic_user_config.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableHistoricUserConfig { + #[serde(rename = "alertmanager_config", skip_serializing_if = "Option::is_none")] + pub alertmanager_config: Option>, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "last_applied", skip_serializing_if = "Option::is_none")] + pub last_applied: Option, + #[serde(rename = "template_file_provenances", skip_serializing_if = "Option::is_none")] + pub template_file_provenances: Option>, + #[serde(rename = "template_files", skip_serializing_if = "Option::is_none")] + pub template_files: Option>, +} + +impl GettableHistoricUserConfig { + pub fn new() -> GettableHistoricUserConfig { + GettableHistoricUserConfig { + alertmanager_config: None, + id: None, + last_applied: None, + template_file_provenances: None, + template_files: None, + } + } +} + diff --git a/openapi/src/models/gettable_n_galert_config.rs b/openapi/src/models/gettable_n_galert_config.rs new file mode 100755 index 00000000..33baa7db --- /dev/null +++ b/openapi/src/models/gettable_n_galert_config.rs @@ -0,0 +1,42 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableNGalertConfig { + #[serde(rename = "alertmanagersChoice", skip_serializing_if = "Option::is_none")] + pub alertmanagers_choice: Option, +} + +impl GettableNGalertConfig { + pub fn new() -> GettableNGalertConfig { + GettableNGalertConfig { + alertmanagers_choice: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum AlertmanagersChoice { + #[serde(rename = "all")] + All, + #[serde(rename = "internal")] + Internal, + #[serde(rename = "external")] + External, +} + +impl Default for AlertmanagersChoice { + fn default() -> AlertmanagersChoice { + Self::All + } +} + diff --git a/openapi/src/models/gettable_rule_group_config.rs b/openapi/src/models/gettable_rule_group_config.rs new file mode 100755 index 00000000..1db5dfb7 --- /dev/null +++ b/openapi/src/models/gettable_rule_group_config.rs @@ -0,0 +1,36 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableRuleGroupConfig { + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "rules", skip_serializing_if = "Option::is_none")] + pub rules: Option>, + #[serde(rename = "source_tenants", skip_serializing_if = "Option::is_none")] + pub source_tenants: Option>, +} + +impl GettableRuleGroupConfig { + pub fn new() -> GettableRuleGroupConfig { + GettableRuleGroupConfig { + interval: None, + name: None, + rules: None, + source_tenants: None, + } + } +} + diff --git a/openapi/src/models/gettable_silence.rs b/openapi/src/models/gettable_silence.rs new file mode 100755 index 00000000..198fb2c6 --- /dev/null +++ b/openapi/src/models/gettable_silence.rs @@ -0,0 +1,54 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableSilence { + /// comment + #[serde(rename = "comment")] + pub comment: String, + /// created by + #[serde(rename = "createdBy")] + pub created_by: String, + /// ends at + #[serde(rename = "endsAt")] + pub ends_at: String, + /// id + #[serde(rename = "id")] + pub id: String, + /// Matchers matchers + #[serde(rename = "matchers")] + pub matchers: Vec, + /// starts at + #[serde(rename = "startsAt")] + pub starts_at: String, + #[serde(rename = "status")] + pub status: Box, + /// updated at + #[serde(rename = "updatedAt")] + pub updated_at: String, +} + +impl GettableSilence { + pub fn new(comment: String, created_by: String, ends_at: String, id: String, matchers: Vec, starts_at: String, status: models::SilenceStatus, updated_at: String) -> GettableSilence { + GettableSilence { + comment, + created_by, + ends_at, + id, + matchers, + starts_at, + status: Box::new(status), + updated_at, + } + } +} + diff --git a/openapi/src/models/gettable_status.rs b/openapi/src/models/gettable_status.rs new file mode 100755 index 00000000..653abbfa --- /dev/null +++ b/openapi/src/models/gettable_status.rs @@ -0,0 +1,36 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableStatus { + #[serde(rename = "cluster")] + pub cluster: Box, + #[serde(rename = "config")] + pub config: Box, + /// uptime + #[serde(rename = "uptime")] + pub uptime: String, + #[serde(rename = "versionInfo")] + pub version_info: Box, +} + +impl GettableStatus { + pub fn new(cluster: models::ClusterStatus, config: models::PostableApiAlertingConfig, uptime: String, version_info: models::VersionInfo) -> GettableStatus { + GettableStatus { + cluster: Box::new(cluster), + config: Box::new(config), + uptime, + version_info: Box::new(version_info), + } + } +} + diff --git a/openapi/src/models/gettable_time_intervals.rs b/openapi/src/models/gettable_time_intervals.rs new file mode 100755 index 00000000..614c8dcb --- /dev/null +++ b/openapi/src/models/gettable_time_intervals.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableTimeIntervals { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "provenance", skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl GettableTimeIntervals { + pub fn new() -> GettableTimeIntervals { + GettableTimeIntervals { + name: None, + provenance: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/gettable_user_config.rs b/openapi/src/models/gettable_user_config.rs new file mode 100755 index 00000000..3d7c69d5 --- /dev/null +++ b/openapi/src/models/gettable_user_config.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GettableUserConfig { + #[serde(rename = "alertmanager_config", skip_serializing_if = "Option::is_none")] + pub alertmanager_config: Option>, + #[serde(rename = "template_file_provenances", skip_serializing_if = "Option::is_none")] + pub template_file_provenances: Option>, + #[serde(rename = "template_files", skip_serializing_if = "Option::is_none")] + pub template_files: Option>, +} + +impl GettableUserConfig { + pub fn new() -> GettableUserConfig { + GettableUserConfig { + alertmanager_config: None, + template_file_provenances: None, + template_files: None, + } + } +} + diff --git a/openapi/src/models/global_config.rs b/openapi/src/models/global_config.rs new file mode 100755 index 00000000..6993f331 --- /dev/null +++ b/openapi/src/models/global_config.rs @@ -0,0 +1,101 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// GlobalConfig : GlobalConfig defines configuration parameters that are valid globally unless overwritten. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct GlobalConfig { + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "opsgenie_api_key", skip_serializing_if = "Option::is_none")] + pub opsgenie_api_key: Option, + #[serde(rename = "opsgenie_api_key_file", skip_serializing_if = "Option::is_none")] + pub opsgenie_api_key_file: Option, + #[serde(rename = "opsgenie_api_url", skip_serializing_if = "Option::is_none")] + pub opsgenie_api_url: Option>, + #[serde(rename = "pagerduty_url", skip_serializing_if = "Option::is_none")] + pub pagerduty_url: Option>, + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "resolve_timeout", skip_serializing_if = "Option::is_none")] + pub resolve_timeout: Option, + #[serde(rename = "slack_api_url", skip_serializing_if = "Option::is_none")] + pub slack_api_url: Option>, + #[serde(rename = "slack_api_url_file", skip_serializing_if = "Option::is_none")] + pub slack_api_url_file: Option, + #[serde(rename = "smtp_auth_identity", skip_serializing_if = "Option::is_none")] + pub smtp_auth_identity: Option, + #[serde(rename = "smtp_auth_password", skip_serializing_if = "Option::is_none")] + pub smtp_auth_password: Option, + #[serde(rename = "smtp_auth_password_file", skip_serializing_if = "Option::is_none")] + pub smtp_auth_password_file: Option, + #[serde(rename = "smtp_auth_secret", skip_serializing_if = "Option::is_none")] + pub smtp_auth_secret: Option, + #[serde(rename = "smtp_auth_username", skip_serializing_if = "Option::is_none")] + pub smtp_auth_username: Option, + #[serde(rename = "smtp_from", skip_serializing_if = "Option::is_none")] + pub smtp_from: Option, + #[serde(rename = "smtp_hello", skip_serializing_if = "Option::is_none")] + pub smtp_hello: Option, + #[serde(rename = "smtp_require_tls", skip_serializing_if = "Option::is_none")] + pub smtp_require_tls: Option, + #[serde(rename = "smtp_smarthost", skip_serializing_if = "Option::is_none")] + pub smtp_smarthost: Option>, + #[serde(rename = "telegram_api_url", skip_serializing_if = "Option::is_none")] + pub telegram_api_url: Option>, + #[serde(rename = "victorops_api_key", skip_serializing_if = "Option::is_none")] + pub victorops_api_key: Option, + #[serde(rename = "victorops_api_key_file", skip_serializing_if = "Option::is_none")] + pub victorops_api_key_file: Option, + #[serde(rename = "victorops_api_url", skip_serializing_if = "Option::is_none")] + pub victorops_api_url: Option>, + #[serde(rename = "webex_api_url", skip_serializing_if = "Option::is_none")] + pub webex_api_url: Option>, + #[serde(rename = "wechat_api_corp_id", skip_serializing_if = "Option::is_none")] + pub wechat_api_corp_id: Option, + #[serde(rename = "wechat_api_secret", skip_serializing_if = "Option::is_none")] + pub wechat_api_secret: Option, + #[serde(rename = "wechat_api_url", skip_serializing_if = "Option::is_none")] + pub wechat_api_url: Option>, +} + +impl GlobalConfig { + /// GlobalConfig defines configuration parameters that are valid globally unless overwritten. + pub fn new() -> GlobalConfig { + GlobalConfig { + http_config: None, + opsgenie_api_key: None, + opsgenie_api_key_file: None, + opsgenie_api_url: None, + pagerduty_url: None, + resolve_timeout: None, + slack_api_url: None, + slack_api_url_file: None, + smtp_auth_identity: None, + smtp_auth_password: None, + smtp_auth_password_file: None, + smtp_auth_secret: None, + smtp_auth_username: None, + smtp_from: None, + smtp_hello: None, + smtp_require_tls: None, + smtp_smarthost: None, + telegram_api_url: None, + victorops_api_key: None, + victorops_api_key_file: None, + victorops_api_url: None, + webex_api_url: None, + wechat_api_corp_id: None, + wechat_api_secret: None, + wechat_api_url: None, + } + } +} + diff --git a/openapi/src/models/hit.rs b/openapi/src/models/hit.rs new file mode 100755 index 00000000..a51fe1d4 --- /dev/null +++ b/openapi/src/models/hit.rs @@ -0,0 +1,69 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Hit { + /// Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + #[serde(rename = "folderTitle", skip_serializing_if = "Option::is_none")] + pub folder_title: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "folderUrl", skip_serializing_if = "Option::is_none")] + pub folder_url: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isStarred", skip_serializing_if = "Option::is_none")] + pub is_starred: Option, + #[serde(rename = "slug", skip_serializing_if = "Option::is_none")] + pub slug: Option, + #[serde(rename = "sortMeta", skip_serializing_if = "Option::is_none")] + pub sort_meta: Option, + #[serde(rename = "sortMetaName", skip_serializing_if = "Option::is_none")] + pub sort_meta_name: Option, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "uri", skip_serializing_if = "Option::is_none")] + pub uri: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl Hit { + pub fn new() -> Hit { + Hit { + folder_id: None, + folder_title: None, + folder_uid: None, + folder_url: None, + id: None, + is_starred: None, + slug: None, + sort_meta: None, + sort_meta_name: None, + tags: None, + title: None, + r#type: None, + uid: None, + uri: None, + url: None, + } + } +} + diff --git a/openapi/src/models/host_port.rs b/openapi/src/models/host_port.rs new file mode 100755 index 00000000..8e2a9998 --- /dev/null +++ b/openapi/src/models/host_port.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct HostPort { + #[serde(rename = "Host", skip_serializing_if = "Option::is_none")] + pub host: Option, + #[serde(rename = "Port", skip_serializing_if = "Option::is_none")] + pub port: Option, +} + +impl HostPort { + pub fn new() -> HostPort { + HostPort { + host: None, + port: None, + } + } +} + diff --git a/openapi/src/models/http_client_config.rs b/openapi/src/models/http_client_config.rs new file mode 100755 index 00000000..1943187e --- /dev/null +++ b/openapi/src/models/http_client_config.rs @@ -0,0 +1,64 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct HttpClientConfig { + #[serde(rename = "authorization", skip_serializing_if = "Option::is_none")] + pub authorization: Option>, + #[serde(rename = "basic_auth", skip_serializing_if = "Option::is_none")] + pub basic_auth: Option>, + #[serde(rename = "bearer_token", skip_serializing_if = "Option::is_none")] + pub bearer_token: Option, + /// The bearer token file for the targets. Deprecated in favour of Authorization.CredentialsFile. + #[serde(rename = "bearer_token_file", skip_serializing_if = "Option::is_none")] + pub bearer_token_file: Option, + /// EnableHTTP2 specifies whether the client should configure HTTP2. The omitempty flag is not set, because it would be hidden from the marshalled configuration when set to false. + #[serde(rename = "enable_http2", skip_serializing_if = "Option::is_none")] + pub enable_http2: Option, + /// FollowRedirects specifies whether the client should follow HTTP 3xx redirects. The omitempty flag is not set, because it would be hidden from the marshalled configuration when set to false. + #[serde(rename = "follow_redirects", skip_serializing_if = "Option::is_none")] + pub follow_redirects: Option, + /// NoProxy contains addresses that should not use a proxy. + #[serde(rename = "no_proxy", skip_serializing_if = "Option::is_none")] + pub no_proxy: Option, + #[serde(rename = "oauth2", skip_serializing_if = "Option::is_none")] + pub oauth2: Option>, + #[serde(rename = "proxy_connect_header", skip_serializing_if = "Option::is_none")] + pub proxy_connect_header: Option>>, + /// ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function to determine proxies. + #[serde(rename = "proxy_from_environment", skip_serializing_if = "Option::is_none")] + pub proxy_from_environment: Option, + #[serde(rename = "proxy_url", skip_serializing_if = "Option::is_none")] + pub proxy_url: Option>, + #[serde(rename = "tls_config", skip_serializing_if = "Option::is_none")] + pub tls_config: Option>, +} + +impl HttpClientConfig { + pub fn new() -> HttpClientConfig { + HttpClientConfig { + authorization: None, + basic_auth: None, + bearer_token: None, + bearer_token_file: None, + enable_http2: None, + follow_redirects: None, + no_proxy: None, + oauth2: None, + proxy_connect_header: None, + proxy_from_environment: None, + proxy_url: None, + tls_config: None, + } + } +} + diff --git a/openapi/src/models/import_dashboard_input.rs b/openapi/src/models/import_dashboard_input.rs new file mode 100755 index 00000000..91bc33e8 --- /dev/null +++ b/openapi/src/models/import_dashboard_input.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ImportDashboardInput { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "pluginId", skip_serializing_if = "Option::is_none")] + pub plugin_id: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "value", skip_serializing_if = "Option::is_none")] + pub value: Option, +} + +impl ImportDashboardInput { + pub fn new() -> ImportDashboardInput { + ImportDashboardInput { + name: None, + plugin_id: None, + r#type: None, + value: None, + } + } +} + diff --git a/openapi/src/models/import_dashboard_request.rs b/openapi/src/models/import_dashboard_request.rs new file mode 100755 index 00000000..0f167be7 --- /dev/null +++ b/openapi/src/models/import_dashboard_request.rs @@ -0,0 +1,45 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ImportDashboardRequest { + #[serde(rename = "dashboard", skip_serializing_if = "Option::is_none")] + pub dashboard: Option, + /// Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "inputs", skip_serializing_if = "Option::is_none")] + pub inputs: Option>, + #[serde(rename = "overwrite", skip_serializing_if = "Option::is_none")] + pub overwrite: Option, + #[serde(rename = "path", skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(rename = "pluginId", skip_serializing_if = "Option::is_none")] + pub plugin_id: Option, +} + +impl ImportDashboardRequest { + pub fn new() -> ImportDashboardRequest { + ImportDashboardRequest { + dashboard: None, + folder_id: None, + folder_uid: None, + inputs: None, + overwrite: None, + path: None, + plugin_id: None, + } + } +} + diff --git a/openapi/src/models/import_dashboard_response.rs b/openapi/src/models/import_dashboard_response.rs new file mode 100755 index 00000000..31448859 --- /dev/null +++ b/openapi/src/models/import_dashboard_response.rs @@ -0,0 +1,69 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ImportDashboardResponse { + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "imported", skip_serializing_if = "Option::is_none")] + pub imported: Option, + #[serde(rename = "importedRevision", skip_serializing_if = "Option::is_none")] + pub imported_revision: Option, + #[serde(rename = "importedUri", skip_serializing_if = "Option::is_none")] + pub imported_uri: Option, + #[serde(rename = "importedUrl", skip_serializing_if = "Option::is_none")] + pub imported_url: Option, + #[serde(rename = "path", skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(rename = "pluginId", skip_serializing_if = "Option::is_none")] + pub plugin_id: Option, + #[serde(rename = "removed", skip_serializing_if = "Option::is_none")] + pub removed: Option, + #[serde(rename = "revision", skip_serializing_if = "Option::is_none")] + pub revision: Option, + #[serde(rename = "slug", skip_serializing_if = "Option::is_none")] + pub slug: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl ImportDashboardResponse { + pub fn new() -> ImportDashboardResponse { + ImportDashboardResponse { + dashboard_id: None, + description: None, + folder_id: None, + folder_uid: None, + imported: None, + imported_revision: None, + imported_uri: None, + imported_url: None, + path: None, + plugin_id: None, + removed: None, + revision: None, + slug: None, + title: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/inhibit_rule.rs b/openapi/src/models/inhibit_rule.rs new file mode 100755 index 00000000..e8d5f06e --- /dev/null +++ b/openapi/src/models/inhibit_rule.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// InhibitRule : InhibitRule defines an inhibition rule that mutes alerts that match the target labels if an alert matching the source labels exists. Both alerts have to have a set of labels being equal. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct InhibitRule { + #[serde(rename = "equal", skip_serializing_if = "Option::is_none")] + pub equal: Option>, + /// SourceMatch defines a set of labels that have to equal the given value for source alerts. Deprecated. Remove before v1.0 release. + #[serde(rename = "source_match", skip_serializing_if = "Option::is_none")] + pub source_match: Option>, + #[serde(rename = "source_match_re", skip_serializing_if = "Option::is_none")] + pub source_match_re: Option>, + /// Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. + #[serde(rename = "source_matchers", skip_serializing_if = "Option::is_none")] + pub source_matchers: Option>, + /// TargetMatch defines a set of labels that have to equal the given value for target alerts. Deprecated. Remove before v1.0 release. + #[serde(rename = "target_match", skip_serializing_if = "Option::is_none")] + pub target_match: Option>, + #[serde(rename = "target_match_re", skip_serializing_if = "Option::is_none")] + pub target_match_re: Option>, + /// Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. + #[serde(rename = "target_matchers", skip_serializing_if = "Option::is_none")] + pub target_matchers: Option>, +} + +impl InhibitRule { + /// InhibitRule defines an inhibition rule that mutes alerts that match the target labels if an alert matching the source labels exists. Both alerts have to have a set of labels being equal. + pub fn new() -> InhibitRule { + InhibitRule { + equal: None, + source_match: None, + source_match_re: None, + source_matchers: None, + target_match: None, + target_match_re: None, + target_matchers: None, + } + } +} + diff --git a/openapi/src/models/integration.rs b/openapi/src/models/integration.rs new file mode 100755 index 00000000..0ccf0cf6 --- /dev/null +++ b/openapi/src/models/integration.rs @@ -0,0 +1,45 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Integration : Integration integration +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Integration { + /// A timestamp indicating the last attempt to deliver a notification regardless of the outcome. Format: date-time + #[serde(rename = "lastNotifyAttempt", skip_serializing_if = "Option::is_none")] + pub last_notify_attempt: Option, + /// Duration of the last attempt to deliver a notification in humanized format (`1s` or `15ms`, etc). + #[serde(rename = "lastNotifyAttemptDuration", skip_serializing_if = "Option::is_none")] + pub last_notify_attempt_duration: Option, + /// Error string for the last attempt to deliver a notification. Empty if the last attempt was successful. + #[serde(rename = "lastNotifyAttemptError", skip_serializing_if = "Option::is_none")] + pub last_notify_attempt_error: Option, + /// name + #[serde(rename = "name")] + pub name: String, + /// send resolved + #[serde(rename = "sendResolved")] + pub send_resolved: bool, +} + +impl Integration { + /// Integration integration + pub fn new(name: String, send_resolved: bool) -> Integration { + Integration { + last_notify_attempt: None, + last_notify_attempt_duration: None, + last_notify_attempt_error: None, + name, + send_resolved, + } + } +} + diff --git a/openapi/src/models/internal_data_link.rs b/openapi/src/models/internal_data_link.rs new file mode 100755 index 00000000..feb99140 --- /dev/null +++ b/openapi/src/models/internal_data_link.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// InternalDataLink : InternalDataLink definition to allow Explore links to be constructed in the backend +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct InternalDataLink { + #[serde(rename = "datasourceName", skip_serializing_if = "Option::is_none")] + pub datasource_name: Option, + #[serde(rename = "datasourceUid", skip_serializing_if = "Option::is_none")] + pub datasource_uid: Option, + /// This is an object constructed with the keys as the values of the enum VisType and the value being a bag of properties + #[serde(rename = "panelsState", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")] + pub panels_state: Option>, + #[serde(rename = "query", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")] + pub query: Option>, + #[serde(rename = "timeRange", skip_serializing_if = "Option::is_none")] + pub time_range: Option>, + #[serde(rename = "transformations", skip_serializing_if = "Option::is_none")] + pub transformations: Option>, +} + +impl InternalDataLink { + /// InternalDataLink definition to allow Explore links to be constructed in the backend + pub fn new() -> InternalDataLink { + InternalDataLink { + datasource_name: None, + datasource_uid: None, + panels_state: None, + query: None, + time_range: None, + transformations: None, + } + } +} + diff --git a/openapi/src/models/ip_net.rs b/openapi/src/models/ip_net.rs new file mode 100755 index 00000000..b49da88b --- /dev/null +++ b/openapi/src/models/ip_net.rs @@ -0,0 +1,30 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct IpNet { + #[serde(rename = "IP", skip_serializing_if = "Option::is_none")] + pub ip: Option, + /// See type IPNet and func ParseCIDR for details. + #[serde(rename = "Mask", skip_serializing_if = "Option::is_none")] + pub mask: Option>, +} + +impl IpNet { + pub fn new() -> IpNet { + IpNet { + ip: None, + mask: None, + } + } +} + diff --git a/openapi/src/models/json_web_key.rs b/openapi/src/models/json_web_key.rs new file mode 100755 index 00000000..c545a72e --- /dev/null +++ b/openapi/src/models/json_web_key.rs @@ -0,0 +1,56 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// JsonWebKey : JSONWebKey represents a public or private key in JWK format. It can be marshaled into JSON and unmarshaled from JSON. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct JsonWebKey { + /// Key algorithm, parsed from `alg` header. + #[serde(rename = "Algorithm", skip_serializing_if = "Option::is_none")] + pub algorithm: Option, + /// X.509 certificate thumbprint (SHA-1), parsed from `x5t` header. + #[serde(rename = "CertificateThumbprintSHA1", skip_serializing_if = "Option::is_none")] + pub certificate_thumbprint_sha1: Option>, + /// X.509 certificate thumbprint (SHA-256), parsed from `x5t#S256` header. + #[serde(rename = "CertificateThumbprintSHA256", skip_serializing_if = "Option::is_none")] + pub certificate_thumbprint_sha256: Option>, + /// X.509 certificate chain, parsed from `x5c` header. + #[serde(rename = "Certificates", skip_serializing_if = "Option::is_none")] + pub certificates: Option>, + #[serde(rename = "CertificatesURL", skip_serializing_if = "Option::is_none")] + pub certificates_url: Option>, + /// Key is the Go in-memory representation of this key. It must have one of these types: ed25519.PublicKey ed25519.PrivateKey ecdsa.PublicKey ecdsa.PrivateKey rsa.PublicKey rsa.PrivateKey []byte (a symmetric key) When marshaling this JSONWebKey into JSON, the \"kty\" header parameter will be automatically set based on the type of this field. + #[serde(rename = "Key", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")] + pub key: Option>, + /// Key identifier, parsed from `kid` header. + #[serde(rename = "KeyID", skip_serializing_if = "Option::is_none")] + pub key_id: Option, + /// Key use, parsed from `use` header. + #[serde(rename = "Use", skip_serializing_if = "Option::is_none")] + pub r#use: Option, +} + +impl JsonWebKey { + /// JSONWebKey represents a public or private key in JWK format. It can be marshaled into JSON and unmarshaled from JSON. + pub fn new() -> JsonWebKey { + JsonWebKey { + algorithm: None, + certificate_thumbprint_sha1: None, + certificate_thumbprint_sha256: None, + certificates: None, + certificates_url: None, + key: None, + key_id: None, + r#use: None, + } + } +} + diff --git a/openapi/src/models/label.rs b/openapi/src/models/label.rs new file mode 100755 index 00000000..e0473f97 --- /dev/null +++ b/openapi/src/models/label.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Label { + #[serde(rename = "Name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl Label { + pub fn new() -> Label { + Label { + name: None, + } + } +} + diff --git a/openapi/src/models/library_element_array_response.rs b/openapi/src/models/library_element_array_response.rs new file mode 100755 index 00000000..ca03bd9e --- /dev/null +++ b/openapi/src/models/library_element_array_response.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementArrayResponse { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl LibraryElementArrayResponse { + pub fn new() -> LibraryElementArrayResponse { + LibraryElementArrayResponse { + result: None, + } + } +} + diff --git a/openapi/src/models/library_element_connection_dto.rs b/openapi/src/models/library_element_connection_dto.rs new file mode 100755 index 00000000..8421ee42 --- /dev/null +++ b/openapi/src/models/library_element_connection_dto.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementConnectionDto { + #[serde(rename = "connectionId", skip_serializing_if = "Option::is_none")] + pub connection_id: Option, + #[serde(rename = "connectionUid", skip_serializing_if = "Option::is_none")] + pub connection_uid: Option, + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "createdBy", skip_serializing_if = "Option::is_none")] + pub created_by: Option>, + #[serde(rename = "elementId", skip_serializing_if = "Option::is_none")] + pub element_id: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, +} + +impl LibraryElementConnectionDto { + pub fn new() -> LibraryElementConnectionDto { + LibraryElementConnectionDto { + connection_id: None, + connection_uid: None, + created: None, + created_by: None, + element_id: None, + id: None, + kind: None, + } + } +} + diff --git a/openapi/src/models/library_element_connections_response.rs b/openapi/src/models/library_element_connections_response.rs new file mode 100755 index 00000000..f02dedbb --- /dev/null +++ b/openapi/src/models/library_element_connections_response.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementConnectionsResponse { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl LibraryElementConnectionsResponse { + pub fn new() -> LibraryElementConnectionsResponse { + LibraryElementConnectionsResponse { + result: None, + } + } +} + diff --git a/openapi/src/models/library_element_dto.rs b/openapi/src/models/library_element_dto.rs new file mode 100755 index 00000000..5bf80731 --- /dev/null +++ b/openapi/src/models/library_element_dto.rs @@ -0,0 +1,63 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementDto { + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, + #[serde(rename = "meta", skip_serializing_if = "Option::is_none")] + pub meta: Option>, + #[serde(rename = "model", skip_serializing_if = "Option::is_none")] + pub model: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "schemaVersion", skip_serializing_if = "Option::is_none")] + pub schema_version: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl LibraryElementDto { + pub fn new() -> LibraryElementDto { + LibraryElementDto { + description: None, + folder_id: None, + folder_uid: None, + id: None, + kind: None, + meta: None, + model: None, + name: None, + org_id: None, + schema_version: None, + r#type: None, + uid: None, + version: None, + } + } +} + diff --git a/openapi/src/models/library_element_dto_meta.rs b/openapi/src/models/library_element_dto_meta.rs new file mode 100755 index 00000000..f8aed929 --- /dev/null +++ b/openapi/src/models/library_element_dto_meta.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementDtoMeta { + #[serde(rename = "connectedDashboards", skip_serializing_if = "Option::is_none")] + pub connected_dashboards: Option, + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "createdBy", skip_serializing_if = "Option::is_none")] + pub created_by: Option>, + #[serde(rename = "folderName", skip_serializing_if = "Option::is_none")] + pub folder_name: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "updatedBy", skip_serializing_if = "Option::is_none")] + pub updated_by: Option>, +} + +impl LibraryElementDtoMeta { + pub fn new() -> LibraryElementDtoMeta { + LibraryElementDtoMeta { + connected_dashboards: None, + created: None, + created_by: None, + folder_name: None, + folder_uid: None, + updated: None, + updated_by: None, + } + } +} + diff --git a/openapi/src/models/library_element_dto_meta_user.rs b/openapi/src/models/library_element_dto_meta_user.rs new file mode 100755 index 00000000..fcd5b656 --- /dev/null +++ b/openapi/src/models/library_element_dto_meta_user.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementDtoMetaUser { + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl LibraryElementDtoMetaUser { + pub fn new() -> LibraryElementDtoMetaUser { + LibraryElementDtoMetaUser { + avatar_url: None, + id: None, + name: None, + } + } +} + diff --git a/openapi/src/models/library_element_response.rs b/openapi/src/models/library_element_response.rs new file mode 100755 index 00000000..91e8ec8c --- /dev/null +++ b/openapi/src/models/library_element_response.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementResponse { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl LibraryElementResponse { + pub fn new() -> LibraryElementResponse { + LibraryElementResponse { + result: None, + } + } +} + diff --git a/openapi/src/models/library_element_search_response.rs b/openapi/src/models/library_element_search_response.rs new file mode 100755 index 00000000..9719b8dc --- /dev/null +++ b/openapi/src/models/library_element_search_response.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementSearchResponse { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl LibraryElementSearchResponse { + pub fn new() -> LibraryElementSearchResponse { + LibraryElementSearchResponse { + result: None, + } + } +} + diff --git a/openapi/src/models/library_element_search_result.rs b/openapi/src/models/library_element_search_result.rs new file mode 100755 index 00000000..18389923 --- /dev/null +++ b/openapi/src/models/library_element_search_result.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LibraryElementSearchResult { + #[serde(rename = "elements", skip_serializing_if = "Option::is_none")] + pub elements: Option>, + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, +} + +impl LibraryElementSearchResult { + pub fn new() -> LibraryElementSearchResult { + LibraryElementSearchResult { + elements: None, + page: None, + per_page: None, + total_count: None, + } + } +} + diff --git a/openapi/src/models/link_transformation_config.rs b/openapi/src/models/link_transformation_config.rs new file mode 100755 index 00000000..40f666eb --- /dev/null +++ b/openapi/src/models/link_transformation_config.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct LinkTransformationConfig { + #[serde(rename = "expression", skip_serializing_if = "Option::is_none")] + pub expression: Option, + #[serde(rename = "field", skip_serializing_if = "Option::is_none")] + pub field: Option, + #[serde(rename = "mapValue", skip_serializing_if = "Option::is_none")] + pub map_value: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, +} + +impl LinkTransformationConfig { + pub fn new() -> LinkTransformationConfig { + LinkTransformationConfig { + expression: None, + field: None, + map_value: None, + r#type: None, + } + } +} + diff --git a/openapi/src/models/list_all_providers_settings_200_response_inner.rs b/openapi/src/models/list_all_providers_settings_200_response_inner.rs new file mode 100755 index 00000000..5daf9422 --- /dev/null +++ b/openapi/src/models/list_all_providers_settings_200_response_inner.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ListAllProvidersSettings200ResponseInner { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "provider", skip_serializing_if = "Option::is_none")] + pub provider: Option, + #[serde(rename = "settings", skip_serializing_if = "Option::is_none")] + pub settings: Option, + #[serde(rename = "source", skip_serializing_if = "Option::is_none")] + pub source: Option, +} + +impl ListAllProvidersSettings200ResponseInner { + pub fn new() -> ListAllProvidersSettings200ResponseInner { + ListAllProvidersSettings200ResponseInner { + id: None, + provider: None, + settings: None, + source: None, + } + } +} + diff --git a/openapi/src/models/list_sort_options_200_response.rs b/openapi/src/models/list_sort_options_200_response.rs new file mode 100755 index 00000000..6399b6f5 --- /dev/null +++ b/openapi/src/models/list_sort_options_200_response.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ListSortOptions200Response { + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "displayName", skip_serializing_if = "Option::is_none")] + pub display_name: Option, + #[serde(rename = "meta", skip_serializing_if = "Option::is_none")] + pub meta: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl ListSortOptions200Response { + pub fn new() -> ListSortOptions200Response { + ListSortOptions200Response { + description: None, + display_name: None, + meta: None, + name: None, + } + } +} + diff --git a/openapi/src/models/mass_delete_annotations_cmd.rs b/openapi/src/models/mass_delete_annotations_cmd.rs new file mode 100755 index 00000000..aed0b853 --- /dev/null +++ b/openapi/src/models/mass_delete_annotations_cmd.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct MassDeleteAnnotationsCmd { + #[serde(rename = "annotationId", skip_serializing_if = "Option::is_none")] + pub annotation_id: Option, + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + #[serde(rename = "dashboardUID", skip_serializing_if = "Option::is_none")] + pub dashboard_uid: Option, + #[serde(rename = "panelId", skip_serializing_if = "Option::is_none")] + pub panel_id: Option, +} + +impl MassDeleteAnnotationsCmd { + pub fn new() -> MassDeleteAnnotationsCmd { + MassDeleteAnnotationsCmd { + annotation_id: None, + dashboard_id: None, + dashboard_uid: None, + panel_id: None, + } + } +} + diff --git a/openapi/src/models/matcher.rs b/openapi/src/models/matcher.rs new file mode 100755 index 00000000..33886fb8 --- /dev/null +++ b/openapi/src/models/matcher.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Matcher : Matcher matcher +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Matcher { + /// is equal + #[serde(rename = "isEqual", skip_serializing_if = "Option::is_none")] + pub is_equal: Option, + /// is regex + #[serde(rename = "isRegex")] + pub is_regex: bool, + /// name + #[serde(rename = "name")] + pub name: String, + /// value + #[serde(rename = "value")] + pub value: String, +} + +impl Matcher { + /// Matcher matcher + pub fn new(is_regex: bool, name: String, value: String) -> Matcher { + Matcher { + is_equal: None, + is_regex, + name, + value, + } + } +} + diff --git a/openapi/src/models/metric_request.rs b/openapi/src/models/metric_request.rs new file mode 100755 index 00000000..260c0d10 --- /dev/null +++ b/openapi/src/models/metric_request.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct MetricRequest { + #[serde(rename = "debug", skip_serializing_if = "Option::is_none")] + pub debug: Option, + /// From Start time in epoch timestamps in milliseconds or relative using Grafana time units. + #[serde(rename = "from")] + pub from: String, + /// queries.refId – Specifies an identifier of the query. Is optional and default to “A”. queries.datasourceId – Specifies the data source to be queried. Each query in the request must have an unique datasourceId. queries.maxDataPoints - Species maximum amount of data points that dashboard panel can render. Is optional and default to 100. queries.intervalMs - Specifies the time interval in milliseconds of time series. Is optional and defaults to 1000. + #[serde(rename = "queries")] + pub queries: Vec, + /// To End time in epoch timestamps in milliseconds or relative using Grafana time units. + #[serde(rename = "to")] + pub to: String, +} + +impl MetricRequest { + pub fn new(from: String, queries: Vec, to: String) -> MetricRequest { + MetricRequest { + debug: None, + from, + queries, + to, + } + } +} + diff --git a/openapi/src/models/mod.rs b/openapi/src/models/mod.rs new file mode 100755 index 00000000..1163e976 --- /dev/null +++ b/openapi/src/models/mod.rs @@ -0,0 +1,716 @@ +pub mod active_sync_status_dto; +pub use self::active_sync_status_dto::ActiveSyncStatusDto; +pub mod active_user_stats; +pub use self::active_user_stats::ActiveUserStats; +pub mod add_api_key_command; +pub use self::add_api_key_command::AddApiKeyCommand; +pub mod add_data_source_200_response; +pub use self::add_data_source_200_response::AddDataSource200Response; +pub mod add_data_source_command; +pub use self::add_data_source_command::AddDataSourceCommand; +pub mod add_invite_form; +pub use self::add_invite_form::AddInviteForm; +pub mod add_org_user_command; +pub use self::add_org_user_command::AddOrgUserCommand; +pub mod add_service_account_token_command; +pub use self::add_service_account_token_command::AddServiceAccountTokenCommand; +pub mod add_team_member_command; +pub use self::add_team_member_command::AddTeamMemberCommand; +pub mod add_team_role_command; +pub use self::add_team_role_command::AddTeamRoleCommand; +pub mod add_user_role_command; +pub use self::add_user_role_command::AddUserRoleCommand; +pub mod address; +pub use self::address::Address; +pub mod admin_create_user_form; +pub use self::admin_create_user_form::AdminCreateUserForm; +pub mod admin_create_user_response; +pub use self::admin_create_user_response::AdminCreateUserResponse; +pub mod admin_stats; +pub use self::admin_stats::AdminStats; +pub mod admin_update_user_password_form; +pub use self::admin_update_user_password_form::AdminUpdateUserPasswordForm; +pub mod admin_update_user_permissions_form; +pub use self::admin_update_user_permissions_form::AdminUpdateUserPermissionsForm; +pub mod alert; +pub use self::alert::Alert; +pub mod alert_discovery; +pub use self::alert_discovery::AlertDiscovery; +pub mod alert_group; +pub use self::alert_group::AlertGroup; +pub mod alert_instances_response; +pub use self::alert_instances_response::AlertInstancesResponse; +pub mod alert_manager; +pub use self::alert_manager::AlertManager; +pub mod alert_managers_result; +pub use self::alert_managers_result::AlertManagersResult; +pub mod alert_query; +pub use self::alert_query::AlertQuery; +pub mod alert_query_export; +pub use self::alert_query_export::AlertQueryExport; +pub mod alert_response; +pub use self::alert_response::AlertResponse; +pub mod alert_rule_export; +pub use self::alert_rule_export::AlertRuleExport; +pub mod alert_rule_group; +pub use self::alert_rule_group::AlertRuleGroup; +pub mod alert_rule_group_export; +pub use self::alert_rule_group_export::AlertRuleGroupExport; +pub mod alert_rule_group_metadata; +pub use self::alert_rule_group_metadata::AlertRuleGroupMetadata; +pub mod alert_rule_notification_settings; +pub use self::alert_rule_notification_settings::AlertRuleNotificationSettings; +pub mod alert_rule_notification_settings_export; +pub use self::alert_rule_notification_settings_export::AlertRuleNotificationSettingsExport; +pub mod alert_status; +pub use self::alert_status::AlertStatus; +pub mod alerting_file_export; +pub use self::alerting_file_export::AlertingFileExport; +pub mod alerting_rule; +pub use self::alerting_rule::AlertingRule; +pub mod alerting_status; +pub use self::alerting_status::AlertingStatus; +pub mod alertmanager_config; +pub use self::alertmanager_config::AlertmanagerConfig; +pub mod alertmanager_status; +pub use self::alertmanager_status::AlertmanagerStatus; +pub mod annotation; +pub use self::annotation::Annotation; +pub mod annotation_actions; +pub use self::annotation_actions::AnnotationActions; +pub mod annotation_event; +pub use self::annotation_event::AnnotationEvent; +pub mod annotation_panel_filter; +pub use self::annotation_panel_filter::AnnotationPanelFilter; +pub mod annotation_permission; +pub use self::annotation_permission::AnnotationPermission; +pub mod annotation_query; +pub use self::annotation_query::AnnotationQuery; +pub mod annotation_target; +pub use self::annotation_target::AnnotationTarget; +pub mod api_key_dto; +pub use self::api_key_dto::ApiKeyDto; +pub mod api_rule_node; +pub use self::api_rule_node::ApiRuleNode; +pub mod assignments; +pub use self::assignments::Assignments; +pub mod attribute_type_and_value; +pub use self::attribute_type_and_value::AttributeTypeAndValue; +pub mod authorization; +pub use self::authorization::Authorization; +pub mod backtest_config; +pub use self::backtest_config::BacktestConfig; +pub mod basic_auth; +pub use self::basic_auth::BasicAuth; +pub mod calculate_dashboard_diff_request; +pub use self::calculate_dashboard_diff_request::CalculateDashboardDiffRequest; +pub mod calculate_diff_target; +pub use self::calculate_diff_target::CalculateDiffTarget; +pub mod certificate; +pub use self::certificate::Certificate; +pub mod change_user_password_command; +pub use self::change_user_password_command::ChangeUserPasswordCommand; +pub mod clear_help_flags_200_response; +pub use self::clear_help_flags_200_response::ClearHelpFlags200Response; +pub mod cluster_status; +pub use self::cluster_status::ClusterStatus; +pub mod config; +pub use self::config::Config; +pub mod contact_point_export; +pub use self::contact_point_export::ContactPointExport; +pub mod cookie_preferences; +pub use self::cookie_preferences::CookiePreferences; +pub mod correlation; +pub use self::correlation::Correlation; +pub mod correlation_config; +pub use self::correlation_config::CorrelationConfig; +pub mod correlation_config_update_dto; +pub use self::correlation_config_update_dto::CorrelationConfigUpdateDto; +pub mod create_correlation_command; +pub use self::create_correlation_command::CreateCorrelationCommand; +pub mod create_correlation_response_body; +pub use self::create_correlation_response_body::CreateCorrelationResponseBody; +pub mod create_dashboard_snapshot_200_response; +pub use self::create_dashboard_snapshot_200_response::CreateDashboardSnapshot200Response; +pub mod create_dashboard_snapshot_command; +pub use self::create_dashboard_snapshot_command::CreateDashboardSnapshotCommand; +pub mod create_folder_command; +pub use self::create_folder_command::CreateFolderCommand; +pub mod create_library_element_command; +pub use self::create_library_element_command::CreateLibraryElementCommand; +pub mod create_or_update_report_config; +pub use self::create_or_update_report_config::CreateOrUpdateReportConfig; +pub mod create_org_200_response; +pub use self::create_org_200_response::CreateOrg200Response; +pub mod create_org_command; +pub use self::create_org_command::CreateOrgCommand; +pub mod create_playlist_command; +pub use self::create_playlist_command::CreatePlaylistCommand; +pub mod create_query_in_query_history_command; +pub use self::create_query_in_query_history_command::CreateQueryInQueryHistoryCommand; +pub mod create_report_200_response; +pub use self::create_report_200_response::CreateReport200Response; +pub mod create_role_form; +pub use self::create_role_form::CreateRoleForm; +pub mod create_service_account_form; +pub use self::create_service_account_form::CreateServiceAccountForm; +pub mod create_team_200_response; +pub use self::create_team_200_response::CreateTeam200Response; +pub mod create_team_command; +pub use self::create_team_command::CreateTeamCommand; +pub mod dashboard_acl_info_dto; +pub use self::dashboard_acl_info_dto::DashboardAclInfoDto; +pub mod dashboard_acl_update_item; +pub use self::dashboard_acl_update_item::DashboardAclUpdateItem; +pub mod dashboard_create_command; +pub use self::dashboard_create_command::DashboardCreateCommand; +pub mod dashboard_full_with_meta; +pub use self::dashboard_full_with_meta::DashboardFullWithMeta; +pub mod dashboard_meta; +pub use self::dashboard_meta::DashboardMeta; +pub mod dashboard_redirect; +pub use self::dashboard_redirect::DashboardRedirect; +pub mod dashboard_snapshot_dto; +pub use self::dashboard_snapshot_dto::DashboardSnapshotDto; +pub mod dashboard_tag_cloud_item; +pub use self::dashboard_tag_cloud_item::DashboardTagCloudItem; +pub mod dashboard_version_meta; +pub use self::dashboard_version_meta::DashboardVersionMeta; +pub mod data_link; +pub use self::data_link::DataLink; +pub mod data_response; +pub use self::data_response::DataResponse; +pub mod data_source; +pub use self::data_source::DataSource; +pub mod data_source_list_item_dto; +pub use self::data_source_list_item_dto::DataSourceListItemDto; +pub mod data_source_ref; +pub use self::data_source_ref::DataSourceRef; +pub mod delete_correlation_response_body; +pub use self::delete_correlation_response_body::DeleteCorrelationResponseBody; +pub mod delete_dashboard_by_uid_200_response; +pub use self::delete_dashboard_by_uid_200_response::DeleteDashboardByUid200Response; +pub mod delete_data_source_by_name_200_response; +pub use self::delete_data_source_by_name_200_response::DeleteDataSourceByName200Response; +pub mod delete_folder_200_response; +pub use self::delete_folder_200_response::DeleteFolder200Response; +pub mod delete_token_command; +pub use self::delete_token_command::DeleteTokenCommand; +pub mod description; +pub use self::description::Description; +pub mod device_dto; +pub use self::device_dto::DeviceDto; +pub mod device_search_hit_dto; +pub use self::device_search_hit_dto::DeviceSearchHitDto; +pub mod discord_config; +pub use self::discord_config::DiscordConfig; +pub mod discovery_base; +pub use self::discovery_base::DiscoveryBase; +pub mod email_config; +pub use self::email_config::EmailConfig; +pub mod email_dto; +pub use self::email_dto::EmailDto; +pub mod embedded_contact_point; +pub use self::embedded_contact_point::EmbeddedContactPoint; +pub mod enum_field_config; +pub use self::enum_field_config::EnumFieldConfig; +pub mod error_response_body; +pub use self::error_response_body::ErrorResponseBody; +pub mod eval_alert_condition_command; +pub use self::eval_alert_condition_command::EvalAlertConditionCommand; +pub mod eval_queries_payload; +pub use self::eval_queries_payload::EvalQueriesPayload; +pub mod extended_receiver; +pub use self::extended_receiver::ExtendedReceiver; +pub mod extension; +pub use self::extension::Extension; +pub mod failed_user; +pub use self::failed_user::FailedUser; +pub mod field; +pub use self::field::Field; +pub mod field_config; +pub use self::field_config::FieldConfig; +pub mod field_type_config; +pub use self::field_type_config::FieldTypeConfig; +pub mod find_tags_result; +pub use self::find_tags_result::FindTagsResult; +pub mod float_histogram; +pub use self::float_histogram::FloatHistogram; +pub mod folder; +pub use self::folder::Folder; +pub mod folder_search_hit; +pub use self::folder_search_hit::FolderSearchHit; +pub mod forbidden_error; +pub use self::forbidden_error::ForbiddenError; +pub mod frame; +pub use self::frame::Frame; +pub mod frame_meta; +pub use self::frame_meta::FrameMeta; +pub mod generic_public_error; +pub use self::generic_public_error::GenericPublicError; +pub mod get_annotation_tags_response; +pub use self::get_annotation_tags_response::GetAnnotationTagsResponse; +pub mod get_data_source_id_by_name_200_response; +pub use self::get_data_source_id_by_name_200_response::GetDataSourceIdByName200Response; +pub mod get_home_dashboard_response; +pub use self::get_home_dashboard_response::GetHomeDashboardResponse; +pub mod get_sharing_options_200_response; +pub use self::get_sharing_options_200_response::GetSharingOptions200Response; +pub mod gettable_alert; +pub use self::gettable_alert::GettableAlert; +pub mod gettable_alertmanagers; +pub use self::gettable_alertmanagers::GettableAlertmanagers; +pub mod gettable_api_alerting_config; +pub use self::gettable_api_alerting_config::GettableApiAlertingConfig; +pub mod gettable_api_receiver; +pub use self::gettable_api_receiver::GettableApiReceiver; +pub mod gettable_extended_rule_node; +pub use self::gettable_extended_rule_node::GettableExtendedRuleNode; +pub mod gettable_grafana_receiver; +pub use self::gettable_grafana_receiver::GettableGrafanaReceiver; +pub mod gettable_grafana_receivers; +pub use self::gettable_grafana_receivers::GettableGrafanaReceivers; +pub mod gettable_grafana_rule; +pub use self::gettable_grafana_rule::GettableGrafanaRule; +pub mod gettable_historic_user_config; +pub use self::gettable_historic_user_config::GettableHistoricUserConfig; +pub mod gettable_n_galert_config; +pub use self::gettable_n_galert_config::GettableNGalertConfig; +pub mod gettable_rule_group_config; +pub use self::gettable_rule_group_config::GettableRuleGroupConfig; +pub mod gettable_silence; +pub use self::gettable_silence::GettableSilence; +pub mod gettable_status; +pub use self::gettable_status::GettableStatus; +pub mod gettable_time_intervals; +pub use self::gettable_time_intervals::GettableTimeIntervals; +pub mod gettable_user_config; +pub use self::gettable_user_config::GettableUserConfig; +pub mod global_config; +pub use self::global_config::GlobalConfig; +pub mod hit; +pub use self::hit::Hit; +pub mod host_port; +pub use self::host_port::HostPort; +pub mod http_client_config; +pub use self::http_client_config::HttpClientConfig; +pub mod import_dashboard_input; +pub use self::import_dashboard_input::ImportDashboardInput; +pub mod import_dashboard_request; +pub use self::import_dashboard_request::ImportDashboardRequest; +pub mod import_dashboard_response; +pub use self::import_dashboard_response::ImportDashboardResponse; +pub mod inhibit_rule; +pub use self::inhibit_rule::InhibitRule; +pub mod integration; +pub use self::integration::Integration; +pub mod internal_data_link; +pub use self::internal_data_link::InternalDataLink; +pub mod ip_net; +pub use self::ip_net::IpNet; +pub mod json_web_key; +pub use self::json_web_key::JsonWebKey; +pub mod label; +pub use self::label::Label; +pub mod library_element_array_response; +pub use self::library_element_array_response::LibraryElementArrayResponse; +pub mod library_element_connection_dto; +pub use self::library_element_connection_dto::LibraryElementConnectionDto; +pub mod library_element_connections_response; +pub use self::library_element_connections_response::LibraryElementConnectionsResponse; +pub mod library_element_dto; +pub use self::library_element_dto::LibraryElementDto; +pub mod library_element_dto_meta; +pub use self::library_element_dto_meta::LibraryElementDtoMeta; +pub mod library_element_dto_meta_user; +pub use self::library_element_dto_meta_user::LibraryElementDtoMetaUser; +pub mod library_element_response; +pub use self::library_element_response::LibraryElementResponse; +pub mod library_element_search_response; +pub use self::library_element_search_response::LibraryElementSearchResponse; +pub mod library_element_search_result; +pub use self::library_element_search_result::LibraryElementSearchResult; +pub mod link_transformation_config; +pub use self::link_transformation_config::LinkTransformationConfig; +pub mod list_all_providers_settings_200_response_inner; +pub use self::list_all_providers_settings_200_response_inner::ListAllProvidersSettings200ResponseInner; +pub mod list_sort_options_200_response; +pub use self::list_sort_options_200_response::ListSortOptions200Response; +pub mod mass_delete_annotations_cmd; +pub use self::mass_delete_annotations_cmd::MassDeleteAnnotationsCmd; +pub mod matcher; +pub use self::matcher::Matcher; +pub mod metric_request; +pub use self::metric_request::MetricRequest; +pub mod move_folder_command; +pub use self::move_folder_command::MoveFolderCommand; +pub mod ms_teams_config; +pub use self::ms_teams_config::MsTeamsConfig; +pub mod mute_time_interval; +pub use self::mute_time_interval::MuteTimeInterval; +pub mod mute_time_interval_export; +pub use self::mute_time_interval_export::MuteTimeIntervalExport; +pub mod name; +pub use self::name::Name; +pub mod new_api_key_result; +pub use self::new_api_key_result::NewApiKeyResult; +pub mod notice; +pub use self::notice::Notice; +pub mod notification_policy_export; +pub use self::notification_policy_export::NotificationPolicyExport; +pub mod notification_template; +pub use self::notification_template::NotificationTemplate; +pub mod notification_template_content; +pub use self::notification_template_content::NotificationTemplateContent; +pub mod notifier_config; +pub use self::notifier_config::NotifierConfig; +pub mod o_auth2; +pub use self::o_auth2::OAuth2; +pub mod ops_genie_config; +pub use self::ops_genie_config::OpsGenieConfig; +pub mod ops_genie_config_responder; +pub use self::ops_genie_config_responder::OpsGenieConfigResponder; +pub mod org_details_dto; +pub use self::org_details_dto::OrgDetailsDto; +pub mod org_dto; +pub use self::org_dto::OrgDto; +pub mod org_user_dto; +pub use self::org_user_dto::OrgUserDto; +pub mod pagerduty_config; +pub use self::pagerduty_config::PagerdutyConfig; +pub mod pagerduty_image; +pub use self::pagerduty_image::PagerdutyImage; +pub mod pagerduty_link; +pub use self::pagerduty_link::PagerdutyLink; +pub mod patch_annotations_cmd; +pub use self::patch_annotations_cmd::PatchAnnotationsCmd; +pub mod patch_library_element_command; +pub use self::patch_library_element_command::PatchLibraryElementCommand; +pub mod patch_prefs_cmd; +pub use self::patch_prefs_cmd::PatchPrefsCmd; +pub mod patch_query_comment_in_query_history_command; +pub use self::patch_query_comment_in_query_history_command::PatchQueryCommentInQueryHistoryCommand; +pub mod peer_status; +pub use self::peer_status::PeerStatus; +pub mod permission; +pub use self::permission::Permission; +pub mod playlist; +pub use self::playlist::Playlist; +pub mod playlist_dashboard; +pub use self::playlist_dashboard::PlaylistDashboard; +pub mod playlist_dto; +pub use self::playlist_dto::PlaylistDto; +pub mod playlist_item; +pub use self::playlist_item::PlaylistItem; +pub mod playlist_item_dto; +pub use self::playlist_item_dto::PlaylistItemDto; +pub mod post_annotation_200_response; +pub use self::post_annotation_200_response::PostAnnotation200Response; +pub mod post_annotations_cmd; +pub use self::post_annotations_cmd::PostAnnotationsCmd; +pub mod post_dashboard_200_response; +pub use self::post_dashboard_200_response::PostDashboard200Response; +pub mod post_graphite_annotations_cmd; +pub use self::post_graphite_annotations_cmd::PostGraphiteAnnotationsCmd; +pub mod post_silences_ok_body; +pub use self::post_silences_ok_body::PostSilencesOkBody; +pub mod postable_alert; +pub use self::postable_alert::PostableAlert; +pub mod postable_api_alerting_config; +pub use self::postable_api_alerting_config::PostableApiAlertingConfig; +pub mod postable_api_receiver; +pub use self::postable_api_receiver::PostableApiReceiver; +pub mod postable_extended_rule_node; +pub use self::postable_extended_rule_node::PostableExtendedRuleNode; +pub mod postable_extended_rule_node_extended; +pub use self::postable_extended_rule_node_extended::PostableExtendedRuleNodeExtended; +pub mod postable_grafana_receiver; +pub use self::postable_grafana_receiver::PostableGrafanaReceiver; +pub mod postable_grafana_receivers; +pub use self::postable_grafana_receivers::PostableGrafanaReceivers; +pub mod postable_grafana_rule; +pub use self::postable_grafana_rule::PostableGrafanaRule; +pub mod postable_n_galert_config; +pub use self::postable_n_galert_config::PostableNGalertConfig; +pub mod postable_rule_group_config; +pub use self::postable_rule_group_config::PostableRuleGroupConfig; +pub mod postable_silence; +pub use self::postable_silence::PostableSilence; +pub mod postable_time_intervals; +pub use self::postable_time_intervals::PostableTimeIntervals; +pub mod postable_user_config; +pub use self::postable_user_config::PostableUserConfig; +pub mod preferences; +pub use self::preferences::Preferences; +pub mod prometheus_remote_write_target_json; +pub use self::prometheus_remote_write_target_json::PrometheusRemoteWriteTargetJson; +pub mod provisioned_alert_rule; +pub use self::provisioned_alert_rule::ProvisionedAlertRule; +pub mod proxy_config; +pub use self::proxy_config::ProxyConfig; +pub mod public_dashboard; +pub use self::public_dashboard::PublicDashboard; +pub mod public_dashboard_dto; +pub use self::public_dashboard_dto::PublicDashboardDto; +pub mod public_dashboard_list_response; +pub use self::public_dashboard_list_response::PublicDashboardListResponse; +pub mod public_dashboard_list_response_with_pagination; +pub use self::public_dashboard_list_response_with_pagination::PublicDashboardListResponseWithPagination; +pub mod public_error; +pub use self::public_error::PublicError; +pub mod pushover_config; +pub use self::pushover_config::PushoverConfig; +pub mod query_data_response; +pub use self::query_data_response::QueryDataResponse; +pub mod query_history_delete_query_response; +pub use self::query_history_delete_query_response::QueryHistoryDeleteQueryResponse; +pub mod query_history_dto; +pub use self::query_history_dto::QueryHistoryDto; +pub mod query_history_preference; +pub use self::query_history_preference::QueryHistoryPreference; +pub mod query_history_response; +pub use self::query_history_response::QueryHistoryResponse; +pub mod query_history_search_response; +pub use self::query_history_search_response::QueryHistorySearchResponse; +pub mod query_history_search_result; +pub use self::query_history_search_result::QueryHistorySearchResult; +pub mod query_stat; +pub use self::query_stat::QueryStat; +pub mod quota_dto; +pub use self::quota_dto::QuotaDto; +pub mod receiver; +pub use self::receiver::Receiver; +pub mod receiver_export; +pub use self::receiver_export::ReceiverExport; +pub mod recording_rule_json; +pub use self::recording_rule_json::RecordingRuleJson; +pub mod relative_time_range; +pub use self::relative_time_range::RelativeTimeRange; +pub mod relative_time_range_export; +pub use self::relative_time_range_export::RelativeTimeRangeExport; +pub mod report; +pub use self::report::Report; +pub mod report_branding_options; +pub use self::report_branding_options::ReportBrandingOptions; +pub mod report_dashboard; +pub use self::report_dashboard::ReportDashboard; +pub mod report_dashboard_id; +pub use self::report_dashboard_id::ReportDashboardId; +pub mod report_email; +pub use self::report_email::ReportEmail; +pub mod report_options; +pub use self::report_options::ReportOptions; +pub mod report_schedule; +pub use self::report_schedule::ReportSchedule; +pub mod report_settings; +pub use self::report_settings::ReportSettings; +pub mod report_time_range; +pub use self::report_time_range::ReportTimeRange; +pub mod resource_permission_dto; +pub use self::resource_permission_dto::ResourcePermissionDto; +pub mod response_details; +pub use self::response_details::ResponseDetails; +pub mod restore_dashboard_version_command; +pub use self::restore_dashboard_version_command::RestoreDashboardVersionCommand; +pub mod retrieve_jwks_200_response; +pub use self::retrieve_jwks_200_response::RetrieveJwks200Response; +pub mod revoke_auth_token_cmd; +pub use self::revoke_auth_token_cmd::RevokeAuthTokenCmd; +pub mod role_assignments_dto; +pub use self::role_assignments_dto::RoleAssignmentsDto; +pub mod role_dto; +pub use self::role_dto::RoleDto; +pub mod roles_search_query; +pub use self::roles_search_query::RolesSearchQuery; +pub mod route; +pub use self::route::Route; +pub mod route_export; +pub use self::route_export::RouteExport; +pub mod rule; +pub use self::rule::Rule; +pub mod rule_discovery; +pub use self::rule_discovery::RuleDiscovery; +pub mod rule_group; +pub use self::rule_group::RuleGroup; +pub mod rule_group_config_response; +pub use self::rule_group_config_response::RuleGroupConfigResponse; +pub mod rule_response; +pub use self::rule_response::RuleResponse; +pub mod sample; +pub use self::sample::Sample; +pub mod save_dashboard_command; +pub use self::save_dashboard_command::SaveDashboardCommand; +pub mod search_device_query_result; +pub use self::search_device_query_result::SearchDeviceQueryResult; +pub mod search_org_service_accounts_result; +pub use self::search_org_service_accounts_result::SearchOrgServiceAccountsResult; +pub mod search_org_users_query_result; +pub use self::search_org_users_query_result::SearchOrgUsersQueryResult; +pub mod search_result; +pub use self::search_result::SearchResult; +pub mod search_result_item; +pub use self::search_result_item::SearchResultItem; +pub mod search_team_query_result; +pub use self::search_team_query_result::SearchTeamQueryResult; +pub mod search_user_query_result; +pub use self::search_user_query_result::SearchUserQueryResult; +pub mod service_account_dto; +pub use self::service_account_dto::ServiceAccountDto; +pub mod service_account_profile_dto; +pub use self::service_account_profile_dto::ServiceAccountProfileDto; +pub mod set_permission_command; +pub use self::set_permission_command::SetPermissionCommand; +pub mod set_permissions_command; +pub use self::set_permissions_command::SetPermissionsCommand; +pub mod set_resource_permission_command; +pub use self::set_resource_permission_command::SetResourcePermissionCommand; +pub mod set_role_assignments_command; +pub use self::set_role_assignments_command::SetRoleAssignmentsCommand; +pub mod set_user_roles_command; +pub use self::set_user_roles_command::SetUserRolesCommand; +pub mod sig_v4_config; +pub use self::sig_v4_config::SigV4Config; +pub mod silence; +pub use self::silence::Silence; +pub mod silence_status; +pub use self::silence_status::SilenceStatus; +pub mod slack_action; +pub use self::slack_action::SlackAction; +pub mod slack_config; +pub use self::slack_config::SlackConfig; +pub mod slack_confirmation_field; +pub use self::slack_confirmation_field::SlackConfirmationField; +pub mod slack_field; +pub use self::slack_field::SlackField; +pub mod sns_config; +pub use self::sns_config::SnsConfig; +pub mod span; +pub use self::span::Span; +pub mod success_response_body; +pub use self::success_response_body::SuccessResponseBody; +pub mod sync_result; +pub use self::sync_result::SyncResult; +pub mod tags_dto; +pub use self::tags_dto::TagsDto; +pub mod team_dto; +pub use self::team_dto::TeamDto; +pub mod team_group_dto; +pub use self::team_group_dto::TeamGroupDto; +pub mod team_group_mapping; +pub use self::team_group_mapping::TeamGroupMapping; +pub mod team_member_dto; +pub use self::team_member_dto::TeamMemberDto; +pub mod telegram_config; +pub use self::telegram_config::TelegramConfig; +pub mod temp_user_dto; +pub use self::temp_user_dto::TempUserDto; +pub mod test_receiver_config_result; +pub use self::test_receiver_config_result::TestReceiverConfigResult; +pub mod test_receiver_result; +pub use self::test_receiver_result::TestReceiverResult; +pub mod test_receivers_config_alert_params; +pub use self::test_receivers_config_alert_params::TestReceiversConfigAlertParams; +pub mod test_receivers_config_body_params; +pub use self::test_receivers_config_body_params::TestReceiversConfigBodyParams; +pub mod test_receivers_result; +pub use self::test_receivers_result::TestReceiversResult; +pub mod test_rule_payload; +pub use self::test_rule_payload::TestRulePayload; +pub mod test_rule_response; +pub use self::test_rule_response::TestRuleResponse; +pub mod test_templates_config_body_params; +pub use self::test_templates_config_body_params::TestTemplatesConfigBodyParams; +pub mod test_templates_error_result; +pub use self::test_templates_error_result::TestTemplatesErrorResult; +pub mod test_templates_result; +pub use self::test_templates_result::TestTemplatesResult; +pub mod test_templates_results; +pub use self::test_templates_results::TestTemplatesResults; +pub mod threshold; +pub use self::threshold::Threshold; +pub mod thresholds_config; +pub use self::thresholds_config::ThresholdsConfig; +pub mod time_interval; +pub use self::time_interval::TimeInterval; +pub mod time_interval_item; +pub use self::time_interval_item::TimeIntervalItem; +pub mod time_interval_time_range; +pub use self::time_interval_time_range::TimeIntervalTimeRange; +pub mod time_range; +pub use self::time_range::TimeRange; +pub mod tls_config; +pub use self::tls_config::TlsConfig; +pub mod token; +pub use self::token::Token; +pub mod token_dto; +pub use self::token_dto::TokenDto; +pub mod transformation; +pub use self::transformation::Transformation; +pub mod type_meta; +pub use self::type_meta::TypeMeta; +pub mod unstructured; +pub use self::unstructured::Unstructured; +pub mod update_annotations_cmd; +pub use self::update_annotations_cmd::UpdateAnnotationsCmd; +pub mod update_correlation_command; +pub use self::update_correlation_command::UpdateCorrelationCommand; +pub mod update_correlation_response_body; +pub use self::update_correlation_response_body::UpdateCorrelationResponseBody; +pub mod update_dashboard_acl_command; +pub use self::update_dashboard_acl_command::UpdateDashboardAclCommand; +pub mod update_data_source_command; +pub use self::update_data_source_command::UpdateDataSourceCommand; +pub mod update_folder_command; +pub use self::update_folder_command::UpdateFolderCommand; +pub mod update_org_address_form; +pub use self::update_org_address_form::UpdateOrgAddressForm; +pub mod update_org_form; +pub use self::update_org_form::UpdateOrgForm; +pub mod update_org_user_command; +pub use self::update_org_user_command::UpdateOrgUserCommand; +pub mod update_playlist_command; +pub use self::update_playlist_command::UpdatePlaylistCommand; +pub mod update_prefs_cmd; +pub use self::update_prefs_cmd::UpdatePrefsCmd; +pub mod update_provider_settings_request; +pub use self::update_provider_settings_request::UpdateProviderSettingsRequest; +pub mod update_quota_cmd; +pub use self::update_quota_cmd::UpdateQuotaCmd; +pub mod update_role_command; +pub use self::update_role_command::UpdateRoleCommand; +pub mod update_rule_group_response; +pub use self::update_rule_group_response::UpdateRuleGroupResponse; +pub mod update_service_account_200_response; +pub use self::update_service_account_200_response::UpdateServiceAccount200Response; +pub mod update_service_account_form; +pub use self::update_service_account_form::UpdateServiceAccountForm; +pub mod update_team_command; +pub use self::update_team_command::UpdateTeamCommand; +pub mod update_team_member_command; +pub use self::update_team_member_command::UpdateTeamMemberCommand; +pub mod update_user_command; +pub use self::update_user_command::UpdateUserCommand; +pub mod url; +pub use self::url::Url; +pub mod user_lookup_dto; +pub use self::user_lookup_dto::UserLookupDto; +pub mod user_org_dto; +pub use self::user_org_dto::UserOrgDto; +pub mod user_profile_dto; +pub use self::user_profile_dto::UserProfileDto; +pub mod user_search_hit_dto; +pub use self::user_search_hit_dto::UserSearchHitDto; +pub mod user_token; +pub use self::user_token::UserToken; +pub mod validation_error; +pub use self::validation_error::ValidationError; +pub mod version_info; +pub use self::version_info::VersionInfo; +pub mod victor_ops_config; +pub use self::victor_ops_config::VictorOpsConfig; +pub mod webex_config; +pub use self::webex_config::WebexConfig; +pub mod webhook_config; +pub use self::webhook_config::WebhookConfig; +pub mod wechat_config; +pub use self::wechat_config::WechatConfig; diff --git a/openapi/src/models/move_folder_command.rs b/openapi/src/models/move_folder_command.rs new file mode 100755 index 00000000..b0263610 --- /dev/null +++ b/openapi/src/models/move_folder_command.rs @@ -0,0 +1,28 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// MoveFolderCommand : MoveFolderCommand captures the information required by the folder service to move a folder. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct MoveFolderCommand { + #[serde(rename = "parentUid", skip_serializing_if = "Option::is_none")] + pub parent_uid: Option, +} + +impl MoveFolderCommand { + /// MoveFolderCommand captures the information required by the folder service to move a folder. + pub fn new() -> MoveFolderCommand { + MoveFolderCommand { + parent_uid: None, + } + } +} + diff --git a/openapi/src/models/ms_teams_config.rs b/openapi/src/models/ms_teams_config.rs new file mode 100755 index 00000000..e7f22e75 --- /dev/null +++ b/openapi/src/models/ms_teams_config.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct MsTeamsConfig { + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "summary", skip_serializing_if = "Option::is_none")] + pub summary: Option, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "webhook_url", skip_serializing_if = "Option::is_none")] + pub webhook_url: Option>, + #[serde(rename = "webhook_url_file", skip_serializing_if = "Option::is_none")] + pub webhook_url_file: Option, +} + +impl MsTeamsConfig { + pub fn new() -> MsTeamsConfig { + MsTeamsConfig { + http_config: None, + send_resolved: None, + summary: None, + text: None, + title: None, + webhook_url: None, + webhook_url_file: None, + } + } +} + diff --git a/openapi/src/models/mute_time_interval.rs b/openapi/src/models/mute_time_interval.rs new file mode 100755 index 00000000..694b6ced --- /dev/null +++ b/openapi/src/models/mute_time_interval.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct MuteTimeInterval { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl MuteTimeInterval { + pub fn new() -> MuteTimeInterval { + MuteTimeInterval { + name: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/mute_time_interval_export.rs b/openapi/src/models/mute_time_interval_export.rs new file mode 100755 index 00000000..32fbef52 --- /dev/null +++ b/openapi/src/models/mute_time_interval_export.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct MuteTimeIntervalExport { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl MuteTimeIntervalExport { + pub fn new() -> MuteTimeIntervalExport { + MuteTimeIntervalExport { + name: None, + org_id: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/name.rs b/openapi/src/models/name.rs new file mode 100755 index 00000000..daab3d20 --- /dev/null +++ b/openapi/src/models/name.rs @@ -0,0 +1,45 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Name : Name represents an X.509 distinguished name. This only includes the common elements of a DN. Note that Name is only an approximation of the X.509 structure. If an accurate representation is needed, asn1.Unmarshal the raw subject or issuer as an RDNSequence. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Name { + #[serde(rename = "Country", skip_serializing_if = "Option::is_none")] + pub country: Option>, + /// ExtraNames contains attributes to be copied, raw, into any marshaled distinguished names. Values override any attributes with the same OID. The ExtraNames field is not populated when parsing, see Names. + #[serde(rename = "ExtraNames", skip_serializing_if = "Option::is_none")] + pub extra_names: Option>, + #[serde(rename = "Locality", skip_serializing_if = "Option::is_none")] + pub locality: Option>, + /// Names contains all parsed attributes. When parsing distinguished names, this can be used to extract non-standard attributes that are not parsed by this package. When marshaling to RDNSequences, the Names field is ignored, see ExtraNames. + #[serde(rename = "Names", skip_serializing_if = "Option::is_none")] + pub names: Option>, + #[serde(rename = "SerialNumber", skip_serializing_if = "Option::is_none")] + pub serial_number: Option, + #[serde(rename = "StreetAddress", skip_serializing_if = "Option::is_none")] + pub street_address: Option>, +} + +impl Name { + /// Name represents an X.509 distinguished name. This only includes the common elements of a DN. Note that Name is only an approximation of the X.509 structure. If an accurate representation is needed, asn1.Unmarshal the raw subject or issuer as an RDNSequence. + pub fn new() -> Name { + Name { + country: None, + extra_names: None, + locality: None, + names: None, + serial_number: None, + street_address: None, + } + } +} + diff --git a/openapi/src/models/new_api_key_result.rs b/openapi/src/models/new_api_key_result.rs new file mode 100755 index 00000000..f587f140 --- /dev/null +++ b/openapi/src/models/new_api_key_result.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct NewApiKeyResult { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "key", skip_serializing_if = "Option::is_none")] + pub key: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl NewApiKeyResult { + pub fn new() -> NewApiKeyResult { + NewApiKeyResult { + id: None, + key: None, + name: None, + } + } +} + diff --git a/openapi/src/models/notice.rs b/openapi/src/models/notice.rs new file mode 100755 index 00000000..2e5d98f5 --- /dev/null +++ b/openapi/src/models/notice.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Notice { + #[serde(rename = "inspect", skip_serializing_if = "Option::is_none")] + pub inspect: Option, + /// Link is an optional link for display in the user interface and can be an absolute URL or a path relative to Grafana's root url. + #[serde(rename = "link", skip_serializing_if = "Option::is_none")] + pub link: Option, + #[serde(rename = "severity", skip_serializing_if = "Option::is_none")] + pub severity: Option, + /// Text is freeform descriptive text for the notice. + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, +} + +impl Notice { + pub fn new() -> Notice { + Notice { + inspect: None, + link: None, + severity: None, + text: None, + } + } +} + diff --git a/openapi/src/models/notification_policy_export.rs b/openapi/src/models/notification_policy_export.rs new file mode 100755 index 00000000..fc8ae6ca --- /dev/null +++ b/openapi/src/models/notification_policy_export.rs @@ -0,0 +1,64 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct NotificationPolicyExport { + #[serde(rename = "continue", skip_serializing_if = "Option::is_none")] + pub r#continue: Option, + #[serde(rename = "group_by", skip_serializing_if = "Option::is_none")] + pub group_by: Option>, + #[serde(rename = "group_interval", skip_serializing_if = "Option::is_none")] + pub group_interval: Option, + #[serde(rename = "group_wait", skip_serializing_if = "Option::is_none")] + pub group_wait: Option, + /// Deprecated. Remove before v1.0 release. + #[serde(rename = "match", skip_serializing_if = "Option::is_none")] + pub r#match: Option>, + #[serde(rename = "match_re", skip_serializing_if = "Option::is_none")] + pub match_re: Option>, + /// Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. + #[serde(rename = "matchers", skip_serializing_if = "Option::is_none")] + pub matchers: Option>, + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + #[serde(rename = "object_matchers", skip_serializing_if = "Option::is_none")] + pub object_matchers: Option>>, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "receiver", skip_serializing_if = "Option::is_none")] + pub receiver: Option, + #[serde(rename = "repeat_interval", skip_serializing_if = "Option::is_none")] + pub repeat_interval: Option, + #[serde(rename = "routes", skip_serializing_if = "Option::is_none")] + pub routes: Option>, +} + +impl NotificationPolicyExport { + pub fn new() -> NotificationPolicyExport { + NotificationPolicyExport { + r#continue: None, + group_by: None, + group_interval: None, + group_wait: None, + r#match: None, + match_re: None, + matchers: None, + mute_time_intervals: None, + object_matchers: None, + org_id: None, + receiver: None, + repeat_interval: None, + routes: None, + } + } +} + diff --git a/openapi/src/models/notification_template.rs b/openapi/src/models/notification_template.rs new file mode 100755 index 00000000..9da79836 --- /dev/null +++ b/openapi/src/models/notification_template.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct NotificationTemplate { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "provenance", skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(rename = "template", skip_serializing_if = "Option::is_none")] + pub template: Option, +} + +impl NotificationTemplate { + pub fn new() -> NotificationTemplate { + NotificationTemplate { + name: None, + provenance: None, + template: None, + } + } +} + diff --git a/openapi/src/models/notification_template_content.rs b/openapi/src/models/notification_template_content.rs new file mode 100755 index 00000000..a97ff266 --- /dev/null +++ b/openapi/src/models/notification_template_content.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct NotificationTemplateContent { + #[serde(rename = "template", skip_serializing_if = "Option::is_none")] + pub template: Option, +} + +impl NotificationTemplateContent { + pub fn new() -> NotificationTemplateContent { + NotificationTemplateContent { + template: None, + } + } +} + diff --git a/openapi/src/models/notifier_config.rs b/openapi/src/models/notifier_config.rs new file mode 100755 index 00000000..79d13798 --- /dev/null +++ b/openapi/src/models/notifier_config.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct NotifierConfig { + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, +} + +impl NotifierConfig { + pub fn new() -> NotifierConfig { + NotifierConfig { + send_resolved: None, + } + } +} + diff --git a/openapi/src/models/o_auth2.rs b/openapi/src/models/o_auth2.rs new file mode 100755 index 00000000..8bc2cc3d --- /dev/null +++ b/openapi/src/models/o_auth2.rs @@ -0,0 +1,58 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct OAuth2 { + #[serde(rename = "TLSConfig", skip_serializing_if = "Option::is_none")] + pub tls_config: Option>, + #[serde(rename = "client_id", skip_serializing_if = "Option::is_none")] + pub client_id: Option, + #[serde(rename = "client_secret", skip_serializing_if = "Option::is_none")] + pub client_secret: Option, + #[serde(rename = "client_secret_file", skip_serializing_if = "Option::is_none")] + pub client_secret_file: Option, + #[serde(rename = "endpoint_params", skip_serializing_if = "Option::is_none")] + pub endpoint_params: Option>, + /// NoProxy contains addresses that should not use a proxy. + #[serde(rename = "no_proxy", skip_serializing_if = "Option::is_none")] + pub no_proxy: Option, + #[serde(rename = "proxy_connect_header", skip_serializing_if = "Option::is_none")] + pub proxy_connect_header: Option>>, + /// ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function to determine proxies. + #[serde(rename = "proxy_from_environment", skip_serializing_if = "Option::is_none")] + pub proxy_from_environment: Option, + #[serde(rename = "proxy_url", skip_serializing_if = "Option::is_none")] + pub proxy_url: Option>, + #[serde(rename = "scopes", skip_serializing_if = "Option::is_none")] + pub scopes: Option>, + #[serde(rename = "token_url", skip_serializing_if = "Option::is_none")] + pub token_url: Option, +} + +impl OAuth2 { + pub fn new() -> OAuth2 { + OAuth2 { + tls_config: None, + client_id: None, + client_secret: None, + client_secret_file: None, + endpoint_params: None, + no_proxy: None, + proxy_connect_header: None, + proxy_from_environment: None, + proxy_url: None, + scopes: None, + token_url: None, + } + } +} + diff --git a/openapi/src/models/ops_genie_config.rs b/openapi/src/models/ops_genie_config.rs new file mode 100755 index 00000000..8aafd2ed --- /dev/null +++ b/openapi/src/models/ops_genie_config.rs @@ -0,0 +1,71 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct OpsGenieConfig { + #[serde(rename = "actions", skip_serializing_if = "Option::is_none")] + pub actions: Option, + #[serde(rename = "api_key", skip_serializing_if = "Option::is_none")] + pub api_key: Option, + #[serde(rename = "api_key_file", skip_serializing_if = "Option::is_none")] + pub api_key_file: Option, + #[serde(rename = "api_url", skip_serializing_if = "Option::is_none")] + pub api_url: Option>, + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "details", skip_serializing_if = "Option::is_none")] + pub details: Option>, + #[serde(rename = "entity", skip_serializing_if = "Option::is_none")] + pub entity: Option, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "note", skip_serializing_if = "Option::is_none")] + pub note: Option, + #[serde(rename = "priority", skip_serializing_if = "Option::is_none")] + pub priority: Option, + #[serde(rename = "responders", skip_serializing_if = "Option::is_none")] + pub responders: Option>, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "source", skip_serializing_if = "Option::is_none")] + pub source: Option, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option, + #[serde(rename = "update_alerts", skip_serializing_if = "Option::is_none")] + pub update_alerts: Option, +} + +impl OpsGenieConfig { + pub fn new() -> OpsGenieConfig { + OpsGenieConfig { + actions: None, + api_key: None, + api_key_file: None, + api_url: None, + description: None, + details: None, + entity: None, + http_config: None, + message: None, + note: None, + priority: None, + responders: None, + send_resolved: None, + source: None, + tags: None, + update_alerts: None, + } + } +} + diff --git a/openapi/src/models/ops_genie_config_responder.rs b/openapi/src/models/ops_genie_config_responder.rs new file mode 100755 index 00000000..307437b1 --- /dev/null +++ b/openapi/src/models/ops_genie_config_responder.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct OpsGenieConfigResponder { + /// One of those 3 should be filled. + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + /// team, user, escalation, schedule etc. + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "username", skip_serializing_if = "Option::is_none")] + pub username: Option, +} + +impl OpsGenieConfigResponder { + pub fn new() -> OpsGenieConfigResponder { + OpsGenieConfigResponder { + id: None, + name: None, + r#type: None, + username: None, + } + } +} + diff --git a/openapi/src/models/org_details_dto.rs b/openapi/src/models/org_details_dto.rs new file mode 100755 index 00000000..76f64bf4 --- /dev/null +++ b/openapi/src/models/org_details_dto.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct OrgDetailsDto { + #[serde(rename = "address", skip_serializing_if = "Option::is_none")] + pub address: Option>, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl OrgDetailsDto { + pub fn new() -> OrgDetailsDto { + OrgDetailsDto { + address: None, + id: None, + name: None, + } + } +} + diff --git a/openapi/src/models/org_dto.rs b/openapi/src/models/org_dto.rs new file mode 100755 index 00000000..f1dffbea --- /dev/null +++ b/openapi/src/models/org_dto.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct OrgDto { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl OrgDto { + pub fn new() -> OrgDto { + OrgDto { + id: None, + name: None, + } + } +} + diff --git a/openapi/src/models/org_user_dto.rs b/openapi/src/models/org_user_dto.rs new file mode 100755 index 00000000..41530206 --- /dev/null +++ b/openapi/src/models/org_user_dto.rs @@ -0,0 +1,62 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct OrgUserDto { + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "authLabels", skip_serializing_if = "Option::is_none")] + pub auth_labels: Option>, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "isDisabled", skip_serializing_if = "Option::is_none")] + pub is_disabled: Option, + #[serde(rename = "isExternallySynced", skip_serializing_if = "Option::is_none")] + pub is_externally_synced: Option, + #[serde(rename = "lastSeenAt", skip_serializing_if = "Option::is_none")] + pub last_seen_at: Option, + #[serde(rename = "lastSeenAtAge", skip_serializing_if = "Option::is_none")] + pub last_seen_at_age: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl OrgUserDto { + pub fn new() -> OrgUserDto { + OrgUserDto { + access_control: None, + auth_labels: None, + avatar_url: None, + email: None, + is_disabled: None, + is_externally_synced: None, + last_seen_at: None, + last_seen_at_age: None, + login: None, + name: None, + org_id: None, + role: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/pagerduty_config.rs b/openapi/src/models/pagerduty_config.rs new file mode 100755 index 00000000..e7bc32b9 --- /dev/null +++ b/openapi/src/models/pagerduty_config.rs @@ -0,0 +1,77 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PagerdutyConfig { + #[serde(rename = "class", skip_serializing_if = "Option::is_none")] + pub class: Option, + #[serde(rename = "client", skip_serializing_if = "Option::is_none")] + pub client: Option, + #[serde(rename = "client_url", skip_serializing_if = "Option::is_none")] + pub client_url: Option, + #[serde(rename = "component", skip_serializing_if = "Option::is_none")] + pub component: Option, + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "details", skip_serializing_if = "Option::is_none")] + pub details: Option>, + #[serde(rename = "group", skip_serializing_if = "Option::is_none")] + pub group: Option, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "images", skip_serializing_if = "Option::is_none")] + pub images: Option>, + #[serde(rename = "links", skip_serializing_if = "Option::is_none")] + pub links: Option>, + #[serde(rename = "routing_key", skip_serializing_if = "Option::is_none")] + pub routing_key: Option, + #[serde(rename = "routing_key_file", skip_serializing_if = "Option::is_none")] + pub routing_key_file: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "service_key", skip_serializing_if = "Option::is_none")] + pub service_key: Option, + #[serde(rename = "service_key_file", skip_serializing_if = "Option::is_none")] + pub service_key_file: Option, + #[serde(rename = "severity", skip_serializing_if = "Option::is_none")] + pub severity: Option, + #[serde(rename = "source", skip_serializing_if = "Option::is_none")] + pub source: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option>, +} + +impl PagerdutyConfig { + pub fn new() -> PagerdutyConfig { + PagerdutyConfig { + class: None, + client: None, + client_url: None, + component: None, + description: None, + details: None, + group: None, + http_config: None, + images: None, + links: None, + routing_key: None, + routing_key_file: None, + send_resolved: None, + service_key: None, + service_key_file: None, + severity: None, + source: None, + url: None, + } + } +} + diff --git a/openapi/src/models/pagerduty_image.rs b/openapi/src/models/pagerduty_image.rs new file mode 100755 index 00000000..41d95aa6 --- /dev/null +++ b/openapi/src/models/pagerduty_image.rs @@ -0,0 +1,34 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PagerdutyImage : PagerdutyImage is an image +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PagerdutyImage { + #[serde(rename = "alt", skip_serializing_if = "Option::is_none")] + pub alt: Option, + #[serde(rename = "href", skip_serializing_if = "Option::is_none")] + pub href: Option, + #[serde(rename = "src", skip_serializing_if = "Option::is_none")] + pub src: Option, +} + +impl PagerdutyImage { + /// PagerdutyImage is an image + pub fn new() -> PagerdutyImage { + PagerdutyImage { + alt: None, + href: None, + src: None, + } + } +} + diff --git a/openapi/src/models/pagerduty_link.rs b/openapi/src/models/pagerduty_link.rs new file mode 100755 index 00000000..d9802c28 --- /dev/null +++ b/openapi/src/models/pagerduty_link.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PagerdutyLink : PagerdutyLink is a link +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PagerdutyLink { + #[serde(rename = "href", skip_serializing_if = "Option::is_none")] + pub href: Option, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, +} + +impl PagerdutyLink { + /// PagerdutyLink is a link + pub fn new() -> PagerdutyLink { + PagerdutyLink { + href: None, + text: None, + } + } +} + diff --git a/openapi/src/models/patch_annotations_cmd.rs b/openapi/src/models/patch_annotations_cmd.rs new file mode 100755 index 00000000..81c20140 --- /dev/null +++ b/openapi/src/models/patch_annotations_cmd.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PatchAnnotationsCmd { + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "time", skip_serializing_if = "Option::is_none")] + pub time: Option, + #[serde(rename = "timeEnd", skip_serializing_if = "Option::is_none")] + pub time_end: Option, +} + +impl PatchAnnotationsCmd { + pub fn new() -> PatchAnnotationsCmd { + PatchAnnotationsCmd { + data: None, + id: None, + tags: None, + text: None, + time: None, + time_end: None, + } + } +} + diff --git a/openapi/src/models/patch_library_element_command.rs b/openapi/src/models/patch_library_element_command.rs new file mode 100755 index 00000000..ea683fdd --- /dev/null +++ b/openapi/src/models/patch_library_element_command.rs @@ -0,0 +1,66 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PatchLibraryElementCommand : PatchLibraryElementCommand is the command for patching a LibraryElement +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PatchLibraryElementCommand { + /// ID of the folder where the library element is stored. Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + /// UID of the folder where the library element is stored. + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + /// Kind of element to create, Use 1 for library panels or 2 for c. Description: 1 - library panels 2 - library variables + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, + /// The JSON model for the library element. + #[serde(rename = "model", skip_serializing_if = "Option::is_none")] + pub model: Option, + /// Name of the library element. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + /// Version of the library element you are updating. + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl PatchLibraryElementCommand { + /// PatchLibraryElementCommand is the command for patching a LibraryElement + pub fn new() -> PatchLibraryElementCommand { + PatchLibraryElementCommand { + folder_id: None, + folder_uid: None, + kind: None, + model: None, + name: None, + uid: None, + version: None, + } + } +} +/// Kind of element to create, Use 1 for library panels or 2 for c. Description: 1 - library panels 2 - library variables +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Kind { + #[serde(rename = "1")] + Variant1, + #[serde(rename = "2")] + Variant2, +} + +impl Default for Kind { + fn default() -> Kind { + Self::Variant1 + } +} + diff --git a/openapi/src/models/patch_prefs_cmd.rs b/openapi/src/models/patch_prefs_cmd.rs new file mode 100755 index 00000000..8123326e --- /dev/null +++ b/openapi/src/models/patch_prefs_cmd.rs @@ -0,0 +1,76 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PatchPrefsCmd { + #[serde(rename = "cookies", skip_serializing_if = "Option::is_none")] + pub cookies: Option>, + /// The numerical :id of a favorited dashboard + #[serde(rename = "homeDashboardId", skip_serializing_if = "Option::is_none")] + pub home_dashboard_id: Option, + #[serde(rename = "homeDashboardUID", skip_serializing_if = "Option::is_none")] + pub home_dashboard_uid: Option, + #[serde(rename = "language", skip_serializing_if = "Option::is_none")] + pub language: Option, + #[serde(rename = "queryHistory", skip_serializing_if = "Option::is_none")] + pub query_history: Option>, + #[serde(rename = "theme", skip_serializing_if = "Option::is_none")] + pub theme: Option, + #[serde(rename = "timezone", skip_serializing_if = "Option::is_none")] + pub timezone: Option, + #[serde(rename = "weekStart", skip_serializing_if = "Option::is_none")] + pub week_start: Option, +} + +impl PatchPrefsCmd { + pub fn new() -> PatchPrefsCmd { + PatchPrefsCmd { + cookies: None, + home_dashboard_id: None, + home_dashboard_uid: None, + language: None, + query_history: None, + theme: None, + timezone: None, + week_start: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Theme { + #[serde(rename = "light")] + Light, + #[serde(rename = "dark")] + Dark, +} + +impl Default for Theme { + fn default() -> Theme { + Self::Light + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Timezone { + #[serde(rename = "utc")] + Utc, + #[serde(rename = "browser")] + Browser, +} + +impl Default for Timezone { + fn default() -> Timezone { + Self::Utc + } +} + diff --git a/openapi/src/models/patch_query_comment_in_query_history_command.rs b/openapi/src/models/patch_query_comment_in_query_history_command.rs new file mode 100755 index 00000000..a99589f3 --- /dev/null +++ b/openapi/src/models/patch_query_comment_in_query_history_command.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PatchQueryCommentInQueryHistoryCommand : PatchQueryCommentInQueryHistoryCommand is the command for updating comment for query in query history +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PatchQueryCommentInQueryHistoryCommand { + /// Updated comment + #[serde(rename = "comment", skip_serializing_if = "Option::is_none")] + pub comment: Option, +} + +impl PatchQueryCommentInQueryHistoryCommand { + /// PatchQueryCommentInQueryHistoryCommand is the command for updating comment for query in query history + pub fn new() -> PatchQueryCommentInQueryHistoryCommand { + PatchQueryCommentInQueryHistoryCommand { + comment: None, + } + } +} + diff --git a/openapi/src/models/peer_status.rs b/openapi/src/models/peer_status.rs new file mode 100755 index 00000000..797f1813 --- /dev/null +++ b/openapi/src/models/peer_status.rs @@ -0,0 +1,33 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PeerStatus : PeerStatus peer status +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PeerStatus { + /// address + #[serde(rename = "address")] + pub address: String, + /// name + #[serde(rename = "name")] + pub name: String, +} + +impl PeerStatus { + /// PeerStatus peer status + pub fn new(address: String, name: String) -> PeerStatus { + PeerStatus { + address, + name, + } + } +} + diff --git a/openapi/src/models/permission.rs b/openapi/src/models/permission.rs new file mode 100755 index 00000000..3fd0d1cd --- /dev/null +++ b/openapi/src/models/permission.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Permission { + #[serde(rename = "action", skip_serializing_if = "Option::is_none")] + pub action: Option, + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "scope", skip_serializing_if = "Option::is_none")] + pub scope: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, +} + +impl Permission { + pub fn new() -> Permission { + Permission { + action: None, + created: None, + scope: None, + updated: None, + } + } +} + diff --git a/openapi/src/models/playlist.rs b/openapi/src/models/playlist.rs new file mode 100755 index 00000000..0ffd1371 --- /dev/null +++ b/openapi/src/models/playlist.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Playlist : Playlist model +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Playlist { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl Playlist { + /// Playlist model + pub fn new() -> Playlist { + Playlist { + id: None, + interval: None, + name: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/playlist_dashboard.rs b/openapi/src/models/playlist_dashboard.rs new file mode 100755 index 00000000..04663cf6 --- /dev/null +++ b/openapi/src/models/playlist_dashboard.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PlaylistDashboard { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "order", skip_serializing_if = "Option::is_none")] + pub order: Option, + #[serde(rename = "slug", skip_serializing_if = "Option::is_none")] + pub slug: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uri", skip_serializing_if = "Option::is_none")] + pub uri: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl PlaylistDashboard { + pub fn new() -> PlaylistDashboard { + PlaylistDashboard { + id: None, + order: None, + slug: None, + title: None, + uri: None, + url: None, + } + } +} + diff --git a/openapi/src/models/playlist_dto.rs b/openapi/src/models/playlist_dto.rs new file mode 100755 index 00000000..7d4645a4 --- /dev/null +++ b/openapi/src/models/playlist_dto.rs @@ -0,0 +1,39 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PlaylistDto { + /// Interval sets the time between switching views in a playlist. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + /// The ordered list of items that the playlist will iterate over. + #[serde(rename = "items", skip_serializing_if = "Option::is_none")] + pub items: Option>, + /// Name of the playlist. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + /// Unique playlist identifier. Generated on creation, either by the creator of the playlist of by the application. + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl PlaylistDto { + pub fn new() -> PlaylistDto { + PlaylistDto { + interval: None, + items: None, + name: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/playlist_item.rs b/openapi/src/models/playlist_item.rs new file mode 100755 index 00000000..95344742 --- /dev/null +++ b/openapi/src/models/playlist_item.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PlaylistItem { + #[serde(rename = "Id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "PlaylistId", skip_serializing_if = "Option::is_none")] + pub playlist_id: Option, + #[serde(rename = "order", skip_serializing_if = "Option::is_none")] + pub order: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "value", skip_serializing_if = "Option::is_none")] + pub value: Option, +} + +impl PlaylistItem { + pub fn new() -> PlaylistItem { + PlaylistItem { + id: None, + playlist_id: None, + order: None, + title: None, + r#type: None, + value: None, + } + } +} + diff --git a/openapi/src/models/playlist_item_dto.rs b/openapi/src/models/playlist_item_dto.rs new file mode 100755 index 00000000..5fe786b0 --- /dev/null +++ b/openapi/src/models/playlist_item_dto.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PlaylistItemDto { + /// Title is an unused property -- it will be removed in the future + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + /// Type of the item. + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + /// Value depends on type and describes the playlist item. dashboard_by_id: The value is an internal numerical identifier set by Grafana. This is not portable as the numerical identifier is non-deterministic between different instances. Will be replaced by dashboard_by_uid in the future. (deprecated) dashboard_by_tag: The value is a tag which is set on any number of dashboards. All dashboards behind the tag will be added to the playlist. dashboard_by_uid: The value is the dashboard UID + #[serde(rename = "value", skip_serializing_if = "Option::is_none")] + pub value: Option, +} + +impl PlaylistItemDto { + pub fn new() -> PlaylistItemDto { + PlaylistItemDto { + title: None, + r#type: None, + value: None, + } + } +} + diff --git a/openapi/src/models/post_annotation_200_response.rs b/openapi/src/models/post_annotation_200_response.rs new file mode 100755 index 00000000..003b10b4 --- /dev/null +++ b/openapi/src/models/post_annotation_200_response.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostAnnotation200Response { + /// ID Identifier of the created annotation. + #[serde(rename = "id")] + pub id: i64, + /// Message Message of the created annotation. + #[serde(rename = "message")] + pub message: String, +} + +impl PostAnnotation200Response { + pub fn new(id: i64, message: String) -> PostAnnotation200Response { + PostAnnotation200Response { + id, + message, + } + } +} + diff --git a/openapi/src/models/post_annotations_cmd.rs b/openapi/src/models/post_annotations_cmd.rs new file mode 100755 index 00000000..c1240b9f --- /dev/null +++ b/openapi/src/models/post_annotations_cmd.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostAnnotationsCmd { + #[serde(rename = "dashboardId", skip_serializing_if = "Option::is_none")] + pub dashboard_id: Option, + #[serde(rename = "dashboardUID", skip_serializing_if = "Option::is_none")] + pub dashboard_uid: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option, + #[serde(rename = "panelId", skip_serializing_if = "Option::is_none")] + pub panel_id: Option, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + #[serde(rename = "text")] + pub text: String, + #[serde(rename = "time", skip_serializing_if = "Option::is_none")] + pub time: Option, + #[serde(rename = "timeEnd", skip_serializing_if = "Option::is_none")] + pub time_end: Option, +} + +impl PostAnnotationsCmd { + pub fn new(text: String) -> PostAnnotationsCmd { + PostAnnotationsCmd { + dashboard_id: None, + dashboard_uid: None, + data: None, + panel_id: None, + tags: None, + text, + time: None, + time_end: None, + } + } +} + diff --git a/openapi/src/models/post_dashboard_200_response.rs b/openapi/src/models/post_dashboard_200_response.rs new file mode 100755 index 00000000..5320e6ad --- /dev/null +++ b/openapi/src/models/post_dashboard_200_response.rs @@ -0,0 +1,51 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostDashboard200Response { + /// FolderUID The unique identifier (uid) of the folder the dashboard belongs to. + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + /// ID The unique identifier (id) of the created/updated dashboard. + #[serde(rename = "id")] + pub id: i64, + /// Status status of the response. + #[serde(rename = "status")] + pub status: String, + /// Slug The slug of the dashboard. + #[serde(rename = "title")] + pub title: String, + /// UID The unique identifier (uid) of the created/updated dashboard. + #[serde(rename = "uid")] + pub uid: String, + /// URL The relative URL for accessing the created/updated dashboard. + #[serde(rename = "url")] + pub url: String, + /// Version The version of the dashboard. + #[serde(rename = "version")] + pub version: i64, +} + +impl PostDashboard200Response { + pub fn new(id: i64, status: String, title: String, uid: String, url: String, version: i64) -> PostDashboard200Response { + PostDashboard200Response { + folder_uid: None, + id, + status, + title, + uid, + url, + version, + } + } +} + diff --git a/openapi/src/models/post_graphite_annotations_cmd.rs b/openapi/src/models/post_graphite_annotations_cmd.rs new file mode 100755 index 00000000..05784bfc --- /dev/null +++ b/openapi/src/models/post_graphite_annotations_cmd.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostGraphiteAnnotationsCmd { + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option, + #[serde(rename = "tags", default, with = "::serde_with::rust::double_option", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + #[serde(rename = "what", skip_serializing_if = "Option::is_none")] + pub what: Option, + #[serde(rename = "when", skip_serializing_if = "Option::is_none")] + pub when: Option, +} + +impl PostGraphiteAnnotationsCmd { + pub fn new() -> PostGraphiteAnnotationsCmd { + PostGraphiteAnnotationsCmd { + data: None, + tags: None, + what: None, + when: None, + } + } +} + diff --git a/openapi/src/models/post_silences_ok_body.rs b/openapi/src/models/post_silences_ok_body.rs new file mode 100755 index 00000000..a26c176d --- /dev/null +++ b/openapi/src/models/post_silences_ok_body.rs @@ -0,0 +1,27 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostSilencesOkBody { + /// silence ID + #[serde(rename = "silenceID", skip_serializing_if = "Option::is_none")] + pub silence_id: Option, +} + +impl PostSilencesOkBody { + pub fn new() -> PostSilencesOkBody { + PostSilencesOkBody { + silence_id: None, + } + } +} + diff --git a/openapi/src/models/postable_alert.rs b/openapi/src/models/postable_alert.rs new file mode 100755 index 00000000..8e17a832 --- /dev/null +++ b/openapi/src/models/postable_alert.rs @@ -0,0 +1,45 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PostableAlert : PostableAlert postable alert +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableAlert { + /// LabelSet label set + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + /// ends at Format: date-time + #[serde(rename = "endsAt", skip_serializing_if = "Option::is_none")] + pub ends_at: Option, + /// generator URL Format: uri + #[serde(rename = "generatorURL", skip_serializing_if = "Option::is_none")] + pub generator_url: Option, + /// LabelSet label set + #[serde(rename = "labels")] + pub labels: std::collections::HashMap, + /// starts at Format: date-time + #[serde(rename = "startsAt", skip_serializing_if = "Option::is_none")] + pub starts_at: Option, +} + +impl PostableAlert { + /// PostableAlert postable alert + pub fn new(labels: std::collections::HashMap) -> PostableAlert { + PostableAlert { + annotations: None, + ends_at: None, + generator_url: None, + labels, + starts_at: None, + } + } +} + diff --git a/openapi/src/models/postable_api_alerting_config.rs b/openapi/src/models/postable_api_alerting_config.rs new file mode 100755 index 00000000..83c0f6ea --- /dev/null +++ b/openapi/src/models/postable_api_alerting_config.rs @@ -0,0 +1,48 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PostableApiAlertingConfig : nolint:revive +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableApiAlertingConfig { + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option>, + #[serde(rename = "inhibit_rules", skip_serializing_if = "Option::is_none")] + pub inhibit_rules: Option>, + /// MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0. + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + /// Override with our superset receiver type + #[serde(rename = "receivers", skip_serializing_if = "Option::is_none")] + pub receivers: Option>, + #[serde(rename = "route", skip_serializing_if = "Option::is_none")] + pub route: Option>, + #[serde(rename = "templates", skip_serializing_if = "Option::is_none")] + pub templates: Option>, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl PostableApiAlertingConfig { + /// nolint:revive + pub fn new() -> PostableApiAlertingConfig { + PostableApiAlertingConfig { + global: None, + inhibit_rules: None, + mute_time_intervals: None, + receivers: None, + route: None, + templates: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/postable_api_receiver.rs b/openapi/src/models/postable_api_receiver.rs new file mode 100755 index 00000000..26fc0aaa --- /dev/null +++ b/openapi/src/models/postable_api_receiver.rs @@ -0,0 +1,71 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PostableApiReceiver : nolint:revive +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableApiReceiver { + #[serde(rename = "discord_configs", skip_serializing_if = "Option::is_none")] + pub discord_configs: Option>, + #[serde(rename = "email_configs", skip_serializing_if = "Option::is_none")] + pub email_configs: Option>, + #[serde(rename = "grafana_managed_receiver_configs", skip_serializing_if = "Option::is_none")] + pub grafana_managed_receiver_configs: Option>, + #[serde(rename = "msteams_configs", skip_serializing_if = "Option::is_none")] + pub msteams_configs: Option>, + /// A unique identifier for this receiver. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "opsgenie_configs", skip_serializing_if = "Option::is_none")] + pub opsgenie_configs: Option>, + #[serde(rename = "pagerduty_configs", skip_serializing_if = "Option::is_none")] + pub pagerduty_configs: Option>, + #[serde(rename = "pushover_configs", skip_serializing_if = "Option::is_none")] + pub pushover_configs: Option>, + #[serde(rename = "slack_configs", skip_serializing_if = "Option::is_none")] + pub slack_configs: Option>, + #[serde(rename = "sns_configs", skip_serializing_if = "Option::is_none")] + pub sns_configs: Option>, + #[serde(rename = "telegram_configs", skip_serializing_if = "Option::is_none")] + pub telegram_configs: Option>, + #[serde(rename = "victorops_configs", skip_serializing_if = "Option::is_none")] + pub victorops_configs: Option>, + #[serde(rename = "webex_configs", skip_serializing_if = "Option::is_none")] + pub webex_configs: Option>, + #[serde(rename = "webhook_configs", skip_serializing_if = "Option::is_none")] + pub webhook_configs: Option>, + #[serde(rename = "wechat_configs", skip_serializing_if = "Option::is_none")] + pub wechat_configs: Option>, +} + +impl PostableApiReceiver { + /// nolint:revive + pub fn new() -> PostableApiReceiver { + PostableApiReceiver { + discord_configs: None, + email_configs: None, + grafana_managed_receiver_configs: None, + msteams_configs: None, + name: None, + opsgenie_configs: None, + pagerduty_configs: None, + pushover_configs: None, + slack_configs: None, + sns_configs: None, + telegram_configs: None, + victorops_configs: None, + webex_configs: None, + webhook_configs: None, + wechat_configs: None, + } + } +} + diff --git a/openapi/src/models/postable_extended_rule_node.rs b/openapi/src/models/postable_extended_rule_node.rs new file mode 100755 index 00000000..c2c0f4bb --- /dev/null +++ b/openapi/src/models/postable_extended_rule_node.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableExtendedRuleNode { + #[serde(rename = "alert", skip_serializing_if = "Option::is_none")] + pub alert: Option, + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + #[serde(rename = "expr", skip_serializing_if = "Option::is_none")] + pub expr: Option, + #[serde(rename = "for", skip_serializing_if = "Option::is_none")] + pub r#for: Option, + #[serde(rename = "grafana_alert", skip_serializing_if = "Option::is_none")] + pub grafana_alert: Option>, + #[serde(rename = "keep_firing_for", skip_serializing_if = "Option::is_none")] + pub keep_firing_for: Option, + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "record", skip_serializing_if = "Option::is_none")] + pub record: Option, +} + +impl PostableExtendedRuleNode { + pub fn new() -> PostableExtendedRuleNode { + PostableExtendedRuleNode { + alert: None, + annotations: None, + expr: None, + r#for: None, + grafana_alert: None, + keep_firing_for: None, + labels: None, + record: None, + } + } +} + diff --git a/openapi/src/models/postable_extended_rule_node_extended.rs b/openapi/src/models/postable_extended_rule_node_extended.rs new file mode 100755 index 00000000..719876b4 --- /dev/null +++ b/openapi/src/models/postable_extended_rule_node_extended.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableExtendedRuleNodeExtended { + #[serde(rename = "folderTitle", skip_serializing_if = "Option::is_none")] + pub folder_title: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "rule")] + pub rule: Box, + #[serde(rename = "ruleGroup", skip_serializing_if = "Option::is_none")] + pub rule_group: Option, +} + +impl PostableExtendedRuleNodeExtended { + pub fn new(rule: models::PostableExtendedRuleNode) -> PostableExtendedRuleNodeExtended { + PostableExtendedRuleNodeExtended { + folder_title: None, + folder_uid: None, + rule: Box::new(rule), + rule_group: None, + } + } +} + diff --git a/openapi/src/models/postable_grafana_receiver.rs b/openapi/src/models/postable_grafana_receiver.rs new file mode 100755 index 00000000..40f9c84b --- /dev/null +++ b/openapi/src/models/postable_grafana_receiver.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableGrafanaReceiver { + #[serde(rename = "disableResolveMessage", skip_serializing_if = "Option::is_none")] + pub disable_resolve_message: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "secureSettings", skip_serializing_if = "Option::is_none")] + pub secure_settings: Option>, + #[serde(rename = "settings", skip_serializing_if = "Option::is_none")] + pub settings: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl PostableGrafanaReceiver { + pub fn new() -> PostableGrafanaReceiver { + PostableGrafanaReceiver { + disable_resolve_message: None, + name: None, + secure_settings: None, + settings: None, + r#type: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/postable_grafana_receivers.rs b/openapi/src/models/postable_grafana_receivers.rs new file mode 100755 index 00000000..7f0e71f9 --- /dev/null +++ b/openapi/src/models/postable_grafana_receivers.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableGrafanaReceivers { + #[serde(rename = "grafana_managed_receiver_configs", skip_serializing_if = "Option::is_none")] + pub grafana_managed_receiver_configs: Option>, +} + +impl PostableGrafanaReceivers { + pub fn new() -> PostableGrafanaReceivers { + PostableGrafanaReceivers { + grafana_managed_receiver_configs: None, + } + } +} + diff --git a/openapi/src/models/postable_grafana_rule.rs b/openapi/src/models/postable_grafana_rule.rs new file mode 100755 index 00000000..7d344458 --- /dev/null +++ b/openapi/src/models/postable_grafana_rule.rs @@ -0,0 +1,79 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableGrafanaRule { + #[serde(rename = "condition", skip_serializing_if = "Option::is_none")] + pub condition: Option, + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "exec_err_state", skip_serializing_if = "Option::is_none")] + pub exec_err_state: Option, + #[serde(rename = "is_paused", skip_serializing_if = "Option::is_none")] + pub is_paused: Option, + #[serde(rename = "no_data_state", skip_serializing_if = "Option::is_none")] + pub no_data_state: Option, + #[serde(rename = "notification_settings", skip_serializing_if = "Option::is_none")] + pub notification_settings: Option>, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl PostableGrafanaRule { + pub fn new() -> PostableGrafanaRule { + PostableGrafanaRule { + condition: None, + data: None, + exec_err_state: None, + is_paused: None, + no_data_state: None, + notification_settings: None, + title: None, + uid: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum ExecErrState { + #[serde(rename = "OK")] + Ok, + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "Error")] + Error, +} + +impl Default for ExecErrState { + fn default() -> ExecErrState { + Self::Ok + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum NoDataState { + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "NoData")] + NoData, + #[serde(rename = "OK")] + Ok, +} + +impl Default for NoDataState { + fn default() -> NoDataState { + Self::Alerting + } +} + diff --git a/openapi/src/models/postable_n_galert_config.rs b/openapi/src/models/postable_n_galert_config.rs new file mode 100755 index 00000000..ef114748 --- /dev/null +++ b/openapi/src/models/postable_n_galert_config.rs @@ -0,0 +1,42 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableNGalertConfig { + #[serde(rename = "alertmanagersChoice", skip_serializing_if = "Option::is_none")] + pub alertmanagers_choice: Option, +} + +impl PostableNGalertConfig { + pub fn new() -> PostableNGalertConfig { + PostableNGalertConfig { + alertmanagers_choice: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum AlertmanagersChoice { + #[serde(rename = "all")] + All, + #[serde(rename = "internal")] + Internal, + #[serde(rename = "external")] + External, +} + +impl Default for AlertmanagersChoice { + fn default() -> AlertmanagersChoice { + Self::All + } +} + diff --git a/openapi/src/models/postable_rule_group_config.rs b/openapi/src/models/postable_rule_group_config.rs new file mode 100755 index 00000000..1f8ed3ce --- /dev/null +++ b/openapi/src/models/postable_rule_group_config.rs @@ -0,0 +1,33 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableRuleGroupConfig { + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "rules", skip_serializing_if = "Option::is_none")] + pub rules: Option>, +} + +impl PostableRuleGroupConfig { + pub fn new() -> PostableRuleGroupConfig { + PostableRuleGroupConfig { + interval: None, + name: None, + rules: None, + } + } +} + diff --git a/openapi/src/models/postable_silence.rs b/openapi/src/models/postable_silence.rs new file mode 100755 index 00000000..98deabd2 --- /dev/null +++ b/openapi/src/models/postable_silence.rs @@ -0,0 +1,49 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PostableSilence : PostableSilence postable silence +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableSilence { + /// comment + #[serde(rename = "comment")] + pub comment: String, + /// created by + #[serde(rename = "createdBy")] + pub created_by: String, + /// ends at + #[serde(rename = "endsAt")] + pub ends_at: String, + /// id + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + /// Matchers matchers + #[serde(rename = "matchers")] + pub matchers: Vec, + /// starts at + #[serde(rename = "startsAt")] + pub starts_at: String, +} + +impl PostableSilence { + /// PostableSilence postable silence + pub fn new(comment: String, created_by: String, ends_at: String, matchers: Vec, starts_at: String) -> PostableSilence { + PostableSilence { + comment, + created_by, + ends_at, + id: None, + matchers, + starts_at, + } + } +} + diff --git a/openapi/src/models/postable_time_intervals.rs b/openapi/src/models/postable_time_intervals.rs new file mode 100755 index 00000000..cf3e8931 --- /dev/null +++ b/openapi/src/models/postable_time_intervals.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableTimeIntervals { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl PostableTimeIntervals { + pub fn new() -> PostableTimeIntervals { + PostableTimeIntervals { + name: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/postable_user_config.rs b/openapi/src/models/postable_user_config.rs new file mode 100755 index 00000000..f6c982ce --- /dev/null +++ b/openapi/src/models/postable_user_config.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PostableUserConfig { + #[serde(rename = "alertmanager_config", skip_serializing_if = "Option::is_none")] + pub alertmanager_config: Option>, + #[serde(rename = "template_files", skip_serializing_if = "Option::is_none")] + pub template_files: Option>, +} + +impl PostableUserConfig { + pub fn new() -> PostableUserConfig { + PostableUserConfig { + alertmanager_config: None, + template_files: None, + } + } +} + diff --git a/openapi/src/models/preferences.rs b/openapi/src/models/preferences.rs new file mode 100755 index 00000000..aa45f70f --- /dev/null +++ b/openapi/src/models/preferences.rs @@ -0,0 +1,51 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Preferences : Spec defines user, team or org Grafana preferences +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Preferences { + #[serde(rename = "cookiePreferences", skip_serializing_if = "Option::is_none")] + pub cookie_preferences: Option>, + /// UID for the home dashboard + #[serde(rename = "homeDashboardUID", skip_serializing_if = "Option::is_none")] + pub home_dashboard_uid: Option, + /// Selected language (beta) + #[serde(rename = "language", skip_serializing_if = "Option::is_none")] + pub language: Option, + #[serde(rename = "queryHistory", skip_serializing_if = "Option::is_none")] + pub query_history: Option>, + /// Theme light, dark, empty is default + #[serde(rename = "theme", skip_serializing_if = "Option::is_none")] + pub theme: Option, + /// The timezone selection TODO: this should use the timezone defined in common + #[serde(rename = "timezone", skip_serializing_if = "Option::is_none")] + pub timezone: Option, + /// WeekStart day of the week (sunday, monday, etc) + #[serde(rename = "weekStart", skip_serializing_if = "Option::is_none")] + pub week_start: Option, +} + +impl Preferences { + /// Spec defines user, team or org Grafana preferences + pub fn new() -> Preferences { + Preferences { + cookie_preferences: None, + home_dashboard_uid: None, + language: None, + query_history: None, + theme: None, + timezone: None, + week_start: None, + } + } +} + diff --git a/openapi/src/models/prometheus_remote_write_target_json.rs b/openapi/src/models/prometheus_remote_write_target_json.rs new file mode 100755 index 00000000..7ac8f4b9 --- /dev/null +++ b/openapi/src/models/prometheus_remote_write_target_json.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PrometheusRemoteWriteTargetJson { + #[serde(rename = "data_source_uid", skip_serializing_if = "Option::is_none")] + pub data_source_uid: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "remote_write_path", skip_serializing_if = "Option::is_none")] + pub remote_write_path: Option, +} + +impl PrometheusRemoteWriteTargetJson { + pub fn new() -> PrometheusRemoteWriteTargetJson { + PrometheusRemoteWriteTargetJson { + data_source_uid: None, + id: None, + remote_write_path: None, + } + } +} + diff --git a/openapi/src/models/provisioned_alert_rule.rs b/openapi/src/models/provisioned_alert_rule.rs new file mode 100755 index 00000000..49701e8b --- /dev/null +++ b/openapi/src/models/provisioned_alert_rule.rs @@ -0,0 +1,107 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ProvisionedAlertRule { + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + #[serde(rename = "condition")] + pub condition: String, + #[serde(rename = "data")] + pub data: Vec, + #[serde(rename = "execErrState")] + pub exec_err_state: ExecErrState, + #[serde(rename = "folderUID")] + pub folder_uid: String, + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "for")] + pub r#for: i64, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isPaused", skip_serializing_if = "Option::is_none")] + pub is_paused: Option, + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "noDataState")] + pub no_data_state: NoDataState, + #[serde(rename = "notification_settings", skip_serializing_if = "Option::is_none")] + pub notification_settings: Option>, + #[serde(rename = "orgID")] + pub org_id: i64, + #[serde(rename = "provenance", skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(rename = "ruleGroup")] + pub rule_group: String, + #[serde(rename = "title")] + pub title: String, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, +} + +impl ProvisionedAlertRule { + pub fn new(condition: String, data: Vec, exec_err_state: ExecErrState, folder_uid: String, r#for: i64, no_data_state: NoDataState, org_id: i64, rule_group: String, title: String) -> ProvisionedAlertRule { + ProvisionedAlertRule { + annotations: None, + condition, + data, + exec_err_state, + folder_uid, + r#for, + id: None, + is_paused: None, + labels: None, + no_data_state, + notification_settings: None, + org_id, + provenance: None, + rule_group, + title, + uid: None, + updated: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum ExecErrState { + #[serde(rename = "OK")] + Ok, + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "Error")] + Error, +} + +impl Default for ExecErrState { + fn default() -> ExecErrState { + Self::Ok + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum NoDataState { + #[serde(rename = "Alerting")] + Alerting, + #[serde(rename = "NoData")] + NoData, + #[serde(rename = "OK")] + Ok, +} + +impl Default for NoDataState { + fn default() -> NoDataState { + Self::Alerting + } +} + diff --git a/openapi/src/models/proxy_config.rs b/openapi/src/models/proxy_config.rs new file mode 100755 index 00000000..63ab3120 --- /dev/null +++ b/openapi/src/models/proxy_config.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ProxyConfig { + /// NoProxy contains addresses that should not use a proxy. + #[serde(rename = "no_proxy", skip_serializing_if = "Option::is_none")] + pub no_proxy: Option, + #[serde(rename = "proxy_connect_header", skip_serializing_if = "Option::is_none")] + pub proxy_connect_header: Option>>, + /// ProxyFromEnvironment makes use of net/http ProxyFromEnvironment function to determine proxies. + #[serde(rename = "proxy_from_environment", skip_serializing_if = "Option::is_none")] + pub proxy_from_environment: Option, + #[serde(rename = "proxy_url", skip_serializing_if = "Option::is_none")] + pub proxy_url: Option>, +} + +impl ProxyConfig { + pub fn new() -> ProxyConfig { + ProxyConfig { + no_proxy: None, + proxy_connect_header: None, + proxy_from_environment: None, + proxy_url: None, + } + } +} + diff --git a/openapi/src/models/public_dashboard.rs b/openapi/src/models/public_dashboard.rs new file mode 100755 index 00000000..f354243b --- /dev/null +++ b/openapi/src/models/public_dashboard.rs @@ -0,0 +1,59 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PublicDashboard { + #[serde(rename = "accessToken", skip_serializing_if = "Option::is_none")] + pub access_token: Option, + #[serde(rename = "annotationsEnabled", skip_serializing_if = "Option::is_none")] + pub annotations_enabled: Option, + #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(rename = "createdBy", skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[serde(rename = "dashboardUid", skip_serializing_if = "Option::is_none")] + pub dashboard_uid: Option, + #[serde(rename = "isEnabled", skip_serializing_if = "Option::is_none")] + pub is_enabled: Option, + #[serde(rename = "recipients", skip_serializing_if = "Option::is_none")] + pub recipients: Option>, + #[serde(rename = "share", skip_serializing_if = "Option::is_none")] + pub share: Option, + #[serde(rename = "timeSelectionEnabled", skip_serializing_if = "Option::is_none")] + pub time_selection_enabled: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")] + pub updated_at: Option, + #[serde(rename = "updatedBy", skip_serializing_if = "Option::is_none")] + pub updated_by: Option, +} + +impl PublicDashboard { + pub fn new() -> PublicDashboard { + PublicDashboard { + access_token: None, + annotations_enabled: None, + created_at: None, + created_by: None, + dashboard_uid: None, + is_enabled: None, + recipients: None, + share: None, + time_selection_enabled: None, + uid: None, + updated_at: None, + updated_by: None, + } + } +} + diff --git a/openapi/src/models/public_dashboard_dto.rs b/openapi/src/models/public_dashboard_dto.rs new file mode 100755 index 00000000..3d793a77 --- /dev/null +++ b/openapi/src/models/public_dashboard_dto.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PublicDashboardDto { + #[serde(rename = "accessToken", skip_serializing_if = "Option::is_none")] + pub access_token: Option, + #[serde(rename = "annotationsEnabled", skip_serializing_if = "Option::is_none")] + pub annotations_enabled: Option, + #[serde(rename = "isEnabled", skip_serializing_if = "Option::is_none")] + pub is_enabled: Option, + #[serde(rename = "share", skip_serializing_if = "Option::is_none")] + pub share: Option, + #[serde(rename = "timeSelectionEnabled", skip_serializing_if = "Option::is_none")] + pub time_selection_enabled: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl PublicDashboardDto { + pub fn new() -> PublicDashboardDto { + PublicDashboardDto { + access_token: None, + annotations_enabled: None, + is_enabled: None, + share: None, + time_selection_enabled: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/public_dashboard_list_response.rs b/openapi/src/models/public_dashboard_list_response.rs new file mode 100755 index 00000000..1bb2b645 --- /dev/null +++ b/openapi/src/models/public_dashboard_list_response.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PublicDashboardListResponse { + #[serde(rename = "accessToken", skip_serializing_if = "Option::is_none")] + pub access_token: Option, + #[serde(rename = "dashboardUid", skip_serializing_if = "Option::is_none")] + pub dashboard_uid: Option, + #[serde(rename = "isEnabled", skip_serializing_if = "Option::is_none")] + pub is_enabled: Option, + #[serde(rename = "slug", skip_serializing_if = "Option::is_none")] + pub slug: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl PublicDashboardListResponse { + pub fn new() -> PublicDashboardListResponse { + PublicDashboardListResponse { + access_token: None, + dashboard_uid: None, + is_enabled: None, + slug: None, + title: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/public_dashboard_list_response_with_pagination.rs b/openapi/src/models/public_dashboard_list_response_with_pagination.rs new file mode 100755 index 00000000..98d0cbc5 --- /dev/null +++ b/openapi/src/models/public_dashboard_list_response_with_pagination.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PublicDashboardListResponseWithPagination { + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "publicDashboards", skip_serializing_if = "Option::is_none")] + pub public_dashboards: Option>, + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, +} + +impl PublicDashboardListResponseWithPagination { + pub fn new() -> PublicDashboardListResponseWithPagination { + PublicDashboardListResponseWithPagination { + page: None, + per_page: None, + public_dashboards: None, + total_count: None, + } + } +} + diff --git a/openapi/src/models/public_error.rs b/openapi/src/models/public_error.rs new file mode 100755 index 00000000..deda112d --- /dev/null +++ b/openapi/src/models/public_error.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// PublicError : PublicError is derived from Error and only contains information available to the end user. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PublicError { + /// Extra Additional information about the error + #[serde(rename = "extra", skip_serializing_if = "Option::is_none")] + pub extra: Option, + /// Message A human readable message + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + /// MessageID A unique identifier for the error + #[serde(rename = "messageId")] + pub message_id: String, + /// StatusCode The HTTP status code returned + #[serde(rename = "statusCode")] + pub status_code: i64, +} + +impl PublicError { + /// PublicError is derived from Error and only contains information available to the end user. + pub fn new(message_id: String, status_code: i64) -> PublicError { + PublicError { + extra: None, + message: None, + message_id, + status_code, + } + } +} + diff --git a/openapi/src/models/pushover_config.rs b/openapi/src/models/pushover_config.rs new file mode 100755 index 00000000..7c3fbc3e --- /dev/null +++ b/openapi/src/models/pushover_config.rs @@ -0,0 +1,74 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct PushoverConfig { + #[serde(rename = "device", skip_serializing_if = "Option::is_none")] + pub device: Option, + #[serde(rename = "expire", skip_serializing_if = "Option::is_none")] + pub expire: Option, + #[serde(rename = "html", skip_serializing_if = "Option::is_none")] + pub html: Option, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "priority", skip_serializing_if = "Option::is_none")] + pub priority: Option, + #[serde(rename = "retry", skip_serializing_if = "Option::is_none")] + pub retry: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "sound", skip_serializing_if = "Option::is_none")] + pub sound: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "token", skip_serializing_if = "Option::is_none")] + pub token: Option, + #[serde(rename = "token_file", skip_serializing_if = "Option::is_none")] + pub token_file: Option, + #[serde(rename = "ttl", skip_serializing_if = "Option::is_none")] + pub ttl: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "url_title", skip_serializing_if = "Option::is_none")] + pub url_title: Option, + #[serde(rename = "user_key", skip_serializing_if = "Option::is_none")] + pub user_key: Option, + #[serde(rename = "user_key_file", skip_serializing_if = "Option::is_none")] + pub user_key_file: Option, +} + +impl PushoverConfig { + pub fn new() -> PushoverConfig { + PushoverConfig { + device: None, + expire: None, + html: None, + http_config: None, + message: None, + priority: None, + retry: None, + send_resolved: None, + sound: None, + title: None, + token: None, + token_file: None, + ttl: None, + url: None, + url_title: None, + user_key: None, + user_key_file: None, + } + } +} + diff --git a/openapi/src/models/query_data_response.rs b/openapi/src/models/query_data_response.rs new file mode 100755 index 00000000..ee70d0c1 --- /dev/null +++ b/openapi/src/models/query_data_response.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// QueryDataResponse : It is the return type of a QueryData call. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryDataResponse { + /// The QueryData method the QueryDataHandler method will set the RefId property on the DataResponses' frames based on these RefIDs. + #[serde(rename = "results", skip_serializing_if = "Option::is_none")] + pub results: Option>, +} + +impl QueryDataResponse { + /// It is the return type of a QueryData call. + pub fn new() -> QueryDataResponse { + QueryDataResponse { + results: None, + } + } +} + diff --git a/openapi/src/models/query_history_delete_query_response.rs b/openapi/src/models/query_history_delete_query_response.rs new file mode 100755 index 00000000..dabac1c8 --- /dev/null +++ b/openapi/src/models/query_history_delete_query_response.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// QueryHistoryDeleteQueryResponse : QueryHistoryDeleteQueryResponse is the response struct for deleting a query from query history +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryHistoryDeleteQueryResponse { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, +} + +impl QueryHistoryDeleteQueryResponse { + /// QueryHistoryDeleteQueryResponse is the response struct for deleting a query from query history + pub fn new() -> QueryHistoryDeleteQueryResponse { + QueryHistoryDeleteQueryResponse { + id: None, + message: None, + } + } +} + diff --git a/openapi/src/models/query_history_dto.rs b/openapi/src/models/query_history_dto.rs new file mode 100755 index 00000000..f2c54dea --- /dev/null +++ b/openapi/src/models/query_history_dto.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryHistoryDto { + #[serde(rename = "comment", skip_serializing_if = "Option::is_none")] + pub comment: Option, + #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(rename = "createdBy", skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[serde(rename = "datasourceUid", skip_serializing_if = "Option::is_none")] + pub datasource_uid: Option, + #[serde(rename = "queries", skip_serializing_if = "Option::is_none")] + pub queries: Option, + #[serde(rename = "starred", skip_serializing_if = "Option::is_none")] + pub starred: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl QueryHistoryDto { + pub fn new() -> QueryHistoryDto { + QueryHistoryDto { + comment: None, + created_at: None, + created_by: None, + datasource_uid: None, + queries: None, + starred: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/query_history_preference.rs b/openapi/src/models/query_history_preference.rs new file mode 100755 index 00000000..19517b5c --- /dev/null +++ b/openapi/src/models/query_history_preference.rs @@ -0,0 +1,27 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryHistoryPreference { + /// HomeTab one of: '' | 'query' | 'starred'; + #[serde(rename = "homeTab", skip_serializing_if = "Option::is_none")] + pub home_tab: Option, +} + +impl QueryHistoryPreference { + pub fn new() -> QueryHistoryPreference { + QueryHistoryPreference { + home_tab: None, + } + } +} + diff --git a/openapi/src/models/query_history_response.rs b/openapi/src/models/query_history_response.rs new file mode 100755 index 00000000..4d1e8db2 --- /dev/null +++ b/openapi/src/models/query_history_response.rs @@ -0,0 +1,28 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// QueryHistoryResponse : QueryHistoryResponse is a response struct for QueryHistoryDTO +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryHistoryResponse { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl QueryHistoryResponse { + /// QueryHistoryResponse is a response struct for QueryHistoryDTO + pub fn new() -> QueryHistoryResponse { + QueryHistoryResponse { + result: None, + } + } +} + diff --git a/openapi/src/models/query_history_search_response.rs b/openapi/src/models/query_history_search_response.rs new file mode 100755 index 00000000..66fe40d4 --- /dev/null +++ b/openapi/src/models/query_history_search_response.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryHistorySearchResponse { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl QueryHistorySearchResponse { + pub fn new() -> QueryHistorySearchResponse { + QueryHistorySearchResponse { + result: None, + } + } +} + diff --git a/openapi/src/models/query_history_search_result.rs b/openapi/src/models/query_history_search_result.rs new file mode 100755 index 00000000..736ec315 --- /dev/null +++ b/openapi/src/models/query_history_search_result.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryHistorySearchResult { + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "queryHistory", skip_serializing_if = "Option::is_none")] + pub query_history: Option>, + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, +} + +impl QueryHistorySearchResult { + pub fn new() -> QueryHistorySearchResult { + QueryHistorySearchResult { + page: None, + per_page: None, + query_history: None, + total_count: None, + } + } +} + diff --git a/openapi/src/models/query_stat.rs b/openapi/src/models/query_stat.rs new file mode 100755 index 00000000..1720bfeb --- /dev/null +++ b/openapi/src/models/query_stat.rs @@ -0,0 +1,96 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// QueryStat : The embedded FieldConfig's display name must be set. It corresponds to the QueryResultMetaStat on the frontend (https://github.com/grafana/grafana/blob/master/packages/grafana-data/src/types/data.ts#L53). +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QueryStat { + /// Map values to a display color NOTE: this interface is under development in the frontend... so simple map for now + #[serde(rename = "color", skip_serializing_if = "Option::is_none")] + pub color: Option, + /// Panel Specific Values + #[serde(rename = "custom", skip_serializing_if = "Option::is_none")] + pub custom: Option, + #[serde(rename = "decimals", skip_serializing_if = "Option::is_none")] + pub decimals: Option, + /// Description is human readable field metadata + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// DisplayName overrides Grafana default naming, should not be used from a data source + #[serde(rename = "displayName", skip_serializing_if = "Option::is_none")] + pub display_name: Option, + /// DisplayNameFromDS overrides Grafana default naming strategy. + #[serde(rename = "displayNameFromDS", skip_serializing_if = "Option::is_none")] + pub display_name_from_ds: Option, + /// Filterable indicates if the Field's data can be filtered by additional calls. + #[serde(rename = "filterable", skip_serializing_if = "Option::is_none")] + pub filterable: Option, + /// Interval indicates the expected regular step between values in the series. When an interval exists, consumers can identify \"missing\" values when the expected value is not present. The grafana timeseries visualization will render disconnected values when missing values are found it the time field. The interval uses the same units as the values. For time.Time, this is defined in milliseconds. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + /// The behavior when clicking on a result + #[serde(rename = "links", skip_serializing_if = "Option::is_none")] + pub links: Option>, + #[serde(rename = "mappings", skip_serializing_if = "Option::is_none")] + pub mappings: Option>, + /// ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. + #[serde(rename = "max", skip_serializing_if = "Option::is_none")] + pub max: Option, + /// ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. + #[serde(rename = "min", skip_serializing_if = "Option::is_none")] + pub min: Option, + /// Alternative to empty string + #[serde(rename = "noValue", skip_serializing_if = "Option::is_none")] + pub no_value: Option, + /// Path is an explicit path to the field in the datasource. When the frame meta includes a path, this will default to `${frame.meta.path}/${field.name} When defined, this value can be used as an identifier within the datasource scope, and may be used as an identifier to update values in a subsequent request + #[serde(rename = "path", skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(rename = "thresholds", skip_serializing_if = "Option::is_none")] + pub thresholds: Option>, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option>, + /// Numeric Options + #[serde(rename = "unit", skip_serializing_if = "Option::is_none")] + pub unit: Option, + #[serde(rename = "value", skip_serializing_if = "Option::is_none")] + pub value: Option, + /// Writeable indicates that the datasource knows how to update this value + #[serde(rename = "writeable", skip_serializing_if = "Option::is_none")] + pub writeable: Option, +} + +impl QueryStat { + /// The embedded FieldConfig's display name must be set. It corresponds to the QueryResultMetaStat on the frontend (https://github.com/grafana/grafana/blob/master/packages/grafana-data/src/types/data.ts#L53). + pub fn new() -> QueryStat { + QueryStat { + color: None, + custom: None, + decimals: None, + description: None, + display_name: None, + display_name_from_ds: None, + filterable: None, + interval: None, + links: None, + mappings: None, + max: None, + min: None, + no_value: None, + path: None, + thresholds: None, + r#type: None, + unit: None, + value: None, + writeable: None, + } + } +} + diff --git a/openapi/src/models/quota_dto.rs b/openapi/src/models/quota_dto.rs new file mode 100755 index 00000000..c9313ffd --- /dev/null +++ b/openapi/src/models/quota_dto.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct QuotaDto { + #[serde(rename = "limit", skip_serializing_if = "Option::is_none")] + pub limit: Option, + #[serde(rename = "org_id", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "target", skip_serializing_if = "Option::is_none")] + pub target: Option, + #[serde(rename = "used", skip_serializing_if = "Option::is_none")] + pub used: Option, + #[serde(rename = "user_id", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl QuotaDto { + pub fn new() -> QuotaDto { + QuotaDto { + limit: None, + org_id: None, + target: None, + used: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/receiver.rs b/openapi/src/models/receiver.rs new file mode 100755 index 00000000..abd5cd4c --- /dev/null +++ b/openapi/src/models/receiver.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Receiver { + /// active + #[serde(rename = "active")] + pub active: bool, + /// integrations + #[serde(rename = "integrations")] + pub integrations: Vec, + /// name + #[serde(rename = "name")] + pub name: String, +} + +impl Receiver { + pub fn new(active: bool, integrations: Vec, name: String) -> Receiver { + Receiver { + active, + integrations, + name, + } + } +} + diff --git a/openapi/src/models/receiver_export.rs b/openapi/src/models/receiver_export.rs new file mode 100755 index 00000000..c5cfdab6 --- /dev/null +++ b/openapi/src/models/receiver_export.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReceiverExport { + #[serde(rename = "disableResolveMessage", skip_serializing_if = "Option::is_none")] + pub disable_resolve_message: Option, + #[serde(rename = "settings", skip_serializing_if = "Option::is_none")] + pub settings: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl ReceiverExport { + pub fn new() -> ReceiverExport { + ReceiverExport { + disable_resolve_message: None, + settings: None, + r#type: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/recording_rule_json.rs b/openapi/src/models/recording_rule_json.rs new file mode 100755 index 00000000..3d9eeb17 --- /dev/null +++ b/openapi/src/models/recording_rule_json.rs @@ -0,0 +1,58 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// RecordingRuleJson : RecordingRuleJSON is the external representation of a recording rule +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RecordingRuleJson { + #[serde(rename = "active", skip_serializing_if = "Option::is_none")] + pub active: Option, + #[serde(rename = "count", skip_serializing_if = "Option::is_none")] + pub count: Option, + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "dest_data_source_uid", skip_serializing_if = "Option::is_none")] + pub dest_data_source_uid: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "prom_name", skip_serializing_if = "Option::is_none")] + pub prom_name: Option, + #[serde(rename = "queries", skip_serializing_if = "Option::is_none")] + pub queries: Option>, + #[serde(rename = "range", skip_serializing_if = "Option::is_none")] + pub range: Option, + #[serde(rename = "target_ref_id", skip_serializing_if = "Option::is_none")] + pub target_ref_id: Option, +} + +impl RecordingRuleJson { + /// RecordingRuleJSON is the external representation of a recording rule + pub fn new() -> RecordingRuleJson { + RecordingRuleJson { + active: None, + count: None, + description: None, + dest_data_source_uid: None, + id: None, + interval: None, + name: None, + prom_name: None, + queries: None, + range: None, + target_ref_id: None, + } + } +} + diff --git a/openapi/src/models/relative_time_range.rs b/openapi/src/models/relative_time_range.rs new file mode 100755 index 00000000..db34d347 --- /dev/null +++ b/openapi/src/models/relative_time_range.rs @@ -0,0 +1,33 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// RelativeTimeRange : RelativeTimeRange is the per query start and end time for requests. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RelativeTimeRange { + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "from", skip_serializing_if = "Option::is_none")] + pub from: Option, + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "to", skip_serializing_if = "Option::is_none")] + pub to: Option, +} + +impl RelativeTimeRange { + /// RelativeTimeRange is the per query start and end time for requests. + pub fn new() -> RelativeTimeRange { + RelativeTimeRange { + from: None, + to: None, + } + } +} + diff --git a/openapi/src/models/relative_time_range_export.rs b/openapi/src/models/relative_time_range_export.rs new file mode 100755 index 00000000..2709fc6c --- /dev/null +++ b/openapi/src/models/relative_time_range_export.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RelativeTimeRangeExport { + #[serde(rename = "from", skip_serializing_if = "Option::is_none")] + pub from: Option, + #[serde(rename = "to", skip_serializing_if = "Option::is_none")] + pub to: Option, +} + +impl RelativeTimeRangeExport { + pub fn new() -> RelativeTimeRangeExport { + RelativeTimeRangeExport { + from: None, + to: None, + } + } +} + diff --git a/openapi/src/models/report.rs b/openapi/src/models/report.rs new file mode 100755 index 00000000..ce36b7bd --- /dev/null +++ b/openapi/src/models/report.rs @@ -0,0 +1,79 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Report : ConfigDTO is model representation in transfer +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Report { + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "dashboards", skip_serializing_if = "Option::is_none")] + pub dashboards: Option>, + #[serde(rename = "enableCsv", skip_serializing_if = "Option::is_none")] + pub enable_csv: Option, + #[serde(rename = "enableDashboardUrl", skip_serializing_if = "Option::is_none")] + pub enable_dashboard_url: Option, + #[serde(rename = "formats", skip_serializing_if = "Option::is_none")] + pub formats: Option>, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "options", skip_serializing_if = "Option::is_none")] + pub options: Option>, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "recipients", skip_serializing_if = "Option::is_none")] + pub recipients: Option, + #[serde(rename = "replyTo", skip_serializing_if = "Option::is_none")] + pub reply_to: Option, + #[serde(rename = "scaleFactor", skip_serializing_if = "Option::is_none")] + pub scale_factor: Option, + #[serde(rename = "schedule", skip_serializing_if = "Option::is_none")] + pub schedule: Option>, + #[serde(rename = "state", skip_serializing_if = "Option::is_none")] + pub state: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl Report { + /// ConfigDTO is model representation in transfer + pub fn new() -> Report { + Report { + created: None, + dashboards: None, + enable_csv: None, + enable_dashboard_url: None, + formats: None, + id: None, + message: None, + name: None, + options: None, + org_id: None, + recipients: None, + reply_to: None, + scale_factor: None, + schedule: None, + state: None, + uid: None, + updated: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/report_branding_options.rs b/openapi/src/models/report_branding_options.rs new file mode 100755 index 00000000..0b6e479d --- /dev/null +++ b/openapi/src/models/report_branding_options.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportBrandingOptions { + #[serde(rename = "emailFooterLink", skip_serializing_if = "Option::is_none")] + pub email_footer_link: Option, + #[serde(rename = "emailFooterMode", skip_serializing_if = "Option::is_none")] + pub email_footer_mode: Option, + #[serde(rename = "emailFooterText", skip_serializing_if = "Option::is_none")] + pub email_footer_text: Option, + #[serde(rename = "emailLogoUrl", skip_serializing_if = "Option::is_none")] + pub email_logo_url: Option, + #[serde(rename = "reportLogoUrl", skip_serializing_if = "Option::is_none")] + pub report_logo_url: Option, +} + +impl ReportBrandingOptions { + pub fn new() -> ReportBrandingOptions { + ReportBrandingOptions { + email_footer_link: None, + email_footer_mode: None, + email_footer_text: None, + email_logo_url: None, + report_logo_url: None, + } + } +} + diff --git a/openapi/src/models/report_dashboard.rs b/openapi/src/models/report_dashboard.rs new file mode 100755 index 00000000..ff81c3a9 --- /dev/null +++ b/openapi/src/models/report_dashboard.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportDashboard { + #[serde(rename = "dashboard", skip_serializing_if = "Option::is_none")] + pub dashboard: Option>, + #[serde(rename = "reportVariables", skip_serializing_if = "Option::is_none")] + pub report_variables: Option, + #[serde(rename = "timeRange", skip_serializing_if = "Option::is_none")] + pub time_range: Option>, +} + +impl ReportDashboard { + pub fn new() -> ReportDashboard { + ReportDashboard { + dashboard: None, + report_variables: None, + time_range: None, + } + } +} + diff --git a/openapi/src/models/report_dashboard_id.rs b/openapi/src/models/report_dashboard_id.rs new file mode 100755 index 00000000..f454ef04 --- /dev/null +++ b/openapi/src/models/report_dashboard_id.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportDashboardId { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl ReportDashboardId { + pub fn new() -> ReportDashboardId { + ReportDashboardId { + id: None, + name: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/report_email.rs b/openapi/src/models/report_email.rs new file mode 100755 index 00000000..78f4d725 --- /dev/null +++ b/openapi/src/models/report_email.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportEmail { + /// Comma-separated list of emails to which to send the report to. + #[serde(rename = "emails", skip_serializing_if = "Option::is_none")] + pub emails: Option, + /// Send the report to the emails specified in the report. Required if emails is not present. + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + /// Send the report to the emails specified in the report. Required if emails is not present. + #[serde(rename = "useEmailsFromReport", skip_serializing_if = "Option::is_none")] + pub use_emails_from_report: Option, +} + +impl ReportEmail { + pub fn new() -> ReportEmail { + ReportEmail { + emails: None, + id: None, + use_emails_from_report: None, + } + } +} + diff --git a/openapi/src/models/report_options.rs b/openapi/src/models/report_options.rs new file mode 100755 index 00000000..41c9fbfc --- /dev/null +++ b/openapi/src/models/report_options.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportOptions { + #[serde(rename = "layout", skip_serializing_if = "Option::is_none")] + pub layout: Option, + #[serde(rename = "orientation", skip_serializing_if = "Option::is_none")] + pub orientation: Option, + #[serde(rename = "timeRange", skip_serializing_if = "Option::is_none")] + pub time_range: Option>, +} + +impl ReportOptions { + pub fn new() -> ReportOptions { + ReportOptions { + layout: None, + orientation: None, + time_range: None, + } + } +} + diff --git a/openapi/src/models/report_schedule.rs b/openapi/src/models/report_schedule.rs new file mode 100755 index 00000000..c32e12f2 --- /dev/null +++ b/openapi/src/models/report_schedule.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportSchedule { + #[serde(rename = "dayOfMonth", skip_serializing_if = "Option::is_none")] + pub day_of_month: Option, + #[serde(rename = "endDate", skip_serializing_if = "Option::is_none")] + pub end_date: Option, + #[serde(rename = "frequency", skip_serializing_if = "Option::is_none")] + pub frequency: Option, + #[serde(rename = "intervalAmount", skip_serializing_if = "Option::is_none")] + pub interval_amount: Option, + #[serde(rename = "intervalFrequency", skip_serializing_if = "Option::is_none")] + pub interval_frequency: Option, + #[serde(rename = "startDate", skip_serializing_if = "Option::is_none")] + pub start_date: Option, + #[serde(rename = "timeZone", skip_serializing_if = "Option::is_none")] + pub time_zone: Option, + #[serde(rename = "workdaysOnly", skip_serializing_if = "Option::is_none")] + pub workdays_only: Option, +} + +impl ReportSchedule { + pub fn new() -> ReportSchedule { + ReportSchedule { + day_of_month: None, + end_date: None, + frequency: None, + interval_amount: None, + interval_frequency: None, + start_date: None, + time_zone: None, + workdays_only: None, + } + } +} + diff --git a/openapi/src/models/report_settings.rs b/openapi/src/models/report_settings.rs new file mode 100755 index 00000000..ba0b876e --- /dev/null +++ b/openapi/src/models/report_settings.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportSettings { + #[serde(rename = "branding", skip_serializing_if = "Option::is_none")] + pub branding: Option>, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl ReportSettings { + pub fn new() -> ReportSettings { + ReportSettings { + branding: None, + id: None, + org_id: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/report_time_range.rs b/openapi/src/models/report_time_range.rs new file mode 100755 index 00000000..886d683b --- /dev/null +++ b/openapi/src/models/report_time_range.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ReportTimeRange { + #[serde(rename = "from", skip_serializing_if = "Option::is_none")] + pub from: Option, + #[serde(rename = "to", skip_serializing_if = "Option::is_none")] + pub to: Option, +} + +impl ReportTimeRange { + pub fn new() -> ReportTimeRange { + ReportTimeRange { + from: None, + to: None, + } + } +} + diff --git a/openapi/src/models/resource_permission_dto.rs b/openapi/src/models/resource_permission_dto.rs new file mode 100755 index 00000000..85b6cd23 --- /dev/null +++ b/openapi/src/models/resource_permission_dto.rs @@ -0,0 +1,65 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ResourcePermissionDto { + #[serde(rename = "actions", skip_serializing_if = "Option::is_none")] + pub actions: Option>, + #[serde(rename = "builtInRole", skip_serializing_if = "Option::is_none")] + pub built_in_role: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isInherited", skip_serializing_if = "Option::is_none")] + pub is_inherited: Option, + #[serde(rename = "isManaged", skip_serializing_if = "Option::is_none")] + pub is_managed: Option, + #[serde(rename = "isServiceAccount", skip_serializing_if = "Option::is_none")] + pub is_service_account: Option, + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, + #[serde(rename = "roleName", skip_serializing_if = "Option::is_none")] + pub role_name: Option, + #[serde(rename = "team", skip_serializing_if = "Option::is_none")] + pub team: Option, + #[serde(rename = "teamAvatarUrl", skip_serializing_if = "Option::is_none")] + pub team_avatar_url: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, + #[serde(rename = "userAvatarUrl", skip_serializing_if = "Option::is_none")] + pub user_avatar_url: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, + #[serde(rename = "userLogin", skip_serializing_if = "Option::is_none")] + pub user_login: Option, +} + +impl ResourcePermissionDto { + pub fn new() -> ResourcePermissionDto { + ResourcePermissionDto { + actions: None, + built_in_role: None, + id: None, + is_inherited: None, + is_managed: None, + is_service_account: None, + permission: None, + role_name: None, + team: None, + team_avatar_url: None, + team_id: None, + user_avatar_url: None, + user_id: None, + user_login: None, + } + } +} + diff --git a/openapi/src/models/response_details.rs b/openapi/src/models/response_details.rs new file mode 100755 index 00000000..39d707f5 --- /dev/null +++ b/openapi/src/models/response_details.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ResponseDetails { + #[serde(rename = "msg", skip_serializing_if = "Option::is_none")] + pub msg: Option, +} + +impl ResponseDetails { + pub fn new() -> ResponseDetails { + ResponseDetails { + msg: None, + } + } +} + diff --git a/openapi/src/models/restore_dashboard_version_command.rs b/openapi/src/models/restore_dashboard_version_command.rs new file mode 100755 index 00000000..467d3b2d --- /dev/null +++ b/openapi/src/models/restore_dashboard_version_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RestoreDashboardVersionCommand { + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl RestoreDashboardVersionCommand { + pub fn new() -> RestoreDashboardVersionCommand { + RestoreDashboardVersionCommand { + version: None, + } + } +} + diff --git a/openapi/src/models/retrieve_jwks_200_response.rs b/openapi/src/models/retrieve_jwks_200_response.rs new file mode 100755 index 00000000..68ab85e9 --- /dev/null +++ b/openapi/src/models/retrieve_jwks_200_response.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RetrieveJwks200Response { + #[serde(rename = "keys", skip_serializing_if = "Option::is_none")] + pub keys: Option>, +} + +impl RetrieveJwks200Response { + pub fn new() -> RetrieveJwks200Response { + RetrieveJwks200Response { + keys: None, + } + } +} + diff --git a/openapi/src/models/revoke_auth_token_cmd.rs b/openapi/src/models/revoke_auth_token_cmd.rs new file mode 100755 index 00000000..09979c43 --- /dev/null +++ b/openapi/src/models/revoke_auth_token_cmd.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RevokeAuthTokenCmd { + #[serde(rename = "authTokenId", skip_serializing_if = "Option::is_none")] + pub auth_token_id: Option, +} + +impl RevokeAuthTokenCmd { + pub fn new() -> RevokeAuthTokenCmd { + RevokeAuthTokenCmd { + auth_token_id: None, + } + } +} + diff --git a/openapi/src/models/role_assignments_dto.rs b/openapi/src/models/role_assignments_dto.rs new file mode 100755 index 00000000..04a24fd9 --- /dev/null +++ b/openapi/src/models/role_assignments_dto.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RoleAssignmentsDto { + #[serde(rename = "role_uid", skip_serializing_if = "Option::is_none")] + pub role_uid: Option, + #[serde(rename = "service_accounts", skip_serializing_if = "Option::is_none")] + pub service_accounts: Option>, + #[serde(rename = "teams", skip_serializing_if = "Option::is_none")] + pub teams: Option>, + #[serde(rename = "users", skip_serializing_if = "Option::is_none")] + pub users: Option>, +} + +impl RoleAssignmentsDto { + pub fn new() -> RoleAssignmentsDto { + RoleAssignmentsDto { + role_uid: None, + service_accounts: None, + teams: None, + users: None, + } + } +} + diff --git a/openapi/src/models/role_dto.rs b/openapi/src/models/role_dto.rs new file mode 100755 index 00000000..b1b25d18 --- /dev/null +++ b/openapi/src/models/role_dto.rs @@ -0,0 +1,59 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RoleDto { + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "delegatable", skip_serializing_if = "Option::is_none")] + pub delegatable: Option, + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "displayName", skip_serializing_if = "Option::is_none")] + pub display_name: Option, + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option, + #[serde(rename = "group", skip_serializing_if = "Option::is_none")] + pub group: Option, + #[serde(rename = "hidden", skip_serializing_if = "Option::is_none")] + pub hidden: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "permissions", skip_serializing_if = "Option::is_none")] + pub permissions: Option>, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl RoleDto { + pub fn new() -> RoleDto { + RoleDto { + created: None, + delegatable: None, + description: None, + display_name: None, + global: None, + group: None, + hidden: None, + name: None, + permissions: None, + uid: None, + updated: None, + version: None, + } + } +} + diff --git a/openapi/src/models/roles_search_query.rs b/openapi/src/models/roles_search_query.rs new file mode 100755 index 00000000..cdb72b3b --- /dev/null +++ b/openapi/src/models/roles_search_query.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RolesSearchQuery { + #[serde(rename = "includeHidden", skip_serializing_if = "Option::is_none")] + pub include_hidden: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "teamIds", skip_serializing_if = "Option::is_none")] + pub team_ids: Option>, + #[serde(rename = "userIds", skip_serializing_if = "Option::is_none")] + pub user_ids: Option>, +} + +impl RolesSearchQuery { + pub fn new() -> RolesSearchQuery { + RolesSearchQuery { + include_hidden: None, + org_id: None, + team_ids: None, + user_ids: None, + } + } +} + diff --git a/openapi/src/models/route.rs b/openapi/src/models/route.rs new file mode 100755 index 00000000..3b81ef09 --- /dev/null +++ b/openapi/src/models/route.rs @@ -0,0 +1,66 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Route : A Route is a node that contains definitions of how to handle alerts. This is modified from the upstream alertmanager in that it adds the ObjectMatchers property. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Route { + #[serde(rename = "continue", skip_serializing_if = "Option::is_none")] + pub r#continue: Option, + #[serde(rename = "group_by", skip_serializing_if = "Option::is_none")] + pub group_by: Option>, + #[serde(rename = "group_interval", skip_serializing_if = "Option::is_none")] + pub group_interval: Option, + #[serde(rename = "group_wait", skip_serializing_if = "Option::is_none")] + pub group_wait: Option, + /// Deprecated. Remove before v1.0 release. + #[serde(rename = "match", skip_serializing_if = "Option::is_none")] + pub r#match: Option>, + #[serde(rename = "match_re", skip_serializing_if = "Option::is_none")] + pub match_re: Option>, + /// Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. + #[serde(rename = "matchers", skip_serializing_if = "Option::is_none")] + pub matchers: Option>, + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + #[serde(rename = "object_matchers", skip_serializing_if = "Option::is_none")] + pub object_matchers: Option>>, + #[serde(rename = "provenance", skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(rename = "receiver", skip_serializing_if = "Option::is_none")] + pub receiver: Option, + #[serde(rename = "repeat_interval", skip_serializing_if = "Option::is_none")] + pub repeat_interval: Option, + #[serde(rename = "routes", skip_serializing_if = "Option::is_none")] + pub routes: Option>, +} + +impl Route { + /// A Route is a node that contains definitions of how to handle alerts. This is modified from the upstream alertmanager in that it adds the ObjectMatchers property. + pub fn new() -> Route { + Route { + r#continue: None, + group_by: None, + group_interval: None, + group_wait: None, + r#match: None, + match_re: None, + matchers: None, + mute_time_intervals: None, + object_matchers: None, + provenance: None, + receiver: None, + repeat_interval: None, + routes: None, + } + } +} + diff --git a/openapi/src/models/route_export.rs b/openapi/src/models/route_export.rs new file mode 100755 index 00000000..b887864a --- /dev/null +++ b/openapi/src/models/route_export.rs @@ -0,0 +1,63 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// RouteExport : RouteExport is the provisioned file export of definitions.Route. This is needed to hide fields that aren't useable in provisioning file format. An alternative would be to define a custom MarshalJSON and MarshalYAML that excludes them. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RouteExport { + #[serde(rename = "continue", skip_serializing_if = "Option::is_none")] + pub r#continue: Option, + #[serde(rename = "group_by", skip_serializing_if = "Option::is_none")] + pub group_by: Option>, + #[serde(rename = "group_interval", skip_serializing_if = "Option::is_none")] + pub group_interval: Option, + #[serde(rename = "group_wait", skip_serializing_if = "Option::is_none")] + pub group_wait: Option, + /// Deprecated. Remove before v1.0 release. + #[serde(rename = "match", skip_serializing_if = "Option::is_none")] + pub r#match: Option>, + #[serde(rename = "match_re", skip_serializing_if = "Option::is_none")] + pub match_re: Option>, + /// Matchers is a slice of Matchers that is sortable, implements Stringer, and provides a Matches method to match a LabelSet against all Matchers in the slice. Note that some users of Matchers might require it to be sorted. + #[serde(rename = "matchers", skip_serializing_if = "Option::is_none")] + pub matchers: Option>, + #[serde(rename = "mute_time_intervals", skip_serializing_if = "Option::is_none")] + pub mute_time_intervals: Option>, + #[serde(rename = "object_matchers", skip_serializing_if = "Option::is_none")] + pub object_matchers: Option>>, + #[serde(rename = "receiver", skip_serializing_if = "Option::is_none")] + pub receiver: Option, + #[serde(rename = "repeat_interval", skip_serializing_if = "Option::is_none")] + pub repeat_interval: Option, + #[serde(rename = "routes", skip_serializing_if = "Option::is_none")] + pub routes: Option>, +} + +impl RouteExport { + /// RouteExport is the provisioned file export of definitions.Route. This is needed to hide fields that aren't useable in provisioning file format. An alternative would be to define a custom MarshalJSON and MarshalYAML that excludes them. + pub fn new() -> RouteExport { + RouteExport { + r#continue: None, + group_by: None, + group_interval: None, + group_wait: None, + r#match: None, + match_re: None, + matchers: None, + mute_time_intervals: None, + object_matchers: None, + receiver: None, + repeat_interval: None, + routes: None, + } + } +} + diff --git a/openapi/src/models/rule.rs b/openapi/src/models/rule.rs new file mode 100755 index 00000000..98b87a13 --- /dev/null +++ b/openapi/src/models/rule.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Rule : adapted from cortex +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Rule { + #[serde(rename = "evaluationTime", skip_serializing_if = "Option::is_none")] + pub evaluation_time: Option, + #[serde(rename = "health")] + pub health: String, + /// The custom marshaling for labels.Labels ends up doing this anyways. + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "lastError", skip_serializing_if = "Option::is_none")] + pub last_error: Option, + #[serde(rename = "lastEvaluation", skip_serializing_if = "Option::is_none")] + pub last_evaluation: Option, + #[serde(rename = "name")] + pub name: String, + #[serde(rename = "query")] + pub query: String, + #[serde(rename = "type")] + pub r#type: String, +} + +impl Rule { + /// adapted from cortex + pub fn new(health: String, name: String, query: String, r#type: String) -> Rule { + Rule { + evaluation_time: None, + health, + labels: None, + last_error: None, + last_evaluation: None, + name, + query, + r#type, + } + } +} + diff --git a/openapi/src/models/rule_discovery.rs b/openapi/src/models/rule_discovery.rs new file mode 100755 index 00000000..4595c32e --- /dev/null +++ b/openapi/src/models/rule_discovery.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RuleDiscovery { + #[serde(rename = "groups")] + pub groups: Vec, + #[serde(rename = "totals", skip_serializing_if = "Option::is_none")] + pub totals: Option>, +} + +impl RuleDiscovery { + pub fn new(groups: Vec) -> RuleDiscovery { + RuleDiscovery { + groups, + totals: None, + } + } +} + diff --git a/openapi/src/models/rule_group.rs b/openapi/src/models/rule_group.rs new file mode 100755 index 00000000..84b315f7 --- /dev/null +++ b/openapi/src/models/rule_group.rs @@ -0,0 +1,45 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RuleGroup { + #[serde(rename = "evaluationTime", skip_serializing_if = "Option::is_none")] + pub evaluation_time: Option, + #[serde(rename = "file")] + pub file: String, + #[serde(rename = "interval")] + pub interval: f64, + #[serde(rename = "lastEvaluation", skip_serializing_if = "Option::is_none")] + pub last_evaluation: Option, + #[serde(rename = "name")] + pub name: String, + /// In order to preserve rule ordering, while exposing type (alerting or recording) specific properties, both alerting and recording rules are exposed in the same array. + #[serde(rename = "rules")] + pub rules: Vec, + #[serde(rename = "totals", skip_serializing_if = "Option::is_none")] + pub totals: Option>, +} + +impl RuleGroup { + pub fn new(file: String, interval: f64, name: String, rules: Vec) -> RuleGroup { + RuleGroup { + evaluation_time: None, + file, + interval, + last_evaluation: None, + name, + rules, + totals: None, + } + } +} + diff --git a/openapi/src/models/rule_group_config_response.rs b/openapi/src/models/rule_group_config_response.rs new file mode 100755 index 00000000..2987bc7d --- /dev/null +++ b/openapi/src/models/rule_group_config_response.rs @@ -0,0 +1,36 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RuleGroupConfigResponse { + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "rules", skip_serializing_if = "Option::is_none")] + pub rules: Option>, + #[serde(rename = "source_tenants", skip_serializing_if = "Option::is_none")] + pub source_tenants: Option>, +} + +impl RuleGroupConfigResponse { + pub fn new() -> RuleGroupConfigResponse { + RuleGroupConfigResponse { + interval: None, + name: None, + rules: None, + source_tenants: None, + } + } +} + diff --git a/openapi/src/models/rule_response.rs b/openapi/src/models/rule_response.rs new file mode 100755 index 00000000..f51658cb --- /dev/null +++ b/openapi/src/models/rule_response.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct RuleResponse { + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option>, + #[serde(rename = "error", skip_serializing_if = "Option::is_none")] + pub error: Option, + #[serde(rename = "errorType", skip_serializing_if = "Option::is_none")] + pub error_type: Option, + #[serde(rename = "status")] + pub status: String, +} + +impl RuleResponse { + pub fn new(status: String) -> RuleResponse { + RuleResponse { + data: None, + error: None, + error_type: None, + status, + } + } +} + diff --git a/openapi/src/models/sample.rs b/openapi/src/models/sample.rs new file mode 100755 index 00000000..3f4c6372 --- /dev/null +++ b/openapi/src/models/sample.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Sample : Sample is a single sample belonging to a metric. It represents either a float sample or a histogram sample. If H is nil, it is a float sample. Otherwise, it is a histogram sample. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Sample { + #[serde(rename = "F", skip_serializing_if = "Option::is_none")] + pub f: Option, + #[serde(rename = "H", skip_serializing_if = "Option::is_none")] + pub h: Option>, + /// Labels is a sorted set of labels. Order has to be guaranteed upon instantiation. + #[serde(rename = "Metric", skip_serializing_if = "Option::is_none")] + pub metric: Option>, + #[serde(rename = "T", skip_serializing_if = "Option::is_none")] + pub t: Option, +} + +impl Sample { + /// Sample is a single sample belonging to a metric. It represents either a float sample or a histogram sample. If H is nil, it is a float sample. Otherwise, it is a histogram sample. + pub fn new() -> Sample { + Sample { + f: None, + h: None, + metric: None, + t: None, + } + } +} + diff --git a/openapi/src/models/save_dashboard_command.rs b/openapi/src/models/save_dashboard_command.rs new file mode 100755 index 00000000..e362ba22 --- /dev/null +++ b/openapi/src/models/save_dashboard_command.rs @@ -0,0 +1,48 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SaveDashboardCommand { + #[serde(rename = "UpdatedAt", skip_serializing_if = "Option::is_none")] + pub updated_at: Option, + #[serde(rename = "dashboard", skip_serializing_if = "Option::is_none")] + pub dashboard: Option, + /// Deprecated: use FolderUID instead + #[serde(rename = "folderId", skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + #[serde(rename = "folderUid", skip_serializing_if = "Option::is_none")] + pub folder_uid: Option, + #[serde(rename = "isFolder", skip_serializing_if = "Option::is_none")] + pub is_folder: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "overwrite", skip_serializing_if = "Option::is_none")] + pub overwrite: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl SaveDashboardCommand { + pub fn new() -> SaveDashboardCommand { + SaveDashboardCommand { + updated_at: None, + dashboard: None, + folder_id: None, + folder_uid: None, + is_folder: None, + message: None, + overwrite: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/search_device_query_result.rs b/openapi/src/models/search_device_query_result.rs new file mode 100755 index 00000000..4b0867cc --- /dev/null +++ b/openapi/src/models/search_device_query_result.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchDeviceQueryResult { + #[serde(rename = "devices", skip_serializing_if = "Option::is_none")] + pub devices: Option>, + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, +} + +impl SearchDeviceQueryResult { + pub fn new() -> SearchDeviceQueryResult { + SearchDeviceQueryResult { + devices: None, + page: None, + per_page: None, + total_count: None, + } + } +} + diff --git a/openapi/src/models/search_org_service_accounts_result.rs b/openapi/src/models/search_org_service_accounts_result.rs new file mode 100755 index 00000000..17ba8c05 --- /dev/null +++ b/openapi/src/models/search_org_service_accounts_result.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// SearchOrgServiceAccountsResult : swagger: model +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchOrgServiceAccountsResult { + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "serviceAccounts", skip_serializing_if = "Option::is_none")] + pub service_accounts: Option>, + /// It can be used for pagination of the user list E.g. if totalCount is equal to 100 users and the perpage parameter is set to 10 then there are 10 pages of users. + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, +} + +impl SearchOrgServiceAccountsResult { + /// swagger: model + pub fn new() -> SearchOrgServiceAccountsResult { + SearchOrgServiceAccountsResult { + page: None, + per_page: None, + service_accounts: None, + total_count: None, + } + } +} + diff --git a/openapi/src/models/search_org_users_query_result.rs b/openapi/src/models/search_org_users_query_result.rs new file mode 100755 index 00000000..ebf3edd8 --- /dev/null +++ b/openapi/src/models/search_org_users_query_result.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchOrgUsersQueryResult { + #[serde(rename = "orgUsers", skip_serializing_if = "Option::is_none")] + pub org_users: Option>, + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, +} + +impl SearchOrgUsersQueryResult { + pub fn new() -> SearchOrgUsersQueryResult { + SearchOrgUsersQueryResult { + org_users: None, + page: None, + per_page: None, + total_count: None, + } + } +} + diff --git a/openapi/src/models/search_result.rs b/openapi/src/models/search_result.rs new file mode 100755 index 00000000..e924d44e --- /dev/null +++ b/openapi/src/models/search_result.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchResult { + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl SearchResult { + pub fn new() -> SearchResult { + SearchResult { + result: None, + } + } +} + diff --git a/openapi/src/models/search_result_item.rs b/openapi/src/models/search_result_item.rs new file mode 100755 index 00000000..b193905d --- /dev/null +++ b/openapi/src/models/search_result_item.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchResultItem { + #[serde(rename = "action", skip_serializing_if = "Option::is_none")] + pub action: Option, + #[serde(rename = "basicRole", skip_serializing_if = "Option::is_none")] + pub basic_role: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "roleName", skip_serializing_if = "Option::is_none")] + pub role_name: Option, + #[serde(rename = "scope", skip_serializing_if = "Option::is_none")] + pub scope: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl SearchResultItem { + pub fn new() -> SearchResultItem { + SearchResultItem { + action: None, + basic_role: None, + org_id: None, + role_name: None, + scope: None, + team_id: None, + user_id: None, + version: None, + } + } +} + diff --git a/openapi/src/models/search_team_query_result.rs b/openapi/src/models/search_team_query_result.rs new file mode 100755 index 00000000..4c6b1b1e --- /dev/null +++ b/openapi/src/models/search_team_query_result.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchTeamQueryResult { + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "teams", skip_serializing_if = "Option::is_none")] + pub teams: Option>, + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, +} + +impl SearchTeamQueryResult { + pub fn new() -> SearchTeamQueryResult { + SearchTeamQueryResult { + page: None, + per_page: None, + teams: None, + total_count: None, + } + } +} + diff --git a/openapi/src/models/search_user_query_result.rs b/openapi/src/models/search_user_query_result.rs new file mode 100755 index 00000000..0ae52c47 --- /dev/null +++ b/openapi/src/models/search_user_query_result.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SearchUserQueryResult { + #[serde(rename = "page", skip_serializing_if = "Option::is_none")] + pub page: Option, + #[serde(rename = "perPage", skip_serializing_if = "Option::is_none")] + pub per_page: Option, + #[serde(rename = "totalCount", skip_serializing_if = "Option::is_none")] + pub total_count: Option, + #[serde(rename = "users", skip_serializing_if = "Option::is_none")] + pub users: Option>, +} + +impl SearchUserQueryResult { + pub fn new() -> SearchUserQueryResult { + SearchUserQueryResult { + page: None, + per_page: None, + total_count: None, + users: None, + } + } +} + diff --git a/openapi/src/models/service_account_dto.rs b/openapi/src/models/service_account_dto.rs new file mode 100755 index 00000000..6771c8e0 --- /dev/null +++ b/openapi/src/models/service_account_dto.rs @@ -0,0 +1,55 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// ServiceAccountDto : swagger: model +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ServiceAccountDto { + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isDisabled", skip_serializing_if = "Option::is_none")] + pub is_disabled: Option, + #[serde(rename = "isExternal", skip_serializing_if = "Option::is_none")] + pub is_external: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "tokens", skip_serializing_if = "Option::is_none")] + pub tokens: Option, +} + +impl ServiceAccountDto { + /// swagger: model + pub fn new() -> ServiceAccountDto { + ServiceAccountDto { + access_control: None, + avatar_url: None, + id: None, + is_disabled: None, + is_external: None, + login: None, + name: None, + org_id: None, + role: None, + tokens: None, + } + } +} + diff --git a/openapi/src/models/service_account_profile_dto.rs b/openapi/src/models/service_account_profile_dto.rs new file mode 100755 index 00000000..209328d8 --- /dev/null +++ b/openapi/src/models/service_account_profile_dto.rs @@ -0,0 +1,65 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ServiceAccountProfileDto { + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isDisabled", skip_serializing_if = "Option::is_none")] + pub is_disabled: Option, + #[serde(rename = "isExternal", skip_serializing_if = "Option::is_none")] + pub is_external: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "requiredBy", skip_serializing_if = "Option::is_none")] + pub required_by: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "teams", skip_serializing_if = "Option::is_none")] + pub teams: Option>, + #[serde(rename = "tokens", skip_serializing_if = "Option::is_none")] + pub tokens: Option, + #[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")] + pub updated_at: Option, +} + +impl ServiceAccountProfileDto { + pub fn new() -> ServiceAccountProfileDto { + ServiceAccountProfileDto { + access_control: None, + avatar_url: None, + created_at: None, + id: None, + is_disabled: None, + is_external: None, + login: None, + name: None, + org_id: None, + required_by: None, + role: None, + teams: None, + tokens: None, + updated_at: None, + } + } +} + diff --git a/openapi/src/models/set_permission_command.rs b/openapi/src/models/set_permission_command.rs new file mode 100755 index 00000000..649399d2 --- /dev/null +++ b/openapi/src/models/set_permission_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SetPermissionCommand { + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, +} + +impl SetPermissionCommand { + pub fn new() -> SetPermissionCommand { + SetPermissionCommand { + permission: None, + } + } +} + diff --git a/openapi/src/models/set_permissions_command.rs b/openapi/src/models/set_permissions_command.rs new file mode 100755 index 00000000..10dcacbd --- /dev/null +++ b/openapi/src/models/set_permissions_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SetPermissionsCommand { + #[serde(rename = "permissions", skip_serializing_if = "Option::is_none")] + pub permissions: Option>, +} + +impl SetPermissionsCommand { + pub fn new() -> SetPermissionsCommand { + SetPermissionsCommand { + permissions: None, + } + } +} + diff --git a/openapi/src/models/set_resource_permission_command.rs b/openapi/src/models/set_resource_permission_command.rs new file mode 100755 index 00000000..7c2bb14e --- /dev/null +++ b/openapi/src/models/set_resource_permission_command.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SetResourcePermissionCommand { + #[serde(rename = "builtInRole", skip_serializing_if = "Option::is_none")] + pub built_in_role: Option, + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl SetResourcePermissionCommand { + pub fn new() -> SetResourcePermissionCommand { + SetResourcePermissionCommand { + built_in_role: None, + permission: None, + team_id: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/set_role_assignments_command.rs b/openapi/src/models/set_role_assignments_command.rs new file mode 100755 index 00000000..e599d98d --- /dev/null +++ b/openapi/src/models/set_role_assignments_command.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SetRoleAssignmentsCommand { + #[serde(rename = "service_accounts", skip_serializing_if = "Option::is_none")] + pub service_accounts: Option>, + #[serde(rename = "teams", skip_serializing_if = "Option::is_none")] + pub teams: Option>, + #[serde(rename = "users", skip_serializing_if = "Option::is_none")] + pub users: Option>, +} + +impl SetRoleAssignmentsCommand { + pub fn new() -> SetRoleAssignmentsCommand { + SetRoleAssignmentsCommand { + service_accounts: None, + teams: None, + users: None, + } + } +} + diff --git a/openapi/src/models/set_user_roles_command.rs b/openapi/src/models/set_user_roles_command.rs new file mode 100755 index 00000000..39bb1715 --- /dev/null +++ b/openapi/src/models/set_user_roles_command.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SetUserRolesCommand { + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option, + #[serde(rename = "includeHidden", skip_serializing_if = "Option::is_none")] + pub include_hidden: Option, + #[serde(rename = "roleUids", skip_serializing_if = "Option::is_none")] + pub role_uids: Option>, +} + +impl SetUserRolesCommand { + pub fn new() -> SetUserRolesCommand { + SetUserRolesCommand { + global: None, + include_hidden: None, + role_uids: None, + } + } +} + diff --git a/openapi/src/models/sig_v4_config.rs b/openapi/src/models/sig_v4_config.rs new file mode 100755 index 00000000..683ebdf9 --- /dev/null +++ b/openapi/src/models/sig_v4_config.rs @@ -0,0 +1,40 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// SigV4Config : SigV4Config is the configuration for signing remote write requests with AWS's SigV4 verification process. Empty values will be retrieved using the AWS default credentials chain. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SigV4Config { + #[serde(rename = "AccessKey", skip_serializing_if = "Option::is_none")] + pub access_key: Option, + #[serde(rename = "Profile", skip_serializing_if = "Option::is_none")] + pub profile: Option, + #[serde(rename = "Region", skip_serializing_if = "Option::is_none")] + pub region: Option, + #[serde(rename = "RoleARN", skip_serializing_if = "Option::is_none")] + pub role_arn: Option, + #[serde(rename = "SecretKey", skip_serializing_if = "Option::is_none")] + pub secret_key: Option, +} + +impl SigV4Config { + /// SigV4Config is the configuration for signing remote write requests with AWS's SigV4 verification process. Empty values will be retrieved using the AWS default credentials chain. + pub fn new() -> SigV4Config { + SigV4Config { + access_key: None, + profile: None, + region: None, + role_arn: None, + secret_key: None, + } + } +} + diff --git a/openapi/src/models/silence.rs b/openapi/src/models/silence.rs new file mode 100755 index 00000000..cb733ef0 --- /dev/null +++ b/openapi/src/models/silence.rs @@ -0,0 +1,45 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Silence : Silence silence +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Silence { + /// comment + #[serde(rename = "comment")] + pub comment: String, + /// created by + #[serde(rename = "createdBy")] + pub created_by: String, + /// ends at + #[serde(rename = "endsAt")] + pub ends_at: String, + /// Matchers matchers + #[serde(rename = "matchers")] + pub matchers: Vec, + /// starts at + #[serde(rename = "startsAt")] + pub starts_at: String, +} + +impl Silence { + /// Silence silence + pub fn new(comment: String, created_by: String, ends_at: String, matchers: Vec, starts_at: String) -> Silence { + Silence { + comment, + created_by, + ends_at, + matchers, + starts_at, + } + } +} + diff --git a/openapi/src/models/silence_status.rs b/openapi/src/models/silence_status.rs new file mode 100755 index 00000000..a20e140d --- /dev/null +++ b/openapi/src/models/silence_status.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// SilenceStatus : SilenceStatus silence status +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SilenceStatus { + /// state + #[serde(rename = "state")] + pub state: State, +} + +impl SilenceStatus { + /// SilenceStatus silence status + pub fn new(state: State) -> SilenceStatus { + SilenceStatus { + state, + } + } +} +/// state +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum State { + #[serde(rename = "[expired active pending]")] + LeftSquareBracketExpiredActivePendingRightSquareBracket, +} + +impl Default for State { + fn default() -> State { + Self::LeftSquareBracketExpiredActivePendingRightSquareBracket + } +} + diff --git a/openapi/src/models/slack_action.rs b/openapi/src/models/slack_action.rs new file mode 100755 index 00000000..a958362e --- /dev/null +++ b/openapi/src/models/slack_action.rs @@ -0,0 +1,46 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// SlackAction : See https://api.slack.com/docs/message-attachments#action_fields and https://api.slack.com/docs/message-buttons for more information. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SlackAction { + #[serde(rename = "confirm", skip_serializing_if = "Option::is_none")] + pub confirm: Option>, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "style", skip_serializing_if = "Option::is_none")] + pub style: Option, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "value", skip_serializing_if = "Option::is_none")] + pub value: Option, +} + +impl SlackAction { + /// See https://api.slack.com/docs/message-attachments#action_fields and https://api.slack.com/docs/message-buttons for more information. + pub fn new() -> SlackAction { + SlackAction { + confirm: None, + name: None, + style: None, + text: None, + r#type: None, + url: None, + value: None, + } + } +} + diff --git a/openapi/src/models/slack_config.rs b/openapi/src/models/slack_config.rs new file mode 100755 index 00000000..72126c08 --- /dev/null +++ b/openapi/src/models/slack_config.rs @@ -0,0 +1,93 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SlackConfig { + #[serde(rename = "actions", skip_serializing_if = "Option::is_none")] + pub actions: Option>, + #[serde(rename = "api_url", skip_serializing_if = "Option::is_none")] + pub api_url: Option>, + #[serde(rename = "api_url_file", skip_serializing_if = "Option::is_none")] + pub api_url_file: Option, + #[serde(rename = "callback_id", skip_serializing_if = "Option::is_none")] + pub callback_id: Option, + /// Slack channel override, (like #other-channel or @username). + #[serde(rename = "channel", skip_serializing_if = "Option::is_none")] + pub channel: Option, + #[serde(rename = "color", skip_serializing_if = "Option::is_none")] + pub color: Option, + #[serde(rename = "fallback", skip_serializing_if = "Option::is_none")] + pub fallback: Option, + #[serde(rename = "fields", skip_serializing_if = "Option::is_none")] + pub fields: Option>, + #[serde(rename = "footer", skip_serializing_if = "Option::is_none")] + pub footer: Option, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "icon_emoji", skip_serializing_if = "Option::is_none")] + pub icon_emoji: Option, + #[serde(rename = "icon_url", skip_serializing_if = "Option::is_none")] + pub icon_url: Option, + #[serde(rename = "image_url", skip_serializing_if = "Option::is_none")] + pub image_url: Option, + #[serde(rename = "link_names", skip_serializing_if = "Option::is_none")] + pub link_names: Option, + #[serde(rename = "mrkdwn_in", skip_serializing_if = "Option::is_none")] + pub mrkdwn_in: Option>, + #[serde(rename = "pretext", skip_serializing_if = "Option::is_none")] + pub pretext: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "short_fields", skip_serializing_if = "Option::is_none")] + pub short_fields: Option, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "thumb_url", skip_serializing_if = "Option::is_none")] + pub thumb_url: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "title_link", skip_serializing_if = "Option::is_none")] + pub title_link: Option, + #[serde(rename = "username", skip_serializing_if = "Option::is_none")] + pub username: Option, +} + +impl SlackConfig { + pub fn new() -> SlackConfig { + SlackConfig { + actions: None, + api_url: None, + api_url_file: None, + callback_id: None, + channel: None, + color: None, + fallback: None, + fields: None, + footer: None, + http_config: None, + icon_emoji: None, + icon_url: None, + image_url: None, + link_names: None, + mrkdwn_in: None, + pretext: None, + send_resolved: None, + short_fields: None, + text: None, + thumb_url: None, + title: None, + title_link: None, + username: None, + } + } +} + diff --git a/openapi/src/models/slack_confirmation_field.rs b/openapi/src/models/slack_confirmation_field.rs new file mode 100755 index 00000000..f5289f14 --- /dev/null +++ b/openapi/src/models/slack_confirmation_field.rs @@ -0,0 +1,37 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// SlackConfirmationField : SlackConfirmationField protect users from destructive actions or particularly distinguished decisions by asking them to confirm their button click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields for more information. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SlackConfirmationField { + #[serde(rename = "dismiss_text", skip_serializing_if = "Option::is_none")] + pub dismiss_text: Option, + #[serde(rename = "ok_text", skip_serializing_if = "Option::is_none")] + pub ok_text: Option, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, +} + +impl SlackConfirmationField { + /// SlackConfirmationField protect users from destructive actions or particularly distinguished decisions by asking them to confirm their button click one more time. See https://api.slack.com/docs/interactive-message-field-guide#confirmation_fields for more information. + pub fn new() -> SlackConfirmationField { + SlackConfirmationField { + dismiss_text: None, + ok_text: None, + text: None, + title: None, + } + } +} + diff --git a/openapi/src/models/slack_field.rs b/openapi/src/models/slack_field.rs new file mode 100755 index 00000000..a5473b2d --- /dev/null +++ b/openapi/src/models/slack_field.rs @@ -0,0 +1,34 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// SlackField : Each field must contain a title, value, and optionally, a boolean value to indicate if the field is short enough to be displayed next to other fields designated as short. See https://api.slack.com/docs/message-attachments#fields for more information. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SlackField { + #[serde(rename = "short", skip_serializing_if = "Option::is_none")] + pub short: Option, + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(rename = "value", skip_serializing_if = "Option::is_none")] + pub value: Option, +} + +impl SlackField { + /// Each field must contain a title, value, and optionally, a boolean value to indicate if the field is short enough to be displayed next to other fields designated as short. See https://api.slack.com/docs/message-attachments#fields for more information. + pub fn new() -> SlackField { + SlackField { + short: None, + title: None, + value: None, + } + } +} + diff --git a/openapi/src/models/sns_config.rs b/openapi/src/models/sns_config.rs new file mode 100755 index 00000000..c344cb4e --- /dev/null +++ b/openapi/src/models/sns_config.rs @@ -0,0 +1,53 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SnsConfig { + #[serde(rename = "api_url", skip_serializing_if = "Option::is_none")] + pub api_url: Option, + #[serde(rename = "attributes", skip_serializing_if = "Option::is_none")] + pub attributes: Option>, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "phone_number", skip_serializing_if = "Option::is_none")] + pub phone_number: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "sigv4", skip_serializing_if = "Option::is_none")] + pub sigv4: Option>, + #[serde(rename = "subject", skip_serializing_if = "Option::is_none")] + pub subject: Option, + #[serde(rename = "target_arn", skip_serializing_if = "Option::is_none")] + pub target_arn: Option, + #[serde(rename = "topic_arn", skip_serializing_if = "Option::is_none")] + pub topic_arn: Option, +} + +impl SnsConfig { + pub fn new() -> SnsConfig { + SnsConfig { + api_url: None, + attributes: None, + http_config: None, + message: None, + phone_number: None, + send_resolved: None, + sigv4: None, + subject: None, + target_arn: None, + topic_arn: None, + } + } +} + diff --git a/openapi/src/models/span.rs b/openapi/src/models/span.rs new file mode 100755 index 00000000..60525fab --- /dev/null +++ b/openapi/src/models/span.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Span { + /// Length of the span. + #[serde(rename = "Length", skip_serializing_if = "Option::is_none")] + pub length: Option, + /// Gap to previous span (always positive), or starting index for the 1st span (which can be negative). + #[serde(rename = "Offset", skip_serializing_if = "Option::is_none")] + pub offset: Option, +} + +impl Span { + pub fn new() -> Span { + Span { + length: None, + offset: None, + } + } +} + diff --git a/openapi/src/models/success_response_body.rs b/openapi/src/models/success_response_body.rs new file mode 100755 index 00000000..f55d6837 --- /dev/null +++ b/openapi/src/models/success_response_body.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SuccessResponseBody { + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, +} + +impl SuccessResponseBody { + pub fn new() -> SuccessResponseBody { + SuccessResponseBody { + message: None, + } + } +} + diff --git a/openapi/src/models/sync_result.rs b/openapi/src/models/sync_result.rs new file mode 100755 index 00000000..9b2ed607 --- /dev/null +++ b/openapi/src/models/sync_result.rs @@ -0,0 +1,39 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct SyncResult { + /// A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. + #[serde(rename = "Elapsed", skip_serializing_if = "Option::is_none")] + pub elapsed: Option, + #[serde(rename = "FailedUsers", skip_serializing_if = "Option::is_none")] + pub failed_users: Option>, + #[serde(rename = "MissingUserIds", skip_serializing_if = "Option::is_none")] + pub missing_user_ids: Option>, + #[serde(rename = "Started", skip_serializing_if = "Option::is_none")] + pub started: Option, + #[serde(rename = "UpdatedUserIds", skip_serializing_if = "Option::is_none")] + pub updated_user_ids: Option>, +} + +impl SyncResult { + pub fn new() -> SyncResult { + SyncResult { + elapsed: None, + failed_users: None, + missing_user_ids: None, + started: None, + updated_user_ids: None, + } + } +} + diff --git a/openapi/src/models/tags_dto.rs b/openapi/src/models/tags_dto.rs new file mode 100755 index 00000000..6b5c2468 --- /dev/null +++ b/openapi/src/models/tags_dto.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TagsDto { + #[serde(rename = "count", skip_serializing_if = "Option::is_none")] + pub count: Option, + #[serde(rename = "tag", skip_serializing_if = "Option::is_none")] + pub tag: Option, +} + +impl TagsDto { + pub fn new() -> TagsDto { + TagsDto { + count: None, + tag: None, + } + } +} + diff --git a/openapi/src/models/team_dto.rs b/openapi/src/models/team_dto.rs new file mode 100755 index 00000000..a0e3e029 --- /dev/null +++ b/openapi/src/models/team_dto.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TeamDto { + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "memberCount", skip_serializing_if = "Option::is_none")] + pub member_count: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl TeamDto { + pub fn new() -> TeamDto { + TeamDto { + access_control: None, + avatar_url: None, + email: None, + id: None, + member_count: None, + name: None, + org_id: None, + permission: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/team_group_dto.rs b/openapi/src/models/team_group_dto.rs new file mode 100755 index 00000000..4edd67e8 --- /dev/null +++ b/openapi/src/models/team_group_dto.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TeamGroupDto { + #[serde(rename = "groupId", skip_serializing_if = "Option::is_none")] + pub group_id: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, +} + +impl TeamGroupDto { + pub fn new() -> TeamGroupDto { + TeamGroupDto { + group_id: None, + org_id: None, + team_id: None, + } + } +} + diff --git a/openapi/src/models/team_group_mapping.rs b/openapi/src/models/team_group_mapping.rs new file mode 100755 index 00000000..8e77858e --- /dev/null +++ b/openapi/src/models/team_group_mapping.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TeamGroupMapping { + #[serde(rename = "groupId", skip_serializing_if = "Option::is_none")] + pub group_id: Option, +} + +impl TeamGroupMapping { + pub fn new() -> TeamGroupMapping { + TeamGroupMapping { + group_id: None, + } + } +} + diff --git a/openapi/src/models/team_member_dto.rs b/openapi/src/models/team_member_dto.rs new file mode 100755 index 00000000..fc5a4d81 --- /dev/null +++ b/openapi/src/models/team_member_dto.rs @@ -0,0 +1,56 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TeamMemberDto { + #[serde(rename = "auth_module", skip_serializing_if = "Option::is_none")] + pub auth_module: Option, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, + #[serde(rename = "teamId", skip_serializing_if = "Option::is_none")] + pub team_id: Option, + #[serde(rename = "teamUID", skip_serializing_if = "Option::is_none")] + pub team_uid: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl TeamMemberDto { + pub fn new() -> TeamMemberDto { + TeamMemberDto { + auth_module: None, + avatar_url: None, + email: None, + labels: None, + login: None, + name: None, + org_id: None, + permission: None, + team_id: None, + team_uid: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/telegram_config.rs b/openapi/src/models/telegram_config.rs new file mode 100755 index 00000000..b2e164ec --- /dev/null +++ b/openapi/src/models/telegram_config.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TelegramConfig { + #[serde(rename = "api_url", skip_serializing_if = "Option::is_none")] + pub api_url: Option>, + #[serde(rename = "chat", skip_serializing_if = "Option::is_none")] + pub chat: Option, + #[serde(rename = "disable_notifications", skip_serializing_if = "Option::is_none")] + pub disable_notifications: Option, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "parse_mode", skip_serializing_if = "Option::is_none")] + pub parse_mode: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "token", skip_serializing_if = "Option::is_none")] + pub token: Option, + #[serde(rename = "token_file", skip_serializing_if = "Option::is_none")] + pub token_file: Option, +} + +impl TelegramConfig { + pub fn new() -> TelegramConfig { + TelegramConfig { + api_url: None, + chat: None, + disable_notifications: None, + http_config: None, + message: None, + parse_mode: None, + send_resolved: None, + token: None, + token_file: None, + } + } +} + diff --git a/openapi/src/models/temp_user_dto.rs b/openapi/src/models/temp_user_dto.rs new file mode 100755 index 00000000..8dced7c6 --- /dev/null +++ b/openapi/src/models/temp_user_dto.rs @@ -0,0 +1,83 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TempUserDto { + #[serde(rename = "code", skip_serializing_if = "Option::is_none")] + pub code: Option, + #[serde(rename = "createdOn", skip_serializing_if = "Option::is_none")] + pub created_on: Option, + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "emailSent", skip_serializing_if = "Option::is_none")] + pub email_sent: Option, + #[serde(rename = "emailSentOn", skip_serializing_if = "Option::is_none")] + pub email_sent_on: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "invitedByEmail", skip_serializing_if = "Option::is_none")] + pub invited_by_email: Option, + #[serde(rename = "invitedByLogin", skip_serializing_if = "Option::is_none")] + pub invited_by_login: Option, + #[serde(rename = "invitedByName", skip_serializing_if = "Option::is_none")] + pub invited_by_name: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "status", skip_serializing_if = "Option::is_none")] + pub status: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, +} + +impl TempUserDto { + pub fn new() -> TempUserDto { + TempUserDto { + code: None, + created_on: None, + email: None, + email_sent: None, + email_sent_on: None, + id: None, + invited_by_email: None, + invited_by_login: None, + invited_by_name: None, + name: None, + org_id: None, + role: None, + status: None, + url: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/test_receiver_config_result.rs b/openapi/src/models/test_receiver_config_result.rs new file mode 100755 index 00000000..79510133 --- /dev/null +++ b/openapi/src/models/test_receiver_config_result.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestReceiverConfigResult { + #[serde(rename = "error", skip_serializing_if = "Option::is_none")] + pub error: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "status", skip_serializing_if = "Option::is_none")] + pub status: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl TestReceiverConfigResult { + pub fn new() -> TestReceiverConfigResult { + TestReceiverConfigResult { + error: None, + name: None, + status: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/test_receiver_result.rs b/openapi/src/models/test_receiver_result.rs new file mode 100755 index 00000000..13502a46 --- /dev/null +++ b/openapi/src/models/test_receiver_result.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestReceiverResult { + #[serde(rename = "grafana_managed_receiver_configs", skip_serializing_if = "Option::is_none")] + pub grafana_managed_receiver_configs: Option>, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl TestReceiverResult { + pub fn new() -> TestReceiverResult { + TestReceiverResult { + grafana_managed_receiver_configs: None, + name: None, + } + } +} + diff --git a/openapi/src/models/test_receivers_config_alert_params.rs b/openapi/src/models/test_receivers_config_alert_params.rs new file mode 100755 index 00000000..6598d5df --- /dev/null +++ b/openapi/src/models/test_receivers_config_alert_params.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestReceiversConfigAlertParams { + /// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet may be fully-qualified down to the point where it may resolve to a single Metric in the data store or not. All operations that occur within the realm of a LabelSet can emit a vector of Metric entities to which the LabelSet may match. + #[serde(rename = "annotations", skip_serializing_if = "Option::is_none")] + pub annotations: Option>, + /// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet may be fully-qualified down to the point where it may resolve to a single Metric in the data store or not. All operations that occur within the realm of a LabelSet can emit a vector of Metric entities to which the LabelSet may match. + #[serde(rename = "labels", skip_serializing_if = "Option::is_none")] + pub labels: Option>, +} + +impl TestReceiversConfigAlertParams { + pub fn new() -> TestReceiversConfigAlertParams { + TestReceiversConfigAlertParams { + annotations: None, + labels: None, + } + } +} + diff --git a/openapi/src/models/test_receivers_config_body_params.rs b/openapi/src/models/test_receivers_config_body_params.rs new file mode 100755 index 00000000..9fe737f1 --- /dev/null +++ b/openapi/src/models/test_receivers_config_body_params.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestReceiversConfigBodyParams { + #[serde(rename = "alert", skip_serializing_if = "Option::is_none")] + pub alert: Option>, + #[serde(rename = "receivers", skip_serializing_if = "Option::is_none")] + pub receivers: Option>, +} + +impl TestReceiversConfigBodyParams { + pub fn new() -> TestReceiversConfigBodyParams { + TestReceiversConfigBodyParams { + alert: None, + receivers: None, + } + } +} + diff --git a/openapi/src/models/test_receivers_result.rs b/openapi/src/models/test_receivers_result.rs new file mode 100755 index 00000000..139d09e0 --- /dev/null +++ b/openapi/src/models/test_receivers_result.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestReceiversResult { + #[serde(rename = "alert", skip_serializing_if = "Option::is_none")] + pub alert: Option>, + #[serde(rename = "notified_at", skip_serializing_if = "Option::is_none")] + pub notified_at: Option, + #[serde(rename = "receivers", skip_serializing_if = "Option::is_none")] + pub receivers: Option>, +} + +impl TestReceiversResult { + pub fn new() -> TestReceiversResult { + TestReceiversResult { + alert: None, + notified_at: None, + receivers: None, + } + } +} + diff --git a/openapi/src/models/test_rule_payload.rs b/openapi/src/models/test_rule_payload.rs new file mode 100755 index 00000000..dfecca6a --- /dev/null +++ b/openapi/src/models/test_rule_payload.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestRulePayload { + #[serde(rename = "expr", skip_serializing_if = "Option::is_none")] + pub expr: Option, + #[serde(rename = "grafana_condition", skip_serializing_if = "Option::is_none")] + pub grafana_condition: Option>, +} + +impl TestRulePayload { + pub fn new() -> TestRulePayload { + TestRulePayload { + expr: None, + grafana_condition: None, + } + } +} + diff --git a/openapi/src/models/test_rule_response.rs b/openapi/src/models/test_rule_response.rs new file mode 100755 index 00000000..99d3d296 --- /dev/null +++ b/openapi/src/models/test_rule_response.rs @@ -0,0 +1,30 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestRuleResponse { + /// Vector is basically only an alias for []Sample, but the contract is that in a Vector, all Samples have the same timestamp. + #[serde(rename = "alerts", skip_serializing_if = "Option::is_none")] + pub alerts: Option>, + #[serde(rename = "grafana_alert_instances", skip_serializing_if = "Option::is_none")] + pub grafana_alert_instances: Option>, +} + +impl TestRuleResponse { + pub fn new() -> TestRuleResponse { + TestRuleResponse { + alerts: None, + grafana_alert_instances: None, + } + } +} + diff --git a/openapi/src/models/test_templates_config_body_params.rs b/openapi/src/models/test_templates_config_body_params.rs new file mode 100755 index 00000000..a10ecdaf --- /dev/null +++ b/openapi/src/models/test_templates_config_body_params.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestTemplatesConfigBodyParams { + /// Alerts to use as data when testing the template. + #[serde(rename = "alerts", skip_serializing_if = "Option::is_none")] + pub alerts: Option>, + /// Name of the template file. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + /// Template string to test. + #[serde(rename = "template", skip_serializing_if = "Option::is_none")] + pub template: Option, +} + +impl TestTemplatesConfigBodyParams { + pub fn new() -> TestTemplatesConfigBodyParams { + TestTemplatesConfigBodyParams { + alerts: None, + name: None, + template: None, + } + } +} + diff --git a/openapi/src/models/test_templates_error_result.rs b/openapi/src/models/test_templates_error_result.rs new file mode 100755 index 00000000..c555c62e --- /dev/null +++ b/openapi/src/models/test_templates_error_result.rs @@ -0,0 +1,49 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestTemplatesErrorResult { + /// Kind of template error that occurred. + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, + /// Error message. + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + /// Name of the associated template for this error. Will be empty if the Kind is \"invalid_template\". + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl TestTemplatesErrorResult { + pub fn new() -> TestTemplatesErrorResult { + TestTemplatesErrorResult { + kind: None, + message: None, + name: None, + } + } +} +/// Kind of template error that occurred. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Kind { + #[serde(rename = "invalid_template")] + InvalidTemplate, + #[serde(rename = "execution_error")] + ExecutionError, +} + +impl Default for Kind { + fn default() -> Kind { + Self::InvalidTemplate + } +} + diff --git a/openapi/src/models/test_templates_result.rs b/openapi/src/models/test_templates_result.rs new file mode 100755 index 00000000..d0be66d1 --- /dev/null +++ b/openapi/src/models/test_templates_result.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestTemplatesResult { + /// Name of the associated template definition for this result. + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + /// Interpolated value of the template. + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, +} + +impl TestTemplatesResult { + pub fn new() -> TestTemplatesResult { + TestTemplatesResult { + name: None, + text: None, + } + } +} + diff --git a/openapi/src/models/test_templates_results.rs b/openapi/src/models/test_templates_results.rs new file mode 100755 index 00000000..6a0eff81 --- /dev/null +++ b/openapi/src/models/test_templates_results.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TestTemplatesResults { + #[serde(rename = "errors", skip_serializing_if = "Option::is_none")] + pub errors: Option>, + #[serde(rename = "results", skip_serializing_if = "Option::is_none")] + pub results: Option>, +} + +impl TestTemplatesResults { + pub fn new() -> TestTemplatesResults { + TestTemplatesResults { + errors: None, + results: None, + } + } +} + diff --git a/openapi/src/models/threshold.rs b/openapi/src/models/threshold.rs new file mode 100755 index 00000000..2446666d --- /dev/null +++ b/openapi/src/models/threshold.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Threshold : Threshold a single step on the threshold list +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Threshold { + #[serde(rename = "color", skip_serializing_if = "Option::is_none")] + pub color: Option, + #[serde(rename = "state", skip_serializing_if = "Option::is_none")] + pub state: Option, + /// ConfFloat64 is a float64. It Marshals float64 values of NaN of Inf to null. + #[serde(rename = "value", skip_serializing_if = "Option::is_none")] + pub value: Option, +} + +impl Threshold { + /// Threshold a single step on the threshold list + pub fn new() -> Threshold { + Threshold { + color: None, + state: None, + value: None, + } + } +} + diff --git a/openapi/src/models/thresholds_config.rs b/openapi/src/models/thresholds_config.rs new file mode 100755 index 00000000..394da59e --- /dev/null +++ b/openapi/src/models/thresholds_config.rs @@ -0,0 +1,33 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// ThresholdsConfig : ThresholdsConfig setup thresholds +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ThresholdsConfig { + /// ThresholdsMode absolute or percentage + #[serde(rename = "mode", skip_serializing_if = "Option::is_none")] + pub mode: Option, + /// Must be sorted by 'value', first value is always -Infinity + #[serde(rename = "steps", skip_serializing_if = "Option::is_none")] + pub steps: Option>, +} + +impl ThresholdsConfig { + /// ThresholdsConfig setup thresholds + pub fn new() -> ThresholdsConfig { + ThresholdsConfig { + mode: None, + steps: None, + } + } +} + diff --git a/openapi/src/models/time_interval.rs b/openapi/src/models/time_interval.rs new file mode 100755 index 00000000..fa89d54a --- /dev/null +++ b/openapi/src/models/time_interval.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TimeInterval { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "time_intervals", skip_serializing_if = "Option::is_none")] + pub time_intervals: Option>, +} + +impl TimeInterval { + pub fn new() -> TimeInterval { + TimeInterval { + name: None, + time_intervals: None, + } + } +} + diff --git a/openapi/src/models/time_interval_item.rs b/openapi/src/models/time_interval_item.rs new file mode 100755 index 00000000..f6c99b44 --- /dev/null +++ b/openapi/src/models/time_interval_item.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TimeIntervalItem { + #[serde(rename = "days_of_month", skip_serializing_if = "Option::is_none")] + pub days_of_month: Option>, + #[serde(rename = "location", skip_serializing_if = "Option::is_none")] + pub location: Option, + #[serde(rename = "months", skip_serializing_if = "Option::is_none")] + pub months: Option>, + #[serde(rename = "times", skip_serializing_if = "Option::is_none")] + pub times: Option>, + #[serde(rename = "weekdays", skip_serializing_if = "Option::is_none")] + pub weekdays: Option>, + #[serde(rename = "years", skip_serializing_if = "Option::is_none")] + pub years: Option>, +} + +impl TimeIntervalItem { + pub fn new() -> TimeIntervalItem { + TimeIntervalItem { + days_of_month: None, + location: None, + months: None, + times: None, + weekdays: None, + years: None, + } + } +} + diff --git a/openapi/src/models/time_interval_time_range.rs b/openapi/src/models/time_interval_time_range.rs new file mode 100755 index 00000000..5fb3809b --- /dev/null +++ b/openapi/src/models/time_interval_time_range.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TimeIntervalTimeRange { + #[serde(rename = "end_time", skip_serializing_if = "Option::is_none")] + pub end_time: Option, + #[serde(rename = "start_time", skip_serializing_if = "Option::is_none")] + pub start_time: Option, +} + +impl TimeIntervalTimeRange { + pub fn new() -> TimeIntervalTimeRange { + TimeIntervalTimeRange { + end_time: None, + start_time: None, + } + } +} + diff --git a/openapi/src/models/time_range.rs b/openapi/src/models/time_range.rs new file mode 100755 index 00000000..c690342c --- /dev/null +++ b/openapi/src/models/time_range.rs @@ -0,0 +1,31 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// TimeRange : Redefining this to avoid an import cycle +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TimeRange { + #[serde(rename = "from", skip_serializing_if = "Option::is_none")] + pub from: Option, + #[serde(rename = "to", skip_serializing_if = "Option::is_none")] + pub to: Option, +} + +impl TimeRange { + /// Redefining this to avoid an import cycle + pub fn new() -> TimeRange { + TimeRange { + from: None, + to: None, + } + } +} + diff --git a/openapi/src/models/tls_config.rs b/openapi/src/models/tls_config.rs new file mode 100755 index 00000000..3e4af834 --- /dev/null +++ b/openapi/src/models/tls_config.rs @@ -0,0 +1,60 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TlsConfig { + /// Text of the CA cert to use for the targets. + #[serde(rename = "ca", skip_serializing_if = "Option::is_none")] + pub ca: Option, + /// The CA cert to use for the targets. + #[serde(rename = "ca_file", skip_serializing_if = "Option::is_none")] + pub ca_file: Option, + /// Text of the client cert file for the targets. + #[serde(rename = "cert", skip_serializing_if = "Option::is_none")] + pub cert: Option, + /// The client cert file for the targets. + #[serde(rename = "cert_file", skip_serializing_if = "Option::is_none")] + pub cert_file: Option, + /// Disable target certificate validation. + #[serde(rename = "insecure_skip_verify", skip_serializing_if = "Option::is_none")] + pub insecure_skip_verify: Option, + #[serde(rename = "key", skip_serializing_if = "Option::is_none")] + pub key: Option, + /// The client key file for the targets. + #[serde(rename = "key_file", skip_serializing_if = "Option::is_none")] + pub key_file: Option, + #[serde(rename = "max_version", skip_serializing_if = "Option::is_none")] + pub max_version: Option, + #[serde(rename = "min_version", skip_serializing_if = "Option::is_none")] + pub min_version: Option, + /// Used to verify the hostname for the targets. + #[serde(rename = "server_name", skip_serializing_if = "Option::is_none")] + pub server_name: Option, +} + +impl TlsConfig { + pub fn new() -> TlsConfig { + TlsConfig { + ca: None, + ca_file: None, + cert: None, + cert_file: None, + insecure_skip_verify: None, + key: None, + key_file: None, + max_version: None, + min_version: None, + server_name: None, + } + } +} + diff --git a/openapi/src/models/token.rs b/openapi/src/models/token.rs new file mode 100755 index 00000000..8c363238 --- /dev/null +++ b/openapi/src/models/token.rs @@ -0,0 +1,95 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Token { + #[serde(rename = "account", skip_serializing_if = "Option::is_none")] + pub account: Option, + #[serde(rename = "anonymousRatio", skip_serializing_if = "Option::is_none")] + pub anonymous_ratio: Option, + #[serde(rename = "company", skip_serializing_if = "Option::is_none")] + pub company: Option, + #[serde(rename = "details_url", skip_serializing_if = "Option::is_none")] + pub details_url: Option, + #[serde(rename = "exp", skip_serializing_if = "Option::is_none")] + pub exp: Option, + #[serde(rename = "iat", skip_serializing_if = "Option::is_none")] + pub iat: Option, + #[serde(rename = "included_users", skip_serializing_if = "Option::is_none")] + pub included_users: Option, + #[serde(rename = "iss", skip_serializing_if = "Option::is_none")] + pub iss: Option, + #[serde(rename = "jti", skip_serializing_if = "Option::is_none")] + pub jti: Option, + #[serde(rename = "lexp", skip_serializing_if = "Option::is_none")] + pub lexp: Option, + #[serde(rename = "lic_exp_warn_days", skip_serializing_if = "Option::is_none")] + pub lic_exp_warn_days: Option, + #[serde(rename = "lid", skip_serializing_if = "Option::is_none")] + pub lid: Option, + #[serde(rename = "limit_by", skip_serializing_if = "Option::is_none")] + pub limit_by: Option, + #[serde(rename = "max_concurrent_user_sessions", skip_serializing_if = "Option::is_none")] + pub max_concurrent_user_sessions: Option, + #[serde(rename = "nbf", skip_serializing_if = "Option::is_none")] + pub nbf: Option, + #[serde(rename = "prod", skip_serializing_if = "Option::is_none")] + pub prod: Option>, + #[serde(rename = "slug", skip_serializing_if = "Option::is_none")] + pub slug: Option, + #[serde(rename = "status", skip_serializing_if = "Option::is_none")] + pub status: Option, + #[serde(rename = "sub", skip_serializing_if = "Option::is_none")] + pub sub: Option, + #[serde(rename = "tok_exp_warn_days", skip_serializing_if = "Option::is_none")] + pub tok_exp_warn_days: Option, + #[serde(rename = "trial", skip_serializing_if = "Option::is_none")] + pub trial: Option, + #[serde(rename = "trial_exp", skip_serializing_if = "Option::is_none")] + pub trial_exp: Option, + #[serde(rename = "update_days", skip_serializing_if = "Option::is_none")] + pub update_days: Option, + #[serde(rename = "usage_billing", skip_serializing_if = "Option::is_none")] + pub usage_billing: Option, +} + +impl Token { + pub fn new() -> Token { + Token { + account: None, + anonymous_ratio: None, + company: None, + details_url: None, + exp: None, + iat: None, + included_users: None, + iss: None, + jti: None, + lexp: None, + lic_exp_warn_days: None, + lid: None, + limit_by: None, + max_concurrent_user_sessions: None, + nbf: None, + prod: None, + slug: None, + status: None, + sub: None, + tok_exp_warn_days: None, + trial: None, + trial_exp: None, + update_days: None, + usage_billing: None, + } + } +} + diff --git a/openapi/src/models/token_dto.rs b/openapi/src/models/token_dto.rs new file mode 100755 index 00000000..fb0cbdba --- /dev/null +++ b/openapi/src/models/token_dto.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TokenDto { + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option, + #[serde(rename = "expiration", skip_serializing_if = "Option::is_none")] + pub expiration: Option, + #[serde(rename = "hasExpired", skip_serializing_if = "Option::is_none")] + pub has_expired: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isRevoked", skip_serializing_if = "Option::is_none")] + pub is_revoked: Option, + #[serde(rename = "lastUsedAt", skip_serializing_if = "Option::is_none")] + pub last_used_at: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "secondsUntilExpiration", skip_serializing_if = "Option::is_none")] + pub seconds_until_expiration: Option, +} + +impl TokenDto { + pub fn new() -> TokenDto { + TokenDto { + created: None, + expiration: None, + has_expired: None, + id: None, + is_revoked: None, + last_used_at: None, + name: None, + seconds_until_expiration: None, + } + } +} + diff --git a/openapi/src/models/transformation.rs b/openapi/src/models/transformation.rs new file mode 100755 index 00000000..eea81a61 --- /dev/null +++ b/openapi/src/models/transformation.rs @@ -0,0 +1,49 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Transformation { + #[serde(rename = "expression", skip_serializing_if = "Option::is_none")] + pub expression: Option, + #[serde(rename = "field", skip_serializing_if = "Option::is_none")] + pub field: Option, + #[serde(rename = "mapValue", skip_serializing_if = "Option::is_none")] + pub map_value: Option, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, +} + +impl Transformation { + pub fn new() -> Transformation { + Transformation { + expression: None, + field: None, + map_value: None, + r#type: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Type { + #[serde(rename = "regex")] + Regex, + #[serde(rename = "logfmt")] + Logfmt, +} + +impl Default for Type { + fn default() -> Type { + Self::Regex + } +} + diff --git a/openapi/src/models/type_meta.rs b/openapi/src/models/type_meta.rs new file mode 100755 index 00000000..ee6aa5cd --- /dev/null +++ b/openapi/src/models/type_meta.rs @@ -0,0 +1,33 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// TypeMeta : +k8s:deepcopy-gen=false +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct TypeMeta { + /// APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources +optional + #[serde(rename = "apiVersion", skip_serializing_if = "Option::is_none")] + pub api_version: Option, + /// Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds +optional + #[serde(rename = "kind", skip_serializing_if = "Option::is_none")] + pub kind: Option, +} + +impl TypeMeta { + /// +k8s:deepcopy-gen=false + pub fn new() -> TypeMeta { + TypeMeta { + api_version: None, + kind: None, + } + } +} + diff --git a/openapi/src/models/unstructured.rs b/openapi/src/models/unstructured.rs new file mode 100755 index 00000000..8aba0d3d --- /dev/null +++ b/openapi/src/models/unstructured.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Unstructured : Unstructured allows objects that do not have Golang structs registered to be manipulated generically. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Unstructured { + /// Object is a JSON compatible map with string, float, int, bool, []interface{}, or map[string]interface{} children. + #[serde(rename = "Object", skip_serializing_if = "Option::is_none")] + pub object: Option, +} + +impl Unstructured { + /// Unstructured allows objects that do not have Golang structs registered to be manipulated generically. + pub fn new() -> Unstructured { + Unstructured { + object: None, + } + } +} + diff --git a/openapi/src/models/update_annotations_cmd.rs b/openapi/src/models/update_annotations_cmd.rs new file mode 100755 index 00000000..0da5d9f5 --- /dev/null +++ b/openapi/src/models/update_annotations_cmd.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateAnnotationsCmd { + #[serde(rename = "data", skip_serializing_if = "Option::is_none")] + pub data: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "tags", skip_serializing_if = "Option::is_none")] + pub tags: Option>, + #[serde(rename = "text", skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(rename = "time", skip_serializing_if = "Option::is_none")] + pub time: Option, + #[serde(rename = "timeEnd", skip_serializing_if = "Option::is_none")] + pub time_end: Option, +} + +impl UpdateAnnotationsCmd { + pub fn new() -> UpdateAnnotationsCmd { + UpdateAnnotationsCmd { + data: None, + id: None, + tags: None, + text: None, + time: None, + time_end: None, + } + } +} + diff --git a/openapi/src/models/update_correlation_command.rs b/openapi/src/models/update_correlation_command.rs new file mode 100755 index 00000000..11068cbc --- /dev/null +++ b/openapi/src/models/update_correlation_command.rs @@ -0,0 +1,36 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// UpdateCorrelationCommand : UpdateCorrelationCommand is the command for updating a correlation +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateCorrelationCommand { + #[serde(rename = "config", skip_serializing_if = "Option::is_none")] + pub config: Option>, + /// Optional description of the correlation + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Optional label identifying the correlation + #[serde(rename = "label", skip_serializing_if = "Option::is_none")] + pub label: Option, +} + +impl UpdateCorrelationCommand { + /// UpdateCorrelationCommand is the command for updating a correlation + pub fn new() -> UpdateCorrelationCommand { + UpdateCorrelationCommand { + config: None, + description: None, + label: None, + } + } +} + diff --git a/openapi/src/models/update_correlation_response_body.rs b/openapi/src/models/update_correlation_response_body.rs new file mode 100755 index 00000000..6f237230 --- /dev/null +++ b/openapi/src/models/update_correlation_response_body.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateCorrelationResponseBody { + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "result", skip_serializing_if = "Option::is_none")] + pub result: Option>, +} + +impl UpdateCorrelationResponseBody { + pub fn new() -> UpdateCorrelationResponseBody { + UpdateCorrelationResponseBody { + message: None, + result: None, + } + } +} + diff --git a/openapi/src/models/update_dashboard_acl_command.rs b/openapi/src/models/update_dashboard_acl_command.rs new file mode 100755 index 00000000..9ad48767 --- /dev/null +++ b/openapi/src/models/update_dashboard_acl_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateDashboardAclCommand { + #[serde(rename = "items", skip_serializing_if = "Option::is_none")] + pub items: Option>, +} + +impl UpdateDashboardAclCommand { + pub fn new() -> UpdateDashboardAclCommand { + UpdateDashboardAclCommand { + items: None, + } + } +} + diff --git a/openapi/src/models/update_data_source_command.rs b/openapi/src/models/update_data_source_command.rs new file mode 100755 index 00000000..886cf2ec --- /dev/null +++ b/openapi/src/models/update_data_source_command.rs @@ -0,0 +1,67 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// UpdateDataSourceCommand : Also acts as api DTO +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateDataSourceCommand { + #[serde(rename = "access", skip_serializing_if = "Option::is_none")] + pub access: Option, + #[serde(rename = "basicAuth", skip_serializing_if = "Option::is_none")] + pub basic_auth: Option, + #[serde(rename = "basicAuthUser", skip_serializing_if = "Option::is_none")] + pub basic_auth_user: Option, + #[serde(rename = "database", skip_serializing_if = "Option::is_none")] + pub database: Option, + #[serde(rename = "isDefault", skip_serializing_if = "Option::is_none")] + pub is_default: Option, + #[serde(rename = "jsonData", skip_serializing_if = "Option::is_none")] + pub json_data: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "secureJsonData", skip_serializing_if = "Option::is_none")] + pub secure_json_data: Option>, + #[serde(rename = "type", skip_serializing_if = "Option::is_none")] + pub r#type: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option, + #[serde(rename = "user", skip_serializing_if = "Option::is_none")] + pub user: Option, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, + #[serde(rename = "withCredentials", skip_serializing_if = "Option::is_none")] + pub with_credentials: Option, +} + +impl UpdateDataSourceCommand { + /// Also acts as api DTO + pub fn new() -> UpdateDataSourceCommand { + UpdateDataSourceCommand { + access: None, + basic_auth: None, + basic_auth_user: None, + database: None, + is_default: None, + json_data: None, + name: None, + secure_json_data: None, + r#type: None, + uid: None, + url: None, + user: None, + version: None, + with_credentials: None, + } + } +} + diff --git a/openapi/src/models/update_folder_command.rs b/openapi/src/models/update_folder_command.rs new file mode 100755 index 00000000..57ec2b47 --- /dev/null +++ b/openapi/src/models/update_folder_command.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// UpdateFolderCommand : UpdateFolderCommand captures the information required by the folder service to update a folder. Use Move to update a folder's parent folder. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateFolderCommand { + /// NewDescription it's an optional parameter used for overriding the existing folder description + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + /// Overwrite only used by the legacy folder implementation + #[serde(rename = "overwrite", skip_serializing_if = "Option::is_none")] + pub overwrite: Option, + /// NewTitle it's an optional parameter used for overriding the existing folder title + #[serde(rename = "title", skip_serializing_if = "Option::is_none")] + pub title: Option, + /// Version only used by the legacy folder implementation + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl UpdateFolderCommand { + /// UpdateFolderCommand captures the information required by the folder service to update a folder. Use Move to update a folder's parent folder. + pub fn new() -> UpdateFolderCommand { + UpdateFolderCommand { + description: None, + overwrite: None, + title: None, + version: None, + } + } +} + diff --git a/openapi/src/models/update_org_address_form.rs b/openapi/src/models/update_org_address_form.rs new file mode 100755 index 00000000..12aaf0fa --- /dev/null +++ b/openapi/src/models/update_org_address_form.rs @@ -0,0 +1,41 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateOrgAddressForm { + #[serde(rename = "address1", skip_serializing_if = "Option::is_none")] + pub address1: Option, + #[serde(rename = "address2", skip_serializing_if = "Option::is_none")] + pub address2: Option, + #[serde(rename = "city", skip_serializing_if = "Option::is_none")] + pub city: Option, + #[serde(rename = "country", skip_serializing_if = "Option::is_none")] + pub country: Option, + #[serde(rename = "state", skip_serializing_if = "Option::is_none")] + pub state: Option, + #[serde(rename = "zipcode", skip_serializing_if = "Option::is_none")] + pub zipcode: Option, +} + +impl UpdateOrgAddressForm { + pub fn new() -> UpdateOrgAddressForm { + UpdateOrgAddressForm { + address1: None, + address2: None, + city: None, + country: None, + state: None, + zipcode: None, + } + } +} + diff --git a/openapi/src/models/update_org_form.rs b/openapi/src/models/update_org_form.rs new file mode 100755 index 00000000..46572c07 --- /dev/null +++ b/openapi/src/models/update_org_form.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateOrgForm { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl UpdateOrgForm { + pub fn new() -> UpdateOrgForm { + UpdateOrgForm { + name: None, + } + } +} + diff --git a/openapi/src/models/update_org_user_command.rs b/openapi/src/models/update_org_user_command.rs new file mode 100755 index 00000000..cd054176 --- /dev/null +++ b/openapi/src/models/update_org_user_command.rs @@ -0,0 +1,44 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateOrgUserCommand { + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, +} + +impl UpdateOrgUserCommand { + pub fn new() -> UpdateOrgUserCommand { + UpdateOrgUserCommand { + role: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/update_playlist_command.rs b/openapi/src/models/update_playlist_command.rs new file mode 100755 index 00000000..046e66c8 --- /dev/null +++ b/openapi/src/models/update_playlist_command.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdatePlaylistCommand { + #[serde(rename = "interval", skip_serializing_if = "Option::is_none")] + pub interval: Option, + #[serde(rename = "items", skip_serializing_if = "Option::is_none")] + pub items: Option>, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl UpdatePlaylistCommand { + pub fn new() -> UpdatePlaylistCommand { + UpdatePlaylistCommand { + interval: None, + items: None, + name: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/update_prefs_cmd.rs b/openapi/src/models/update_prefs_cmd.rs new file mode 100755 index 00000000..39df7809 --- /dev/null +++ b/openapi/src/models/update_prefs_cmd.rs @@ -0,0 +1,78 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdatePrefsCmd { + #[serde(rename = "cookies", skip_serializing_if = "Option::is_none")] + pub cookies: Option>, + /// The numerical :id of a favorited dashboard + #[serde(rename = "homeDashboardId", skip_serializing_if = "Option::is_none")] + pub home_dashboard_id: Option, + #[serde(rename = "homeDashboardUID", skip_serializing_if = "Option::is_none")] + pub home_dashboard_uid: Option, + #[serde(rename = "language", skip_serializing_if = "Option::is_none")] + pub language: Option, + #[serde(rename = "queryHistory", skip_serializing_if = "Option::is_none")] + pub query_history: Option>, + #[serde(rename = "theme", skip_serializing_if = "Option::is_none")] + pub theme: Option, + #[serde(rename = "timezone", skip_serializing_if = "Option::is_none")] + pub timezone: Option, + #[serde(rename = "weekStart", skip_serializing_if = "Option::is_none")] + pub week_start: Option, +} + +impl UpdatePrefsCmd { + pub fn new() -> UpdatePrefsCmd { + UpdatePrefsCmd { + cookies: None, + home_dashboard_id: None, + home_dashboard_uid: None, + language: None, + query_history: None, + theme: None, + timezone: None, + week_start: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Theme { + #[serde(rename = "light")] + Light, + #[serde(rename = "dark")] + Dark, + #[serde(rename = "system")] + System, +} + +impl Default for Theme { + fn default() -> Theme { + Self::Light + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Timezone { + #[serde(rename = "utc")] + Utc, + #[serde(rename = "browser")] + Browser, +} + +impl Default for Timezone { + fn default() -> Timezone { + Self::Utc + } +} + diff --git a/openapi/src/models/update_provider_settings_request.rs b/openapi/src/models/update_provider_settings_request.rs new file mode 100755 index 00000000..91ffc2b6 --- /dev/null +++ b/openapi/src/models/update_provider_settings_request.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateProviderSettingsRequest { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "provider", skip_serializing_if = "Option::is_none")] + pub provider: Option, + #[serde(rename = "settings", skip_serializing_if = "Option::is_none")] + pub settings: Option, +} + +impl UpdateProviderSettingsRequest { + pub fn new() -> UpdateProviderSettingsRequest { + UpdateProviderSettingsRequest { + id: None, + provider: None, + settings: None, + } + } +} + diff --git a/openapi/src/models/update_quota_cmd.rs b/openapi/src/models/update_quota_cmd.rs new file mode 100755 index 00000000..ec320aa9 --- /dev/null +++ b/openapi/src/models/update_quota_cmd.rs @@ -0,0 +1,29 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateQuotaCmd { + #[serde(rename = "limit", skip_serializing_if = "Option::is_none")] + pub limit: Option, + #[serde(rename = "target", skip_serializing_if = "Option::is_none")] + pub target: Option, +} + +impl UpdateQuotaCmd { + pub fn new() -> UpdateQuotaCmd { + UpdateQuotaCmd { + limit: None, + target: None, + } + } +} + diff --git a/openapi/src/models/update_role_command.rs b/openapi/src/models/update_role_command.rs new file mode 100755 index 00000000..1e1eca99 --- /dev/null +++ b/openapi/src/models/update_role_command.rs @@ -0,0 +1,47 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateRoleCommand { + #[serde(rename = "description", skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(rename = "displayName", skip_serializing_if = "Option::is_none")] + pub display_name: Option, + #[serde(rename = "global", skip_serializing_if = "Option::is_none")] + pub global: Option, + #[serde(rename = "group", skip_serializing_if = "Option::is_none")] + pub group: Option, + #[serde(rename = "hidden", skip_serializing_if = "Option::is_none")] + pub hidden: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "permissions", skip_serializing_if = "Option::is_none")] + pub permissions: Option>, + #[serde(rename = "version", skip_serializing_if = "Option::is_none")] + pub version: Option, +} + +impl UpdateRoleCommand { + pub fn new() -> UpdateRoleCommand { + UpdateRoleCommand { + description: None, + display_name: None, + global: None, + group: None, + hidden: None, + name: None, + permissions: None, + version: None, + } + } +} + diff --git a/openapi/src/models/update_rule_group_response.rs b/openapi/src/models/update_rule_group_response.rs new file mode 100755 index 00000000..c7156c34 --- /dev/null +++ b/openapi/src/models/update_rule_group_response.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateRuleGroupResponse { + #[serde(rename = "created", skip_serializing_if = "Option::is_none")] + pub created: Option>, + #[serde(rename = "deleted", skip_serializing_if = "Option::is_none")] + pub deleted: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "updated", skip_serializing_if = "Option::is_none")] + pub updated: Option>, +} + +impl UpdateRuleGroupResponse { + pub fn new() -> UpdateRuleGroupResponse { + UpdateRuleGroupResponse { + created: None, + deleted: None, + message: None, + updated: None, + } + } +} + diff --git a/openapi/src/models/update_service_account_200_response.rs b/openapi/src/models/update_service_account_200_response.rs new file mode 100755 index 00000000..f04f6571 --- /dev/null +++ b/openapi/src/models/update_service_account_200_response.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateServiceAccount200Response { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "serviceaccount", skip_serializing_if = "Option::is_none")] + pub serviceaccount: Option>, +} + +impl UpdateServiceAccount200Response { + pub fn new() -> UpdateServiceAccount200Response { + UpdateServiceAccount200Response { + id: None, + message: None, + name: None, + serviceaccount: None, + } + } +} + diff --git a/openapi/src/models/update_service_account_form.rs b/openapi/src/models/update_service_account_form.rs new file mode 100755 index 00000000..5f78bdef --- /dev/null +++ b/openapi/src/models/update_service_account_form.rs @@ -0,0 +1,53 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateServiceAccountForm { + #[serde(rename = "isDisabled", skip_serializing_if = "Option::is_none")] + pub is_disabled: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, + #[serde(rename = "serviceAccountId", skip_serializing_if = "Option::is_none")] + pub service_account_id: Option, +} + +impl UpdateServiceAccountForm { + pub fn new() -> UpdateServiceAccountForm { + UpdateServiceAccountForm { + is_disabled: None, + name: None, + role: None, + service_account_id: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/update_team_command.rs b/openapi/src/models/update_team_command.rs new file mode 100755 index 00000000..5bb02269 --- /dev/null +++ b/openapi/src/models/update_team_command.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateTeamCommand { + #[serde(rename = "Email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "ID", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "Name", skip_serializing_if = "Option::is_none")] + pub name: Option, +} + +impl UpdateTeamCommand { + pub fn new() -> UpdateTeamCommand { + UpdateTeamCommand { + email: None, + id: None, + name: None, + } + } +} + diff --git a/openapi/src/models/update_team_member_command.rs b/openapi/src/models/update_team_member_command.rs new file mode 100755 index 00000000..399e82fb --- /dev/null +++ b/openapi/src/models/update_team_member_command.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateTeamMemberCommand { + #[serde(rename = "permission", skip_serializing_if = "Option::is_none")] + pub permission: Option, +} + +impl UpdateTeamMemberCommand { + pub fn new() -> UpdateTeamMemberCommand { + UpdateTeamMemberCommand { + permission: None, + } + } +} + diff --git a/openapi/src/models/update_user_command.rs b/openapi/src/models/update_user_command.rs new file mode 100755 index 00000000..0c2cf3aa --- /dev/null +++ b/openapi/src/models/update_user_command.rs @@ -0,0 +1,35 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UpdateUserCommand { + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "theme", skip_serializing_if = "Option::is_none")] + pub theme: Option, +} + +impl UpdateUserCommand { + pub fn new() -> UpdateUserCommand { + UpdateUserCommand { + email: None, + login: None, + name: None, + theme: None, + } + } +} + diff --git a/openapi/src/models/url.rs b/openapi/src/models/url.rs new file mode 100755 index 00000000..2ad8af25 --- /dev/null +++ b/openapi/src/models/url.rs @@ -0,0 +1,59 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// Url : The general form represented is: [scheme:][//[userinfo@]host][/]path[?query][#fragment] URLs that do not start with a slash after the scheme are interpreted as: scheme:opaque[?query][#fragment] Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/. A consequence is that it is impossible to tell which slashes in the Path were slashes in the raw URL and which were %2f. This distinction is rarely important, but when it is, the code should use the EscapedPath method, which preserves the original encoding of Path. The RawPath field is an optional field which is only set when the default encoding of Path is different from the escaped path. See the EscapedPath method for more details. URL's String method uses the EscapedPath method to obtain the path. +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct Url { + #[serde(rename = "ForceQuery", skip_serializing_if = "Option::is_none")] + pub force_query: Option, + #[serde(rename = "Fragment", skip_serializing_if = "Option::is_none")] + pub fragment: Option, + #[serde(rename = "Host", skip_serializing_if = "Option::is_none")] + pub host: Option, + #[serde(rename = "OmitHost", skip_serializing_if = "Option::is_none")] + pub omit_host: Option, + #[serde(rename = "Opaque", skip_serializing_if = "Option::is_none")] + pub opaque: Option, + #[serde(rename = "Path", skip_serializing_if = "Option::is_none")] + pub path: Option, + #[serde(rename = "RawFragment", skip_serializing_if = "Option::is_none")] + pub raw_fragment: Option, + #[serde(rename = "RawPath", skip_serializing_if = "Option::is_none")] + pub raw_path: Option, + #[serde(rename = "RawQuery", skip_serializing_if = "Option::is_none")] + pub raw_query: Option, + #[serde(rename = "Scheme", skip_serializing_if = "Option::is_none")] + pub scheme: Option, + /// The Userinfo type is an immutable encapsulation of username and password details for a URL. An existing Userinfo value is guaranteed to have a username set (potentially empty, as allowed by RFC 2396), and optionally a password. + #[serde(rename = "User", skip_serializing_if = "Option::is_none")] + pub user: Option, +} + +impl Url { + /// The general form represented is: [scheme:][//[userinfo@]host][/]path[?query][#fragment] URLs that do not start with a slash after the scheme are interpreted as: scheme:opaque[?query][#fragment] Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/. A consequence is that it is impossible to tell which slashes in the Path were slashes in the raw URL and which were %2f. This distinction is rarely important, but when it is, the code should use the EscapedPath method, which preserves the original encoding of Path. The RawPath field is an optional field which is only set when the default encoding of Path is different from the escaped path. See the EscapedPath method for more details. URL's String method uses the EscapedPath method to obtain the path. + pub fn new() -> Url { + Url { + force_query: None, + fragment: None, + host: None, + omit_host: None, + opaque: None, + path: None, + raw_fragment: None, + raw_path: None, + raw_query: None, + scheme: None, + user: None, + } + } +} + diff --git a/openapi/src/models/user_lookup_dto.rs b/openapi/src/models/user_lookup_dto.rs new file mode 100755 index 00000000..701d335c --- /dev/null +++ b/openapi/src/models/user_lookup_dto.rs @@ -0,0 +1,32 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UserLookupDto { + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "userId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl UserLookupDto { + pub fn new() -> UserLookupDto { + UserLookupDto { + avatar_url: None, + login: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/user_org_dto.rs b/openapi/src/models/user_org_dto.rs new file mode 100755 index 00000000..ba6a7859 --- /dev/null +++ b/openapi/src/models/user_org_dto.rs @@ -0,0 +1,50 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UserOrgDto { + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "role", skip_serializing_if = "Option::is_none")] + pub role: Option, +} + +impl UserOrgDto { + pub fn new() -> UserOrgDto { + UserOrgDto { + name: None, + org_id: None, + role: None, + } + } +} +/// +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +pub enum Role { + #[serde(rename = "None")] + None, + #[serde(rename = "Viewer")] + Viewer, + #[serde(rename = "Editor")] + Editor, + #[serde(rename = "Admin")] + Admin, +} + +impl Default for Role { + fn default() -> Role { + Self::None + } +} + diff --git a/openapi/src/models/user_profile_dto.rs b/openapi/src/models/user_profile_dto.rs new file mode 100755 index 00000000..a98cc6c7 --- /dev/null +++ b/openapi/src/models/user_profile_dto.rs @@ -0,0 +1,74 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UserProfileDto { + #[serde(rename = "accessControl", skip_serializing_if = "Option::is_none")] + pub access_control: Option>, + #[serde(rename = "authLabels", skip_serializing_if = "Option::is_none")] + pub auth_labels: Option>, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isDisabled", skip_serializing_if = "Option::is_none")] + pub is_disabled: Option, + #[serde(rename = "isExternal", skip_serializing_if = "Option::is_none")] + pub is_external: Option, + #[serde(rename = "isExternallySynced", skip_serializing_if = "Option::is_none")] + pub is_externally_synced: Option, + #[serde(rename = "isGrafanaAdmin", skip_serializing_if = "Option::is_none")] + pub is_grafana_admin: Option, + #[serde(rename = "isGrafanaAdminExternallySynced", skip_serializing_if = "Option::is_none")] + pub is_grafana_admin_externally_synced: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "orgId", skip_serializing_if = "Option::is_none")] + pub org_id: Option, + #[serde(rename = "theme", skip_serializing_if = "Option::is_none")] + pub theme: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, + #[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")] + pub updated_at: Option, +} + +impl UserProfileDto { + pub fn new() -> UserProfileDto { + UserProfileDto { + access_control: None, + auth_labels: None, + avatar_url: None, + created_at: None, + email: None, + id: None, + is_disabled: None, + is_external: None, + is_externally_synced: None, + is_grafana_admin: None, + is_grafana_admin_externally_synced: None, + login: None, + name: None, + org_id: None, + theme: None, + uid: None, + updated_at: None, + } + } +} + diff --git a/openapi/src/models/user_search_hit_dto.rs b/openapi/src/models/user_search_hit_dto.rs new file mode 100755 index 00000000..5597d946 --- /dev/null +++ b/openapi/src/models/user_search_hit_dto.rs @@ -0,0 +1,56 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UserSearchHitDto { + #[serde(rename = "authLabels", skip_serializing_if = "Option::is_none")] + pub auth_labels: Option>, + #[serde(rename = "avatarUrl", skip_serializing_if = "Option::is_none")] + pub avatar_url: Option, + #[serde(rename = "email", skip_serializing_if = "Option::is_none")] + pub email: Option, + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "isAdmin", skip_serializing_if = "Option::is_none")] + pub is_admin: Option, + #[serde(rename = "isDisabled", skip_serializing_if = "Option::is_none")] + pub is_disabled: Option, + #[serde(rename = "lastSeenAt", skip_serializing_if = "Option::is_none")] + pub last_seen_at: Option, + #[serde(rename = "lastSeenAtAge", skip_serializing_if = "Option::is_none")] + pub last_seen_at_age: Option, + #[serde(rename = "login", skip_serializing_if = "Option::is_none")] + pub login: Option, + #[serde(rename = "name", skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(rename = "uid", skip_serializing_if = "Option::is_none")] + pub uid: Option, +} + +impl UserSearchHitDto { + pub fn new() -> UserSearchHitDto { + UserSearchHitDto { + auth_labels: None, + avatar_url: None, + email: None, + id: None, + is_admin: None, + is_disabled: None, + last_seen_at: None, + last_seen_at_age: None, + login: None, + name: None, + uid: None, + } + } +} + diff --git a/openapi/src/models/user_token.rs b/openapi/src/models/user_token.rs new file mode 100755 index 00000000..311b8bc3 --- /dev/null +++ b/openapi/src/models/user_token.rs @@ -0,0 +1,64 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// UserToken : UserToken represents a user token +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct UserToken { + #[serde(rename = "AuthToken", skip_serializing_if = "Option::is_none")] + pub auth_token: Option, + #[serde(rename = "AuthTokenSeen", skip_serializing_if = "Option::is_none")] + pub auth_token_seen: Option, + #[serde(rename = "ClientIp", skip_serializing_if = "Option::is_none")] + pub client_ip: Option, + #[serde(rename = "CreatedAt", skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(rename = "Id", skip_serializing_if = "Option::is_none")] + pub id: Option, + #[serde(rename = "PrevAuthToken", skip_serializing_if = "Option::is_none")] + pub prev_auth_token: Option, + #[serde(rename = "RevokedAt", skip_serializing_if = "Option::is_none")] + pub revoked_at: Option, + #[serde(rename = "RotatedAt", skip_serializing_if = "Option::is_none")] + pub rotated_at: Option, + #[serde(rename = "SeenAt", skip_serializing_if = "Option::is_none")] + pub seen_at: Option, + #[serde(rename = "UnhashedToken", skip_serializing_if = "Option::is_none")] + pub unhashed_token: Option, + #[serde(rename = "UpdatedAt", skip_serializing_if = "Option::is_none")] + pub updated_at: Option, + #[serde(rename = "UserAgent", skip_serializing_if = "Option::is_none")] + pub user_agent: Option, + #[serde(rename = "UserId", skip_serializing_if = "Option::is_none")] + pub user_id: Option, +} + +impl UserToken { + /// UserToken represents a user token + pub fn new() -> UserToken { + UserToken { + auth_token: None, + auth_token_seen: None, + client_ip: None, + created_at: None, + id: None, + prev_auth_token: None, + revoked_at: None, + rotated_at: None, + seen_at: None, + unhashed_token: None, + updated_at: None, + user_agent: None, + user_id: None, + } + } +} + diff --git a/openapi/src/models/validation_error.rs b/openapi/src/models/validation_error.rs new file mode 100755 index 00000000..5ed6576e --- /dev/null +++ b/openapi/src/models/validation_error.rs @@ -0,0 +1,26 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct ValidationError { + #[serde(rename = "msg", skip_serializing_if = "Option::is_none")] + pub msg: Option, +} + +impl ValidationError { + pub fn new() -> ValidationError { + ValidationError { + msg: None, + } + } +} + diff --git a/openapi/src/models/version_info.rs b/openapi/src/models/version_info.rs new file mode 100755 index 00000000..7a53a5a5 --- /dev/null +++ b/openapi/src/models/version_info.rs @@ -0,0 +1,49 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +/// VersionInfo : VersionInfo version info +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct VersionInfo { + /// branch + #[serde(rename = "branch")] + pub branch: String, + /// build date + #[serde(rename = "buildDate")] + pub build_date: String, + /// build user + #[serde(rename = "buildUser")] + pub build_user: String, + /// go version + #[serde(rename = "goVersion")] + pub go_version: String, + /// revision + #[serde(rename = "revision")] + pub revision: String, + /// version + #[serde(rename = "version")] + pub version: String, +} + +impl VersionInfo { + /// VersionInfo version info + pub fn new(branch: String, build_date: String, build_user: String, go_version: String, revision: String, version: String) -> VersionInfo { + VersionInfo { + branch, + build_date, + build_user, + go_version, + revision, + version, + } + } +} + diff --git a/openapi/src/models/victor_ops_config.rs b/openapi/src/models/victor_ops_config.rs new file mode 100755 index 00000000..9eb7e48f --- /dev/null +++ b/openapi/src/models/victor_ops_config.rs @@ -0,0 +1,56 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct VictorOpsConfig { + #[serde(rename = "api_key", skip_serializing_if = "Option::is_none")] + pub api_key: Option, + #[serde(rename = "api_key_file", skip_serializing_if = "Option::is_none")] + pub api_key_file: Option, + #[serde(rename = "api_url", skip_serializing_if = "Option::is_none")] + pub api_url: Option>, + #[serde(rename = "custom_fields", skip_serializing_if = "Option::is_none")] + pub custom_fields: Option>, + #[serde(rename = "entity_display_name", skip_serializing_if = "Option::is_none")] + pub entity_display_name: Option, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message_type", skip_serializing_if = "Option::is_none")] + pub message_type: Option, + #[serde(rename = "monitoring_tool", skip_serializing_if = "Option::is_none")] + pub monitoring_tool: Option, + #[serde(rename = "routing_key", skip_serializing_if = "Option::is_none")] + pub routing_key: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "state_message", skip_serializing_if = "Option::is_none")] + pub state_message: Option, +} + +impl VictorOpsConfig { + pub fn new() -> VictorOpsConfig { + VictorOpsConfig { + api_key: None, + api_key_file: None, + api_url: None, + custom_fields: None, + entity_display_name: None, + http_config: None, + message_type: None, + monitoring_tool: None, + routing_key: None, + send_resolved: None, + state_message: None, + } + } +} + diff --git a/openapi/src/models/webex_config.rs b/openapi/src/models/webex_config.rs new file mode 100755 index 00000000..baf90150 --- /dev/null +++ b/openapi/src/models/webex_config.rs @@ -0,0 +1,38 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct WebexConfig { + #[serde(rename = "api_url", skip_serializing_if = "Option::is_none")] + pub api_url: Option>, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "room_id", skip_serializing_if = "Option::is_none")] + pub room_id: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, +} + +impl WebexConfig { + pub fn new() -> WebexConfig { + WebexConfig { + api_url: None, + http_config: None, + message: None, + room_id: None, + send_resolved: None, + } + } +} + diff --git a/openapi/src/models/webhook_config.rs b/openapi/src/models/webhook_config.rs new file mode 100755 index 00000000..1cf9ad54 --- /dev/null +++ b/openapi/src/models/webhook_config.rs @@ -0,0 +1,39 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct WebhookConfig { + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + /// MaxAlerts is the maximum number of alerts to be sent per webhook message. Alerts exceeding this threshold will be truncated. Setting this to 0 allows an unlimited number of alerts. + #[serde(rename = "max_alerts", skip_serializing_if = "Option::is_none")] + pub max_alerts: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "url", skip_serializing_if = "Option::is_none")] + pub url: Option>, + #[serde(rename = "url_file", skip_serializing_if = "Option::is_none")] + pub url_file: Option, +} + +impl WebhookConfig { + pub fn new() -> WebhookConfig { + WebhookConfig { + http_config: None, + max_alerts: None, + send_resolved: None, + url: None, + url_file: None, + } + } +} + diff --git a/openapi/src/models/wechat_config.rs b/openapi/src/models/wechat_config.rs new file mode 100755 index 00000000..a8bf8053 --- /dev/null +++ b/openapi/src/models/wechat_config.rs @@ -0,0 +1,56 @@ +/* + * Grafana HTTP API. + * + * The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving dashboards, creating users and updating data sources. + * + * The version of the OpenAPI document: 0.0.1 + * Contact: hello@grafana.com + * Generated by: https://openapi-generator.tech + */ + +use crate::models; + +#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)] +pub struct WechatConfig { + #[serde(rename = "agent_id", skip_serializing_if = "Option::is_none")] + pub agent_id: Option, + #[serde(rename = "api_secret", skip_serializing_if = "Option::is_none")] + pub api_secret: Option, + #[serde(rename = "api_url", skip_serializing_if = "Option::is_none")] + pub api_url: Option>, + #[serde(rename = "corp_id", skip_serializing_if = "Option::is_none")] + pub corp_id: Option, + #[serde(rename = "http_config", skip_serializing_if = "Option::is_none")] + pub http_config: Option>, + #[serde(rename = "message", skip_serializing_if = "Option::is_none")] + pub message: Option, + #[serde(rename = "message_type", skip_serializing_if = "Option::is_none")] + pub message_type: Option, + #[serde(rename = "send_resolved", skip_serializing_if = "Option::is_none")] + pub send_resolved: Option, + #[serde(rename = "to_party", skip_serializing_if = "Option::is_none")] + pub to_party: Option, + #[serde(rename = "to_tag", skip_serializing_if = "Option::is_none")] + pub to_tag: Option, + #[serde(rename = "to_user", skip_serializing_if = "Option::is_none")] + pub to_user: Option, +} + +impl WechatConfig { + pub fn new() -> WechatConfig { + WechatConfig { + agent_id: None, + api_secret: None, + api_url: None, + corp_id: None, + http_config: None, + message: None, + message_type: None, + send_resolved: None, + to_party: None, + to_tag: None, + to_user: None, + } + } +} + diff --git a/readme.md b/readme.md new file mode 100644 index 00000000..9aaf9e0d --- /dev/null +++ b/readme.md @@ -0,0 +1,242 @@ + + +

+ +

+ +[![Build Status][actions-badge]][actions-url] +[![Discord Chat][discord-badge]][discord-url] + +[actions-badge]: https://github.com/nightly-labs/connect/actions/workflows/connect-test-production.yml/badge.svg +[actions-url]: https://github.com/nightly-labs/connect/actions/workflows/connect-test-production.yml +[discord-badge]: https://img.shields.io/discord/500028886025895936.svg?logo=discord&style=flat-square +[discord-url]: https://discord.gg/aWAbWjWVdY + + +# Overview + +Nightly Connect is a permissionless, open-source solution that serves as both a wallet adapter and a bridge wallet, enabling connections through QR codes or deep links. + +We built this tool to lighten dApp developers in continuously adding new wallets. Now, after implementing Nightly Connect once, all standard-compliant wallets will be added automatically without any action required from dApp. + +# Server + +Connect service was written in Rust language and uses Axum as a web framework. The service is designed to be lightweight and fast, with a focus on security and performance. It has been extended to allow applications to track the statistics of their users' interactions with the service. + +From now on those two names will be used to distinguish between the two versions of the service: + +- ### Nightly Connect + Basic but fully functional relay service with accompanying packages. + +- ### Nightly Cloud + Extended version of the service which utilizes TimescaleDB along with Grafana to visualize the data for registered apps integrating Nightly Connect. + +# Local deployment + +If you only want to implement Nightly Connect in your dApp instead, you may refer to the documentation [here](https://connect.nightly.app/docs/). + +> [!IMPORTANT] +> While the Nightly Connect was built and tested on Mac/Linux, the Nightly Cloud is impossible to run on Mac due to used docker images. + +## Requirements + +As a prerequisite, you need to have the following installed on your machine: + +- [Rust](https://www.rust-lang.org/tools/install) +- [pnpm](https://pnpm.io/installation) + +Nightly Cloud only: +- [Docker Compose](https://docs.docker.com/compose/install/) +- You may also need to install terminal to interact with the database like [psql](https://www.timescale.com/blog/how-to-install-psql-on-mac-ubuntu-debian-windows/) or any other tool of your choice. + + +All Rust development is done using the latest stable version of Rust. You may check your current version by running: + +```bash +rustc --version +``` + +If needed you can update it by running: + +```bash +rustup update +``` + +## How to run Nightly Connect + +1. Clone the repository: + + Recommended way to clone the repository is to use SSH: + ```bash + git clone git@github.com:nightly-labs/connect.git + ``` + + If you prefer less secure option using HTTPS: + ```bash + git clone https://github.com/nightly-labs/connect.git + ``` + +2. Navigate to the main ```.env``` file located in the main catalog of the repository and check if the ```ONLY_RELAY_SERVICE``` value is set to ```TRUE``` + + Along with the variable ```ENV```, those two are the only variables which will be used by the Nightly Connect service. + +3. Build and run: + + For maximum performance, you can build the project with the following command: + + ```bash + cargo build --release --bin nightly-connect-server + ``` + + If build is failing you may want to try and run tests first: + + ```bash + cargo test + ``` + + After building the project, you can run it with: + + ```bash + cargo run --release --bin nightly-connect-server + ``` + By default, the server will be running on ```http://127.0.0.1:6969``` which can be changed in ```./connect/server/src/bin/nightly-connect-server-rs```. + +4. You may test if service is working by calling one of the http endpoints with curl command: + + ```bash + curl -X GET http://127.0.0.1:6969/get_wallets_metadata + ``` + + If everything is working correctly, you should see huge JSON response with the metadata of all wallets. + +5. (Optional) In order to interact with connect you might want to use our TS Sdk, if so navigate to ```./connect/sdk``` and then: + + First verify if the bindings are up to date: + + ```bash + pnpm bindings + ``` + + Then install the dependencies: + + ```bash + pnpm install + ``` + + After installing the dependencies navigate to the ```./connect/sdk/packages/base``` catalog. This directory includes all of the basic packages which are then used in SDK. + + ```bash + pnpm test + ``` + + If you want to use the SDK in your project, you can build it with: + + ```bash + pnpm build + ``` + +## How to run Nightly Cloud + + As Nightly Cloud is an extended version of the service, it requires additional setup. The service is designed to be run in a Docker container, which is why you need to have Docker Compose installed on your machine. + + 1. Setup and start Database, you may refer to the [Database](./infra/readme.md) documentation for more information. + + 2. Setup and start Grafana, you may refer to the [Grafana](./grafana/readme.md) documentation for more information. + + 3. Setup ```ENV``` variables in ```./connect/.env``` file. + - ```ENV``` - set to ```DEV``` for development environment. + - ```ONLY_RELAY_SERVICE``` - set to ```FALSE```. + - ```NONCE``` - set to any random string, it will be used to encrypt passwords. + + Grafana related environment variables: + + - ```GRAFANA_BASE_PATH``` - set to the URL of the Grafana instance. + - ```GRAFANA_CLIENT_LOGIN``` - admin login to the Grafana instance. It needs to be a Grafana admin as only this level of access allows to create users accounts. + - ```GRAFANA_CLIENT_PASSWORD``` - admin password to the Grafana instance. + + Grafana JWT tokens setup: + 1. Navigate to ```./connect/jwt_tokens``` catalog. + + 2. Generate a new rsa key pair: + ```bash + ssh-keygen -t rsa -b 4096 -m PEM -f grafana.key -N "" + ``` + 3. Extract public key from the private key: + ```bash + openssl rsa -in grafana.key -pubout -outform PEM -out grafana.key.pub + ``` + + 4. Run the following command to get the keys in one line version: + ```bash + cat grafana.key | awk '{printf "%s", $0}' && echo "" && cat grafana.key.pub | awk '{printf "\n%s", $0}' && echo "" + ``` + + - ```JWT_SECRET``` - set to the private key generated in the previous step. + - ```JWT_PUBLIC_KEY``` - set to the public key generated in the previous step. + + Mailer setup: + - ```MAILER_ADDRESS``` - set to the email address from which the emails will be sent. + - ```MAILER_PASSWORD``` - set to the password of the email address from which the emails will be sent. + + When it comes to the e-mails, the service is using the SMTP protocol to send them out, make sure that the email address you are using is configured to allow sending emails via SMTP. + + + +> [!NOTE] +> With env ```ENV``` set to ```DEV``` the service will skip any usage of the mailer. + + 4. Build and run: + + Just like when running Nightly Connect, you can build the project with the following command: + + ```bash + cargo build --release --bin nightly-connect-server + ``` + + After building the project, you can run it with: + + ```bash + cargo run --release --bin nightly-connect-server + ``` + + By default all Rust rests utilizing the database are disabled by feature flag, to run all tests you can use custom command from ```./connect/.cargo/config.toml```: + + ```bash + cargo test-integration + ``` + +5. (Optional) In order to interact with Nightly Cloud you might want to use our TS Sdk, if so navigate to ```./connect/sdk``` and then: + + First verify if the bindings are up to date: + + ```bash + pnpm bindings + ``` + + Then install the dependencies: + + ```bash + pnpm install + ``` + + After installing the dependencies navigate to the ```./connect/sdk/packages/``` catalog. In order to fully utilize Nightly Cloud functionalities, you need to make use of those two packages: + + - ### Analytics + + Used to send events to the Nightly Cloud service. They are then used to show the statistics of the users' interactions with the service for apps. + + - ### Cloud + + Used to interact with the Nightly Cloud endpoints related to the team and apps management. + + + + + + + + + + + + diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 00000000..2e2b8c85 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.82.0" diff --git a/sdk/bindings/AppConnectEvent.ts b/sdk/bindings/AppConnectEvent.ts new file mode 100644 index 00000000..5a6a0511 --- /dev/null +++ b/sdk/bindings/AppConnectEvent.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { DeviceMetadata } from "./DeviceMetadata"; + +export interface AppConnectEvent { sessionId: string, deviceMetadata: DeviceMetadata, language: string, timezone: string, network: string, newSession: boolean, } \ No newline at end of file diff --git a/sdk/bindings/AppDisconnectEvent.ts b/sdk/bindings/AppDisconnectEvent.ts new file mode 100644 index 00000000..45063c6a --- /dev/null +++ b/sdk/bindings/AppDisconnectEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface AppDisconnectEvent { sessionId: string, } \ No newline at end of file diff --git a/sdk/bindings/AppEvent.ts b/sdk/bindings/AppEvent.ts new file mode 100644 index 00000000..4506dc34 --- /dev/null +++ b/sdk/bindings/AppEvent.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { EventType } from "./EventType"; + +export interface AppEvent { eventType: EventType, creationTimestamp: string, } \ No newline at end of file diff --git a/sdk/bindings/AppInfo.ts b/sdk/bindings/AppInfo.ts new file mode 100644 index 00000000..1efbf661 --- /dev/null +++ b/sdk/bindings/AppInfo.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { WhitelistedDomain } from "./WhitelistedDomain"; + +export interface AppInfo { teamId: string, appId: string, appName: string, registeredAt: string, whitelistedDomains: Array, ackPublicKeys: Array, } \ No newline at end of file diff --git a/sdk/bindings/ChangeNetworkEvent.ts b/sdk/bindings/ChangeNetworkEvent.ts new file mode 100644 index 00000000..5042d325 --- /dev/null +++ b/sdk/bindings/ChangeNetworkEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface ChangeNetworkEvent { sessionId: string, requestId: string, oldNetwork: string, } \ No newline at end of file diff --git a/sdk/bindings/ChangeNetworkResolveEvent.ts b/sdk/bindings/ChangeNetworkResolveEvent.ts new file mode 100644 index 00000000..d5a9074d --- /dev/null +++ b/sdk/bindings/ChangeNetworkResolveEvent.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { RequestFail } from "./RequestFail"; + +export interface ChangeNetworkResolveEvent { sessionId: string, requestId: string, newNetwork?: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/sdk/bindings/ChangeWalletEvent.ts b/sdk/bindings/ChangeWalletEvent.ts new file mode 100644 index 00000000..5901df65 --- /dev/null +++ b/sdk/bindings/ChangeWalletEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface ChangeWalletEvent { sessionId: string, requestId: string, network: string, walletName: string, walletType: string, oldWalletAddress: string, } \ No newline at end of file diff --git a/sdk/bindings/ChangeWalletResolveEvent.ts b/sdk/bindings/ChangeWalletResolveEvent.ts new file mode 100644 index 00000000..2f809fb8 --- /dev/null +++ b/sdk/bindings/ChangeWalletResolveEvent.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { RequestFail } from "./RequestFail"; + +export interface ChangeWalletResolveEvent { sessionId: string, requestId: string, newWalletAddress?: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/server/bindings/ClientConnectInitEvent.ts b/sdk/bindings/ClientConnectEvent.ts similarity index 52% rename from server/bindings/ClientConnectInitEvent.ts rename to sdk/bindings/ClientConnectEvent.ts index d1ed7726..4378e6e5 100644 --- a/server/bindings/ClientConnectInitEvent.ts +++ b/sdk/bindings/ClientConnectEvent.ts @@ -1,4 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { SessionType } from "./SessionType"; -export interface ClientConnectInitEvent { clientId: string, sessionId: string, walletName: string, walletType: string, sessionType: SessionType, } \ No newline at end of file +export interface ClientConnectEvent { clientId: string, sessionId: string, walletName: string, walletType: string, sessionType: SessionType, } \ No newline at end of file diff --git a/sdk/bindings/ClientConnectResolveEvent.ts b/sdk/bindings/ClientConnectResolveEvent.ts new file mode 100644 index 00000000..dd86834f --- /dev/null +++ b/sdk/bindings/ClientConnectResolveEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface ClientConnectResolveEvent { clientId: string, sessionId: string, addresses: Array, walletName: string, walletType: string, success: boolean, } \ No newline at end of file diff --git a/sdk/bindings/ClientDisconnectEvent.ts b/sdk/bindings/ClientDisconnectEvent.ts new file mode 100644 index 00000000..c969f18c --- /dev/null +++ b/sdk/bindings/ClientDisconnectEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface ClientDisconnectEvent { clientId: string, disconnectedSessionId: string, } \ No newline at end of file diff --git a/sdk/bindings/CloudApiErrors.ts b/sdk/bindings/CloudApiErrors.ts new file mode 100644 index 00000000..09aa1d84 --- /dev/null +++ b/sdk/bindings/CloudApiErrors.ts @@ -0,0 +1,53 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type CloudApiErrors = + | 'TeamDoesNotExist' + | 'UserDoesNotExist' + | 'CloudFeatureDisabled' + | 'InsufficientPermissions' + | 'TeamHasNoRegisteredApps' + | 'DatabaseError' + | 'MaximumUsersPerTeamReached' + | 'UserAlreadyBelongsToTheTeam' + | 'IncorrectPassword' + | 'AccessTokenFailure' + | 'RefreshTokenFailure' + | 'AppAlreadyExists' + | 'MaximumAppsPerTeamReached' + | 'TeamAlreadyExists' + | 'PersonalTeamAlreadyExists' + | 'EmailAlreadyExists' + | 'InternalServerError' + | 'UserDoesNotBelongsToTheTeam' + | 'InvalidName' + | 'UnauthorizedOriginError' + | 'AppDoesNotExist' + | 'UserAlreadyInvitedToTheTeam' + | 'MaximumInvitesPerTeamReached' + | 'InviteNotFound' + | 'ActionForbiddenForPersonalTeam' + | 'InviteDoesNotExist' + | 'InvalidPaginationCursor' + | 'InvalidOrExpiredVerificationCode' + | 'InvalidOrExpiredAuthCode' + | 'InvalidDomainName' + | 'DomainAlreadyVerified' + | 'DomainVerificationFailure' + | 'DomainNotFound' + | 'DomainVerificationNotStarted' + | 'DomainAlreadyVerifiedByAnotherApp' + | 'NoPendingDomainVerification' + | 'WebAuthnError' + | 'PasswordNotSet' + | 'UserDoesNotHavePasskey' + | 'PasskeyAlreadyExists' + | 'InvalidPasskeyCredential' + | 'PasskeyDoesNotExist' + | 'FailedToCreateTeam' + | 'DashboardImportFail' + | 'OriginHeaderRequired' + | 'InvalidOrigin' + | 'InvalidAction' + | 'AdminCannotLeaveTeam' + | 'GrafanaError' + | 'TeamWithoutGrafanaId' diff --git a/sdk/bindings/DeviceMetadata.ts b/sdk/bindings/DeviceMetadata.ts new file mode 100644 index 00000000..29d829b7 --- /dev/null +++ b/sdk/bindings/DeviceMetadata.ts @@ -0,0 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { MobileMetadata } from "./MobileMetadata"; +import type { WebMetadata } from "./WebMetadata"; + +export type DeviceMetadata = { mobile: MobileMetadata } | { web: WebMetadata } | "unknown"; \ No newline at end of file diff --git a/sdk/bindings/DomainVerificationStatus.ts b/sdk/bindings/DomainVerificationStatus.ts new file mode 100644 index 00000000..d8437c5f --- /dev/null +++ b/sdk/bindings/DomainVerificationStatus.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type DomainVerificationStatus = "Pending" | "Verified" | "Cancelled"; \ No newline at end of file diff --git a/sdk/bindings/EventData.ts b/sdk/bindings/EventData.ts new file mode 100644 index 00000000..cc8c85b1 --- /dev/null +++ b/sdk/bindings/EventData.ts @@ -0,0 +1,18 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { AppConnectEvent } from "./AppConnectEvent"; +import type { AppDisconnectEvent } from "./AppDisconnectEvent"; +import type { ChangeNetworkEvent } from "./ChangeNetworkEvent"; +import type { ChangeNetworkResolveEvent } from "./ChangeNetworkResolveEvent"; +import type { ChangeWalletEvent } from "./ChangeWalletEvent"; +import type { ChangeWalletResolveEvent } from "./ChangeWalletResolveEvent"; +import type { ClientConnectEvent } from "./ClientConnectEvent"; +import type { ClientConnectResolveEvent } from "./ClientConnectResolveEvent"; +import type { ClientDisconnectEvent } from "./ClientDisconnectEvent"; +import type { SignAndSendTransactionEvent } from "./SignAndSendTransactionEvent"; +import type { SignAndSendTransactionResolveEvent } from "./SignAndSendTransactionResolveEvent"; +import type { SignMessageEvent } from "./SignMessageEvent"; +import type { SignMessageResolveEvent } from "./SignMessageResolveEvent"; +import type { SignTransactionEvent } from "./SignTransactionEvent"; +import type { SignTransactionResolveEvent } from "./SignTransactionResolveEvent"; + +export type EventData = { type: "AppConnect" } & AppConnectEvent | { type: "AppDisconnect" } & AppDisconnectEvent | { type: "ClientConnect" } & ClientConnectEvent | { type: "ClientConnectResolve" } & ClientConnectResolveEvent | { type: "ClientDisconnect" } & ClientDisconnectEvent | { type: "SignMessage" } & SignMessageEvent | { type: "SignMessageResolve" } & SignMessageResolveEvent | { type: "SignTransaction" } & SignTransactionEvent | { type: "SignTransactionResolve" } & SignTransactionResolveEvent | { type: "SignAndSendTransaction" } & SignAndSendTransactionEvent | { type: "SignAndSendTransactionResolve" } & SignAndSendTransactionResolveEvent | { type: "ChangeNetwork" } & ChangeNetworkEvent | { type: "ChangeNetworkResolve" } & ChangeNetworkResolveEvent | { type: "ChangeWallet" } & ChangeWalletEvent | { type: "ChangeWalletResolve" } & ChangeWalletResolveEvent; \ No newline at end of file diff --git a/sdk/bindings/EventType.ts b/sdk/bindings/EventType.ts new file mode 100644 index 00000000..0cb8b578 --- /dev/null +++ b/sdk/bindings/EventType.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type EventType = "AppConnect" | "AppDisconnect" | "ClientConnect" | "ClientDisconnect" | "SignMessage" | "SignTransaction" | "SignAndSendTransaction" | "ChangeWallet" | "ChangeNetwork"; \ No newline at end of file diff --git a/sdk/bindings/HttpAcceptTeamInviteRequest.ts b/sdk/bindings/HttpAcceptTeamInviteRequest.ts new file mode 100644 index 00000000..00337cfc --- /dev/null +++ b/sdk/bindings/HttpAcceptTeamInviteRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpAcceptTeamInviteRequest { teamId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpAcceptTeamInviteResponse.ts b/sdk/bindings/HttpAcceptTeamInviteResponse.ts new file mode 100644 index 00000000..0bdf4a41 --- /dev/null +++ b/sdk/bindings/HttpAcceptTeamInviteResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpAcceptTeamInviteResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpAddPasskeyFinishResponse.ts b/sdk/bindings/HttpAddPasskeyFinishResponse.ts new file mode 100644 index 00000000..0595e675 --- /dev/null +++ b/sdk/bindings/HttpAddPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpAddPasskeyFinishResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpCancelPendingDomainVerificationRequest.ts b/sdk/bindings/HttpCancelPendingDomainVerificationRequest.ts new file mode 100644 index 00000000..f3907cda --- /dev/null +++ b/sdk/bindings/HttpCancelPendingDomainVerificationRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpCancelPendingDomainVerificationRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpCancelPendingDomainVerificationResponse.ts b/sdk/bindings/HttpCancelPendingDomainVerificationResponse.ts new file mode 100644 index 00000000..7dbbb62d --- /dev/null +++ b/sdk/bindings/HttpCancelPendingDomainVerificationResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpCancelPendingDomainVerificationResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpCancelTeamUserInviteRequest.ts b/sdk/bindings/HttpCancelTeamUserInviteRequest.ts new file mode 100644 index 00000000..be2e71b3 --- /dev/null +++ b/sdk/bindings/HttpCancelTeamUserInviteRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpCancelTeamUserInviteRequest { teamId: string, userEmail: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpCancelTeamUserInviteResponse.ts b/sdk/bindings/HttpCancelTeamUserInviteResponse.ts new file mode 100644 index 00000000..d59fda24 --- /dev/null +++ b/sdk/bindings/HttpCancelTeamUserInviteResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpCancelTeamUserInviteResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpCancelUserTeamInviteRequest.ts b/sdk/bindings/HttpCancelUserTeamInviteRequest.ts new file mode 100644 index 00000000..3200f7d0 --- /dev/null +++ b/sdk/bindings/HttpCancelUserTeamInviteRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpCancelUserTeamInviteRequest { teamId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpCancelUserTeamInviteResponse.ts b/sdk/bindings/HttpCancelUserTeamInviteResponse.ts new file mode 100644 index 00000000..3f891ae5 --- /dev/null +++ b/sdk/bindings/HttpCancelUserTeamInviteResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpCancelUserTeamInviteResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpChangeUsersPrivilegesRequest.ts b/sdk/bindings/HttpChangeUsersPrivilegesRequest.ts new file mode 100644 index 00000000..3cf06666 --- /dev/null +++ b/sdk/bindings/HttpChangeUsersPrivilegesRequest.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { PrivilegeChange } from "./PrivilegeChange"; + +export interface HttpChangeUsersPrivilegesRequest { teamId: string, privilegesChanges: Array, } \ No newline at end of file diff --git a/sdk/bindings/HttpChangeUsersPrivilegesResponse.ts b/sdk/bindings/HttpChangeUsersPrivilegesResponse.ts new file mode 100644 index 00000000..ecdc7535 --- /dev/null +++ b/sdk/bindings/HttpChangeUsersPrivilegesResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpChangeUsersPrivilegesResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpCloudEndpoint.ts b/sdk/bindings/HttpCloudEndpoint.ts new file mode 100644 index 00000000..26ee84a8 --- /dev/null +++ b/sdk/bindings/HttpCloudEndpoint.ts @@ -0,0 +1,46 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpCloudEndpoint = + | '/register_new_app' + | '/register_with_password_start' + | '/register_with_password_finish' + | '/login_with_password' + | '/login_with_google' + | '/refresh_token' + | '/register_new_team' + | '/remove_user_from_team' + | '/get_user_joined_teams' + | '/events' + | '/invite_user_to_team' + | '/accept_team_invite' + | '/get_team_user_invites' + | '/get_user_team_invites' + | '/cancel_team_user_invite' + | '/cancel_user_team_invite' + | '/get_app_events' + | '/reset_password_start' + | '/reset_password_finish' + | '/verify_domain_start' + | '/verify_domain_finish' + | '/remove_whitelisted_domain' + | '/cancel_pending_domain_verification' + | '/register_with_passkey_start' + | '/register_with_passkey_finish' + | '/reset_passkey_start' + | '/reset_passkey_finish' + | '/get_passkey_challenge' + | '/delete_passkey' + | '/add_passkey_start' + | '/add_passkey_finish' + | '/get_user_metadata' + | '/get_team_metadata' + | '/get_team_users_privileges' + | '/change_user_privileges' + | '/login_with_passkey_start' + | '/login_with_passkey_finish' + | '/verify_code' + | '/leave_team' + | '/delete_app' + | '/delete_team' + | '/delete_account_start' + | '/delete_account_finish' diff --git a/sdk/bindings/HttpDeleteAccountFinishRequest.ts b/sdk/bindings/HttpDeleteAccountFinishRequest.ts new file mode 100644 index 00000000..415d900f --- /dev/null +++ b/sdk/bindings/HttpDeleteAccountFinishRequest.ts @@ -0,0 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteAccountFinishRequest { + authCode: string +} diff --git a/sdk/bindings/HttpDeleteAccountStartRequest.ts b/sdk/bindings/HttpDeleteAccountStartRequest.ts new file mode 100644 index 00000000..f6bfabe2 --- /dev/null +++ b/sdk/bindings/HttpDeleteAccountStartRequest.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteAccountStartRequest { + device: string + browser: string +} diff --git a/sdk/bindings/HttpDeleteAppRequest.ts b/sdk/bindings/HttpDeleteAppRequest.ts new file mode 100644 index 00000000..16cbfebc --- /dev/null +++ b/sdk/bindings/HttpDeleteAppRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteAppRequest { appId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpDeleteTeamRequest.ts b/sdk/bindings/HttpDeleteTeamRequest.ts new file mode 100644 index 00000000..7ccb9b06 --- /dev/null +++ b/sdk/bindings/HttpDeleteTeamRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteTeamRequest { teamId: string, } \ No newline at end of file diff --git a/server/bindings/HttpGetAppEventsEventRequest.ts b/sdk/bindings/HttpGetAppEventsRequest.ts similarity index 62% rename from server/bindings/HttpGetAppEventsEventRequest.ts rename to sdk/bindings/HttpGetAppEventsRequest.ts index c45ef3ea..610297b0 100644 --- a/server/bindings/HttpGetAppEventsEventRequest.ts +++ b/sdk/bindings/HttpGetAppEventsRequest.ts @@ -1,4 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { PaginationCursor } from "./PaginationCursor"; -export interface HttpGetAppEventsEventRequest { appId: string, paginationCursor?: PaginationCursor, } \ No newline at end of file +export interface HttpGetAppEventsRequest { appId: string, paginationCursor?: PaginationCursor, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetAppEventsResponse.ts b/sdk/bindings/HttpGetAppEventsResponse.ts new file mode 100644 index 00000000..6ab85ff7 --- /dev/null +++ b/sdk/bindings/HttpGetAppEventsResponse.ts @@ -0,0 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { AppEvent } from "./AppEvent"; +import type { PaginationCursor } from "./PaginationCursor"; + +export interface HttpGetAppEventsResponse { events: Array, cursor: PaginationCursor | null, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetTeamMetadataRequest.ts b/sdk/bindings/HttpGetTeamMetadataRequest.ts new file mode 100644 index 00000000..3f8711c0 --- /dev/null +++ b/sdk/bindings/HttpGetTeamMetadataRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpGetTeamMetadataRequest { teamId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetTeamMetadataResponse.ts b/sdk/bindings/HttpGetTeamMetadataResponse.ts new file mode 100644 index 00000000..288e1f6c --- /dev/null +++ b/sdk/bindings/HttpGetTeamMetadataResponse.ts @@ -0,0 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { AppInfo } from "./AppInfo"; +import type { TeamMetadata } from "./TeamMetadata"; + +export interface HttpGetTeamMetadataResponse { teamMetadata: TeamMetadata, teamApps: Array, teamMembers: Array, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetTeamUserInvitesRequest.ts b/sdk/bindings/HttpGetTeamUserInvitesRequest.ts new file mode 100644 index 00000000..4b641992 --- /dev/null +++ b/sdk/bindings/HttpGetTeamUserInvitesRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpGetTeamUserInvitesRequest { teamId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetTeamUserInvitesResponse.ts b/sdk/bindings/HttpGetTeamUserInvitesResponse.ts new file mode 100644 index 00000000..8110bfe9 --- /dev/null +++ b/sdk/bindings/HttpGetTeamUserInvitesResponse.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { TeamInvite } from "./TeamInvite"; + +export interface HttpGetTeamUserInvitesResponse { teamInvites: Array, } \ No newline at end of file diff --git a/server/bindings/MessageToSign.ts b/sdk/bindings/HttpGetTeamUsersPrivilegesRequest.ts similarity index 64% rename from server/bindings/MessageToSign.ts rename to sdk/bindings/HttpGetTeamUsersPrivilegesRequest.ts index c5933b0b..0c3d35f6 100644 --- a/server/bindings/MessageToSign.ts +++ b/sdk/bindings/HttpGetTeamUsersPrivilegesRequest.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface MessageToSign { message: string, metadata?: string, } \ No newline at end of file +export interface HttpGetTeamUsersPrivilegesRequest { teamId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetTeamUsersPrivilegesResponse.ts b/sdk/bindings/HttpGetTeamUsersPrivilegesResponse.ts new file mode 100644 index 00000000..5a2d81d8 --- /dev/null +++ b/sdk/bindings/HttpGetTeamUsersPrivilegesResponse.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { TeamUserPrivilege } from "./TeamUserPrivilege"; + +export interface HttpGetTeamUsersPrivilegesResponse { usersPrivileges: Array, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetUserJoinedTeamsResponse.ts b/sdk/bindings/HttpGetUserJoinedTeamsResponse.ts new file mode 100644 index 00000000..6da348ce --- /dev/null +++ b/sdk/bindings/HttpGetUserJoinedTeamsResponse.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { AppInfo } from "./AppInfo"; +import type { JoinedTeam } from "./JoinedTeam"; +import type { UserPrivilege } from "./UserPrivilege"; + +export interface HttpGetUserJoinedTeamsResponse { teams: Record, teamsApps: Record>, userPrivileges: Record>, teamMembers: Record>, } \ No newline at end of file diff --git a/sdk/bindings/HttpGetUserTeamInvitesResponse.ts b/sdk/bindings/HttpGetUserTeamInvitesResponse.ts new file mode 100644 index 00000000..a996333f --- /dev/null +++ b/sdk/bindings/HttpGetUserTeamInvitesResponse.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { TeamInvite } from "./TeamInvite"; + +export interface HttpGetUserTeamInvitesResponse { teamInvites: Array, } \ No newline at end of file diff --git a/sdk/bindings/HttpInviteUserToTeamRequest.ts b/sdk/bindings/HttpInviteUserToTeamRequest.ts new file mode 100644 index 00000000..a11a6be0 --- /dev/null +++ b/sdk/bindings/HttpInviteUserToTeamRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpInviteUserToTeamRequest { teamId: string, userEmail: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpInviteUserToTeamResponse.ts b/sdk/bindings/HttpInviteUserToTeamResponse.ts new file mode 100644 index 00000000..2b278664 --- /dev/null +++ b/sdk/bindings/HttpInviteUserToTeamResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpInviteUserToTeamResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpLeaveTeamRequest.ts b/sdk/bindings/HttpLeaveTeamRequest.ts new file mode 100644 index 00000000..aeb2ef55 --- /dev/null +++ b/sdk/bindings/HttpLeaveTeamRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLeaveTeamRequest { teamId: string, device: string, browser: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpLeaveTeamResponse.ts b/sdk/bindings/HttpLeaveTeamResponse.ts new file mode 100644 index 00000000..abf576a1 --- /dev/null +++ b/sdk/bindings/HttpLeaveTeamResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpLeaveTeamResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpLoginRequest.ts b/sdk/bindings/HttpLoginRequest.ts new file mode 100644 index 00000000..21e8dfbc --- /dev/null +++ b/sdk/bindings/HttpLoginRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginRequest { email: string, password: string, enforceIp: boolean, } \ No newline at end of file diff --git a/sdk/bindings/HttpLoginResponse.ts b/sdk/bindings/HttpLoginResponse.ts new file mode 100644 index 00000000..222f4049 --- /dev/null +++ b/sdk/bindings/HttpLoginResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpLoginWithGoogleRequest.ts b/sdk/bindings/HttpLoginWithGoogleRequest.ts new file mode 100644 index 00000000..3a3391be --- /dev/null +++ b/sdk/bindings/HttpLoginWithGoogleRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginWithGoogleRequest { oauthToken: string, email: string, enforceIp: boolean, } \ No newline at end of file diff --git a/sdk/bindings/HttpLoginWithGoogleResponse.ts b/sdk/bindings/HttpLoginWithGoogleResponse.ts new file mode 100644 index 00000000..001cae37 --- /dev/null +++ b/sdk/bindings/HttpLoginWithGoogleResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginWithGoogleResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpLoginWithPasskeyFinishResponse.ts b/sdk/bindings/HttpLoginWithPasskeyFinishResponse.ts new file mode 100644 index 00000000..e8d95372 --- /dev/null +++ b/sdk/bindings/HttpLoginWithPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginWithPasskeyFinishResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpLoginWithPasskeyStartRequest.ts b/sdk/bindings/HttpLoginWithPasskeyStartRequest.ts new file mode 100644 index 00000000..397c8102 --- /dev/null +++ b/sdk/bindings/HttpLoginWithPasskeyStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginWithPasskeyStartRequest { email: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpNightlyConnectCloudEvent.ts b/sdk/bindings/HttpNightlyConnectCloudEvent.ts new file mode 100644 index 00000000..5695fc82 --- /dev/null +++ b/sdk/bindings/HttpNightlyConnectCloudEvent.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { EventData } from "./EventData"; + +export interface HttpNightlyConnectCloudEvent { appId: string, network: string, event: EventData, } \ No newline at end of file diff --git a/server/bindings/HttpAddUserToTeamRequest.ts b/sdk/bindings/HttpRefreshRequest.ts similarity index 57% rename from server/bindings/HttpAddUserToTeamRequest.ts rename to sdk/bindings/HttpRefreshRequest.ts index 37c710e6..cb9c5bc8 100644 --- a/server/bindings/HttpAddUserToTeamRequest.ts +++ b/sdk/bindings/HttpRefreshRequest.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface HttpAddUserToTeamRequest { teamId: string, userEmail: string, } \ No newline at end of file +export interface HttpRefreshRequest { refreshToken: string, enforceIp: boolean, } \ No newline at end of file diff --git a/sdk/bindings/HttpRefreshResponse.ts b/sdk/bindings/HttpRefreshResponse.ts new file mode 100644 index 00000000..0f29c9b7 --- /dev/null +++ b/sdk/bindings/HttpRefreshResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRefreshResponse { authToken: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterNewAppRequest.ts b/sdk/bindings/HttpRegisterNewAppRequest.ts new file mode 100644 index 00000000..be77a7fe --- /dev/null +++ b/sdk/bindings/HttpRegisterNewAppRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterNewAppRequest { teamId: string, appName: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterNewAppResponse.ts b/sdk/bindings/HttpRegisterNewAppResponse.ts new file mode 100644 index 00000000..79bfb3d7 --- /dev/null +++ b/sdk/bindings/HttpRegisterNewAppResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterNewAppResponse { appId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterNewTeamRequest.ts b/sdk/bindings/HttpRegisterNewTeamRequest.ts new file mode 100644 index 00000000..af263fc4 --- /dev/null +++ b/sdk/bindings/HttpRegisterNewTeamRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterNewTeamRequest { teamName: string, personal: boolean, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterNewTeamResponse.ts b/sdk/bindings/HttpRegisterNewTeamResponse.ts new file mode 100644 index 00000000..c73cfb55 --- /dev/null +++ b/sdk/bindings/HttpRegisterNewTeamResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterNewTeamResponse { teamId: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterWithPasskeyFinishResponse.ts b/sdk/bindings/HttpRegisterWithPasskeyFinishResponse.ts new file mode 100644 index 00000000..924e8671 --- /dev/null +++ b/sdk/bindings/HttpRegisterWithPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasskeyFinishResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterWithPasskeyStartRequest.ts b/sdk/bindings/HttpRegisterWithPasskeyStartRequest.ts new file mode 100644 index 00000000..8e83d13e --- /dev/null +++ b/sdk/bindings/HttpRegisterWithPasskeyStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasskeyStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterWithPasswordFinishRequest.ts b/sdk/bindings/HttpRegisterWithPasswordFinishRequest.ts new file mode 100644 index 00000000..0cd6254c --- /dev/null +++ b/sdk/bindings/HttpRegisterWithPasswordFinishRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasswordFinishRequest { email: string, newPassword: string, authCode: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterWithPasswordFinishResponse.ts b/sdk/bindings/HttpRegisterWithPasswordFinishResponse.ts new file mode 100644 index 00000000..533558d7 --- /dev/null +++ b/sdk/bindings/HttpRegisterWithPasswordFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpRegisterWithPasswordFinishResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterWithPasswordStartRequest.ts b/sdk/bindings/HttpRegisterWithPasswordStartRequest.ts new file mode 100644 index 00000000..c92d4b4a --- /dev/null +++ b/sdk/bindings/HttpRegisterWithPasswordStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasswordStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRegisterWithPasswordStartResponse.ts b/sdk/bindings/HttpRegisterWithPasswordStartResponse.ts new file mode 100644 index 00000000..dabf431f --- /dev/null +++ b/sdk/bindings/HttpRegisterWithPasswordStartResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpRegisterWithPasswordStartResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasswordRequest.ts b/sdk/bindings/HttpRemoveUserFromTeamRequest.ts similarity index 56% rename from server/bindings/HttpRegisterWithPasswordRequest.ts rename to sdk/bindings/HttpRemoveUserFromTeamRequest.ts index 6671dc07..01b3d83c 100644 --- a/server/bindings/HttpRegisterWithPasswordRequest.ts +++ b/sdk/bindings/HttpRemoveUserFromTeamRequest.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface HttpRegisterWithPasswordRequest { email: string, password: string, } \ No newline at end of file +export interface HttpRemoveUserFromTeamRequest { teamId: string, userEmail: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRemoveUserFromTeamResponse.ts b/sdk/bindings/HttpRemoveUserFromTeamResponse.ts new file mode 100644 index 00000000..9d3fd9a5 --- /dev/null +++ b/sdk/bindings/HttpRemoveUserFromTeamResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpRemoveUserFromTeamResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpRemoveWhitelistedDomainRequest.ts b/sdk/bindings/HttpRemoveWhitelistedDomainRequest.ts new file mode 100644 index 00000000..5652a06b --- /dev/null +++ b/sdk/bindings/HttpRemoveWhitelistedDomainRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRemoveWhitelistedDomainRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpRemoveWhitelistedDomainResponse.ts b/sdk/bindings/HttpRemoveWhitelistedDomainResponse.ts new file mode 100644 index 00000000..f6f2eaf7 --- /dev/null +++ b/sdk/bindings/HttpRemoveWhitelistedDomainResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpRemoveWhitelistedDomainResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpResetPasskeyFinishResponse.ts b/sdk/bindings/HttpResetPasskeyFinishResponse.ts new file mode 100644 index 00000000..c9174c9d --- /dev/null +++ b/sdk/bindings/HttpResetPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpResetPasskeyFinishResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpResetPasskeyStartRequest.ts b/sdk/bindings/HttpResetPasskeyStartRequest.ts new file mode 100644 index 00000000..9ff2d2ef --- /dev/null +++ b/sdk/bindings/HttpResetPasskeyStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpResetPasskeyStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpResetPasswordFinishRequest.ts b/sdk/bindings/HttpResetPasswordFinishRequest.ts new file mode 100644 index 00000000..820ee66b --- /dev/null +++ b/sdk/bindings/HttpResetPasswordFinishRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpResetPasswordFinishRequest { email: string, newPassword: string, authCode: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpResetPasswordFinishResponse.ts b/sdk/bindings/HttpResetPasswordFinishResponse.ts new file mode 100644 index 00000000..941dfe57 --- /dev/null +++ b/sdk/bindings/HttpResetPasswordFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpResetPasswordFinishResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpResetPasswordStartRequest.ts b/sdk/bindings/HttpResetPasswordStartRequest.ts new file mode 100644 index 00000000..9cda4fb3 --- /dev/null +++ b/sdk/bindings/HttpResetPasswordStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpResetPasswordStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpResetPasswordStartResponse.ts b/sdk/bindings/HttpResetPasswordStartResponse.ts new file mode 100644 index 00000000..fe2df9e4 --- /dev/null +++ b/sdk/bindings/HttpResetPasswordStartResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpResetPasswordStartResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpUserMetadataResponse.ts b/sdk/bindings/HttpUserMetadataResponse.ts new file mode 100644 index 00000000..53a7c630 --- /dev/null +++ b/sdk/bindings/HttpUserMetadataResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpUserMetadataResponse { userId: string, email: string, passwordSet: boolean, passkeyIds: Array, } \ No newline at end of file diff --git a/sdk/bindings/HttpVerifyCodeRequest.ts b/sdk/bindings/HttpVerifyCodeRequest.ts new file mode 100644 index 00000000..09fa72f1 --- /dev/null +++ b/sdk/bindings/HttpVerifyCodeRequest.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { VerificationAction } from "./VerificationAction"; + +export interface HttpVerifyCodeRequest { email: string, code: string, action: VerificationAction, } \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasswordResponse.ts b/sdk/bindings/HttpVerifyCodeResponse.ts similarity index 64% rename from server/bindings/HttpRegisterWithPasswordResponse.ts rename to sdk/bindings/HttpVerifyCodeResponse.ts index ac9570c3..50252c32 100644 --- a/server/bindings/HttpRegisterWithPasswordResponse.ts +++ b/sdk/bindings/HttpVerifyCodeResponse.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface HttpRegisterWithPasswordResponse { userId: string, } \ No newline at end of file +export interface HttpVerifyCodeResponse { verificationCode: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpVerifyDomainFinishRequest.ts b/sdk/bindings/HttpVerifyDomainFinishRequest.ts new file mode 100644 index 00000000..7f57b548 --- /dev/null +++ b/sdk/bindings/HttpVerifyDomainFinishRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpVerifyDomainFinishRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpVerifyDomainFinishResponse.ts b/sdk/bindings/HttpVerifyDomainFinishResponse.ts new file mode 100644 index 00000000..f8077043 --- /dev/null +++ b/sdk/bindings/HttpVerifyDomainFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpVerifyDomainFinishResponse = null; \ No newline at end of file diff --git a/sdk/bindings/HttpVerifyDomainStartRequest.ts b/sdk/bindings/HttpVerifyDomainStartRequest.ts new file mode 100644 index 00000000..4b1a9cb2 --- /dev/null +++ b/sdk/bindings/HttpVerifyDomainStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpVerifyDomainStartRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/sdk/bindings/HttpVerifyDomainStartResponse.ts b/sdk/bindings/HttpVerifyDomainStartResponse.ts new file mode 100644 index 00000000..65ec29bb --- /dev/null +++ b/sdk/bindings/HttpVerifyDomainStartResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpVerifyDomainStartResponse { code: string, } \ No newline at end of file diff --git a/sdk/bindings/InitializeRequest.ts b/sdk/bindings/InitializeRequest.ts index be71606c..e51358f6 100644 --- a/sdk/bindings/InitializeRequest.ts +++ b/sdk/bindings/InitializeRequest.ts @@ -3,4 +3,4 @@ import type { AppMetadata } from "./AppMetadata"; import type { Network } from "./Network"; import type { Version } from "./Version"; -export interface InitializeRequest { responseId: string, appMetadata: AppMetadata, network: Network, version: Version, persistent: boolean, persistentSessionId?: string, } \ No newline at end of file +export interface InitializeRequest { responseId: string, appMetadata: AppMetadata, network: Network, version: Version, persistent: boolean, persistentSessionId?: string, appId?: string, } \ No newline at end of file diff --git a/sdk/bindings/InitializeResponse.ts b/sdk/bindings/InitializeResponse.ts index 2558a34c..ffecc061 100644 --- a/sdk/bindings/InitializeResponse.ts +++ b/sdk/bindings/InitializeResponse.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface InitializeResponse { responseId: string, sessionId: string, createdNew: boolean, publicKeys: Array, metadata?: string, } \ No newline at end of file +export interface InitializeResponse { responseId: string, sessionId: string, createdNew: boolean, publicKeys: Array, metadata?: string, appId: string, } \ No newline at end of file diff --git a/sdk/bindings/JoinedTeam.ts b/sdk/bindings/JoinedTeam.ts new file mode 100644 index 00000000..fa7345c0 --- /dev/null +++ b/sdk/bindings/JoinedTeam.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface JoinedTeam { teamId: string, teamName: string, creatorEmail: string, createdAt: string, joinedAt: string, personal: boolean, } \ No newline at end of file diff --git a/sdk/bindings/MobileMetadata.ts b/sdk/bindings/MobileMetadata.ts new file mode 100644 index 00000000..dbece775 --- /dev/null +++ b/sdk/bindings/MobileMetadata.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Device } from "./Device"; + +export interface MobileMetadata { system: Device, version: string, } \ No newline at end of file diff --git a/sdk/bindings/NewUserPrivilegeLevel.ts b/sdk/bindings/NewUserPrivilegeLevel.ts new file mode 100644 index 00000000..9e04e946 --- /dev/null +++ b/sdk/bindings/NewUserPrivilegeLevel.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type NewUserPrivilegeLevel = "read" | "edit" | "noAccess"; \ No newline at end of file diff --git a/sdk/bindings/PaginationCursor.ts b/sdk/bindings/PaginationCursor.ts new file mode 100644 index 00000000..d580da1f --- /dev/null +++ b/sdk/bindings/PaginationCursor.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type PaginationCursor = string; \ No newline at end of file diff --git a/sdk/bindings/PrivilegeChange.ts b/sdk/bindings/PrivilegeChange.ts new file mode 100644 index 00000000..eb306ac2 --- /dev/null +++ b/sdk/bindings/PrivilegeChange.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { NewUserPrivilegeLevel } from "./NewUserPrivilegeLevel"; + +export interface PrivilegeChange { appId: string, userEmail: string, newPrivilegeLevel: NewUserPrivilegeLevel, } \ No newline at end of file diff --git a/sdk/bindings/PrivilegeLevel.ts b/sdk/bindings/PrivilegeLevel.ts new file mode 100644 index 00000000..3ea85174 --- /dev/null +++ b/sdk/bindings/PrivilegeLevel.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type PrivilegeLevel = "Read" | "Edit" | "Admin"; \ No newline at end of file diff --git a/sdk/bindings/RequestFail.ts b/sdk/bindings/RequestFail.ts new file mode 100644 index 00000000..cac93c72 --- /dev/null +++ b/sdk/bindings/RequestFail.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type RequestFail = "Rejected" | "TimedOut"; \ No newline at end of file diff --git a/sdk/bindings/RequestType.ts b/sdk/bindings/RequestType.ts new file mode 100644 index 00000000..6f0af009 --- /dev/null +++ b/sdk/bindings/RequestType.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type RequestType = "SignMessage" | "SignTransaction" | "SignAndSendTransaction" | "ChangeWallet" | "ChangeNetwork"; \ No newline at end of file diff --git a/sdk/bindings/SessionType.ts b/sdk/bindings/SessionType.ts new file mode 100644 index 00000000..7fa7f684 --- /dev/null +++ b/sdk/bindings/SessionType.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type SessionType = "Extension" | "Relay"; \ No newline at end of file diff --git a/sdk/bindings/SignAndSendTransactionEvent.ts b/sdk/bindings/SignAndSendTransactionEvent.ts new file mode 100644 index 00000000..e713f047 --- /dev/null +++ b/sdk/bindings/SignAndSendTransactionEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface SignAndSendTransactionEvent { sessionId: string, requestId: string, network: string, } \ No newline at end of file diff --git a/sdk/bindings/SignAndSendTransactionResolveEvent.ts b/sdk/bindings/SignAndSendTransactionResolveEvent.ts new file mode 100644 index 00000000..5fa3a25a --- /dev/null +++ b/sdk/bindings/SignAndSendTransactionResolveEvent.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { RequestFail } from "./RequestFail"; + +export interface SignAndSendTransactionResolveEvent { sessionId: string, requestId: string, txHash?: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/sdk/bindings/SignMessageEvent.ts b/sdk/bindings/SignMessageEvent.ts new file mode 100644 index 00000000..78195313 --- /dev/null +++ b/sdk/bindings/SignMessageEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface SignMessageEvent { sessionId: string, requestId: string, network: string, } \ No newline at end of file diff --git a/server/bindings/RequestResolvedEvent.ts b/sdk/bindings/SignMessageResolveEvent.ts similarity index 59% rename from server/bindings/RequestResolvedEvent.ts rename to sdk/bindings/SignMessageResolveEvent.ts index 4cdd3a2a..3c3eb68f 100644 --- a/server/bindings/RequestResolvedEvent.ts +++ b/sdk/bindings/SignMessageResolveEvent.ts @@ -1,4 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { RequestFail } from "./RequestFail"; -export interface RequestResolvedEvent { sessionId: string, requestId: string, failureReason?: RequestFail, } \ No newline at end of file +export interface SignMessageResolveEvent { sessionId: string, requestId: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/sdk/bindings/SignTransactionEvent.ts b/sdk/bindings/SignTransactionEvent.ts new file mode 100644 index 00000000..143f726f --- /dev/null +++ b/sdk/bindings/SignTransactionEvent.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface SignTransactionEvent { sessionId: string, requestId: string, network: string, } \ No newline at end of file diff --git a/sdk/bindings/SignTransactionResolveEvent.ts b/sdk/bindings/SignTransactionResolveEvent.ts new file mode 100644 index 00000000..19087fe4 --- /dev/null +++ b/sdk/bindings/SignTransactionResolveEvent.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { RequestFail } from "./RequestFail"; + +export interface SignTransactionResolveEvent { sessionId: string, requestId: string, txHash?: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/sdk/bindings/Subscription.ts b/sdk/bindings/Subscription.ts new file mode 100644 index 00000000..92218529 --- /dev/null +++ b/sdk/bindings/Subscription.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface Subscription { subscription_type: string, valid_from: bigint, valid_till: bigint, } \ No newline at end of file diff --git a/sdk/bindings/TeamInvite.ts b/sdk/bindings/TeamInvite.ts new file mode 100644 index 00000000..c926ac10 --- /dev/null +++ b/sdk/bindings/TeamInvite.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface TeamInvite { teamId: string, creatorEmail: string, teamName: string, userEmail: string, createdAt: string, } \ No newline at end of file diff --git a/sdk/bindings/TeamMetadata.ts b/sdk/bindings/TeamMetadata.ts new file mode 100644 index 00000000..f03a7acf --- /dev/null +++ b/sdk/bindings/TeamMetadata.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface TeamMetadata { creatorEmail: string, teamId: string, teamName: string, personalTeam: boolean, createdAt: string, } \ No newline at end of file diff --git a/sdk/bindings/TeamUserPrivilege.ts b/sdk/bindings/TeamUserPrivilege.ts new file mode 100644 index 00000000..714a2c9a --- /dev/null +++ b/sdk/bindings/TeamUserPrivilege.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { PrivilegeLevel } from "./PrivilegeLevel"; + +export interface TeamUserPrivilege { appId: string, userEmail: string, privilege: PrivilegeLevel, } \ No newline at end of file diff --git a/sdk/bindings/UserPrivilege.ts b/sdk/bindings/UserPrivilege.ts new file mode 100644 index 00000000..c81dade8 --- /dev/null +++ b/sdk/bindings/UserPrivilege.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { PrivilegeLevel } from "./PrivilegeLevel"; + +export interface UserPrivilege { appId: string, grantedAt: string, privilege: PrivilegeLevel, } \ No newline at end of file diff --git a/sdk/bindings/VerificationAction.ts b/sdk/bindings/VerificationAction.ts new file mode 100644 index 00000000..aa133d19 --- /dev/null +++ b/sdk/bindings/VerificationAction.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type VerificationAction = + | 'registerPassword' + | 'registerPasskey' + | 'resetPassword' + | 'resetPasskey' + | 'deleteAccount' diff --git a/sdk/bindings/WebMetadata.ts b/sdk/bindings/WebMetadata.ts new file mode 100644 index 00000000..821d4462 --- /dev/null +++ b/sdk/bindings/WebMetadata.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface WebMetadata { browser: string, browserVersion: string, os: string, osVersion: string, } \ No newline at end of file diff --git a/sdk/bindings/WhitelistedDomain.ts b/sdk/bindings/WhitelistedDomain.ts new file mode 100644 index 00000000..401700b1 --- /dev/null +++ b/sdk/bindings/WhitelistedDomain.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { DomainVerificationStatus } from "./DomainVerificationStatus"; + +export interface WhitelistedDomain { domain: string, status: DomainVerificationStatus, } \ No newline at end of file diff --git a/sdk/bindings/index.ts b/sdk/bindings/index.ts new file mode 100644 index 00000000..2aacfb35 --- /dev/null +++ b/sdk/bindings/index.ts @@ -0,0 +1,164 @@ +// This file was auto-generated by bindings script. Do not edit this file manually. +export * from './AckMessage' +export * from './AlreadyConnected' +export * from './AppConnectEvent' +export * from './AppDisconnectEvent' +export * from './AppDisconnectedEvent' +export * from './AppEvent' +export * from './AppInfo' +export * from './AppLinks' +export * from './AppMetadata' +export * from './AppToServer' +export * from './ChangeNetworkEvent' +export * from './ChangeNetworkResolveEvent' +export * from './ChangeWalletEvent' +export * from './ChangeWalletResolveEvent' +export * from './ClientConnectEvent' +export * from './ClientConnectResolveEvent' +export * from './ClientDisconnectEvent' +export * from './ClientInitializeRequest' +export * from './ClientInitializeResponse' +export * from './ClientToServer' +export * from './CloudApiErrors' +export * from './ConnectRequest' +export * from './ConnectResponse' +export * from './Deeplink' +export * from './Device' +export * from './DeviceMetadata' +export * from './DomainVerificationStatus' +export * from './DropSessionsRequest' +export * from './DropSessionsResponse' +export * from './ErrorMessage' +export * from './EventData' +export * from './EventType' +export * from './GetInfoRequest' +export * from './GetInfoResponse' +export * from './GetPendingRequestsRequest' +export * from './GetPendingRequestsResponse' +export * from './GetSessionsRequest' +export * from './GetSessionsResponse' +export * from './HttpAcceptTeamInviteRequest' +export * from './HttpAcceptTeamInviteResponse' +export * from './HttpAddPasskeyFinishResponse' +export * from './HttpCancelPendingDomainVerificationRequest' +export * from './HttpCancelPendingDomainVerificationResponse' +export * from './HttpCancelTeamUserInviteRequest' +export * from './HttpCancelTeamUserInviteResponse' +export * from './HttpCancelUserTeamInviteRequest' +export * from './HttpCancelUserTeamInviteResponse' +export * from './HttpChangeUsersPrivilegesRequest' +export * from './HttpChangeUsersPrivilegesResponse' +export * from './HttpCloudEndpoint' +export * from './HttpConnectSessionRequest' +export * from './HttpConnectSessionResponse' +export * from './HttpDeleteAccountFinishRequest' +export * from './HttpDeleteAccountStartRequest' +export * from './HttpDeleteAppRequest' +export * from './HttpDeleteTeamRequest' +export * from './HttpDropSessionsRequest' +export * from './HttpDropSessionsResponse' +export * from './HttpEndpoint' +export * from './HttpGetAppEventsRequest' +export * from './HttpGetAppEventsResponse' +export * from './HttpGetPendingRequestRequest' +export * from './HttpGetPendingRequestResponse' +export * from './HttpGetPendingRequestsRequest' +export * from './HttpGetPendingRequestsResponse' +export * from './HttpGetSessionInfoRequest' +export * from './HttpGetSessionInfoResponse' +export * from './HttpGetSessionsRequest' +export * from './HttpGetSessionsResponse' +export * from './HttpGetTeamMetadataRequest' +export * from './HttpGetTeamMetadataResponse' +export * from './HttpGetTeamUserInvitesRequest' +export * from './HttpGetTeamUserInvitesResponse' +export * from './HttpGetTeamUsersPrivilegesRequest' +export * from './HttpGetTeamUsersPrivilegesResponse' +export * from './HttpGetUserJoinedTeamsResponse' +export * from './HttpGetUserTeamInvitesResponse' +export * from './HttpInviteUserToTeamRequest' +export * from './HttpInviteUserToTeamResponse' +export * from './HttpLeaveTeamRequest' +export * from './HttpLeaveTeamResponse' +export * from './HttpLoginRequest' +export * from './HttpLoginResponse' +export * from './HttpLoginWithGoogleRequest' +export * from './HttpLoginWithGoogleResponse' +export * from './HttpLoginWithPasskeyFinishResponse' +export * from './HttpLoginWithPasskeyStartRequest' +export * from './HttpNightlyConnectCloudEvent' +export * from './HttpRefreshRequest' +export * from './HttpRefreshResponse' +export * from './HttpRegisterNewAppRequest' +export * from './HttpRegisterNewAppResponse' +export * from './HttpRegisterNewTeamRequest' +export * from './HttpRegisterNewTeamResponse' +export * from './HttpRegisterWithPasskeyFinishResponse' +export * from './HttpRegisterWithPasskeyStartRequest' +export * from './HttpRegisterWithPasswordFinishRequest' +export * from './HttpRegisterWithPasswordFinishResponse' +export * from './HttpRegisterWithPasswordStartRequest' +export * from './HttpRegisterWithPasswordStartResponse' +export * from './HttpRemoveUserFromTeamRequest' +export * from './HttpRemoveUserFromTeamResponse' +export * from './HttpRemoveWhitelistedDomainRequest' +export * from './HttpRemoveWhitelistedDomainResponse' +export * from './HttpResetPasskeyFinishResponse' +export * from './HttpResetPasskeyStartRequest' +export * from './HttpResetPasswordFinishRequest' +export * from './HttpResetPasswordFinishResponse' +export * from './HttpResetPasswordStartRequest' +export * from './HttpResetPasswordStartResponse' +export * from './HttpResolveRequestRequest' +export * from './HttpResolveRequestResponse' +export * from './HttpUserMetadataResponse' +export * from './HttpVerifyCodeRequest' +export * from './HttpVerifyCodeResponse' +export * from './HttpVerifyDomainFinishRequest' +export * from './HttpVerifyDomainFinishResponse' +export * from './HttpVerifyDomainStartRequest' +export * from './HttpVerifyDomainStartResponse' +export * from './Images' +export * from './InitializeRequest' +export * from './InitializeResponse' +export * from './JoinedTeam' +export * from './MobileMetadata' +export * from './Network' +export * from './NewPayloadEvent' +export * from './NewPayloadEventReply' +export * from './NewUserPrivilegeLevel' +export * from './NightlyError' +export * from './Notification' +export * from './NotificationPayload' +export * from './PaginationCursor' +export * from './PendingRequest' +export * from './Platform' +export * from './PrivilegeChange' +export * from './PrivilegeLevel' +export * from './RequestFail' +export * from './RequestPayload' +export * from './RequestType' +export * from './ResponsePayload' +export * from './ServerToApp' +export * from './ServerToClient' +export * from './SessionStatus' +export * from './SessionType' +export * from './SignAndSendTransactionEvent' +export * from './SignAndSendTransactionResolveEvent' +export * from './SignMessageEvent' +export * from './SignMessageResolveEvent' +export * from './SignTransactionEvent' +export * from './SignTransactionResolveEvent' +export * from './Subscription' +export * from './TeamInvite' +export * from './TeamMetadata' +export * from './TeamUserPrivilege' +export * from './UserConnectedEvent' +export * from './UserDisconnectedEvent' +export * from './UserPrivilege' +export * from './VerificationAction' +export * from './Version' +export * from './WalletMetadata' +export * from './WalletType' +export * from './WebMetadata' +export * from './WhitelistedDomain' diff --git a/sdk/build-only-packages.sh b/sdk/build-only-packages.sh index 5c876ff4..933d509e 100644 --- a/sdk/build-only-packages.sh +++ b/sdk/build-only-packages.sh @@ -17,6 +17,12 @@ pnpm build cd ../modal pnpm build +# connect cloud +cd ../cloud +pnpm build +cd ../analytics +pnpm build + # selector packages cd ../selector-base pnpm build diff --git a/sdk/package.json b/sdk/package.json index 179c6cf7..15b1eec0 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,7 +1,8 @@ { "name": "sdk", "scripts": { - "bindings": "rm -rf ./bindings && cp -r ../server/bindings ./bindings", + "copy-bindings": "rm -rf ./bindings && mkdir ./bindings && cp -r ../server/bindings/* ./bindings/ && cp -r ../database/bindings/* ./bindings/", + "bindings": "sh ./rebuild-bindings.sh", "build": "turbo run build", "dev": "turbo run dev", "lint": "turbo run lint", @@ -22,4 +23,4 @@ "vite-tsconfig-paths": "^4.2.0", "vitest": "^0.31.1" } -} +} \ No newline at end of file diff --git a/sdk/packages/analytics/.gitignore b/sdk/packages/analytics/.gitignore new file mode 100644 index 00000000..37b1898b --- /dev/null +++ b/sdk/packages/analytics/.gitignore @@ -0,0 +1 @@ +/.nightly-connect-session \ No newline at end of file diff --git a/sdk/packages/analytics/package.json b/sdk/packages/analytics/package.json new file mode 100644 index 00000000..e5700e11 --- /dev/null +++ b/sdk/packages/analytics/package.json @@ -0,0 +1,53 @@ +{ + "name": "@nightlylabs/nightly-cloud-analytics", + "version": "0.0.1", + "type": "module", + "exports": { + ".": { + "import": "./dist/index.mjs.js", + "require": "./dist/index.cjs.js", + "types": "./dist/index.d.ts" + } + }, + "browser": { + "./dist/index.cjs.js": "./dist/index.browser.cjs.js", + "./dist/index.mjs.js": "./dist/index.browser.mjs.js" + }, + "react-native": "dist/index.browser.cjs.js", + "main": "dist/index.cjs.js", + "module": "dist/index.mjs.js", + "types": "dist/index.d.ts", + "typings": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "test": "vitest", + "test:ui": "vitest --ui", + "test:run": "vitest run", + "test:production": "PRODUCTION=true vitest run", + "test:ci": "IS_CI=true vitest run", + "build": "rm -rf ./dist && rollup -c" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.0", + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-terser": "^0.4.3", + "@rollup/plugin-typescript": "^11.1.1", + "@types/node": "^20.3.0", + "@vitest/ui": "^0.31.1", + "bs58": "^5.0.0", + "rollup": "^3.23.1", + "rollup-plugin-dts": "^5.3.0", + "tslib": "^2.5.3", + "tweetnacl": "^1.0.3", + "typescript": "^5.1.3", + "@nightlylabs/nightly-cloud": "workspace:*", + "@nightlylabs/nightly-connect-base": "workspace:*", + "isomorphic-ws": "^5.0.0" + }, + "dependencies": { + "cross-fetch": "^3.1.6", + "uuid": "^9.0.0" + } +} \ No newline at end of file diff --git a/sdk/packages/analytics/rollup.config.js b/sdk/packages/analytics/rollup.config.js new file mode 100644 index 00000000..824f01a5 --- /dev/null +++ b/sdk/packages/analytics/rollup.config.js @@ -0,0 +1,54 @@ +import typescript from '@rollup/plugin-typescript' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import terser from '@rollup/plugin-terser' +import dts from 'rollup-plugin-dts' + +export default [ + { + input: 'src/index.ts', + output: [ + { + file: 'dist/index.cjs.js', + format: 'cjs', + sourcemap: true, + interop: 'compat' + }, + { + file: 'dist/index.mjs.js', + format: 'esm', + sourcemap: true + } + ], + plugins: [typescript(), nodeResolve(), commonjs(), terser()], + external: ['uuid', 'cross-fetch'] + }, + { + input: 'src/index.ts', + output: [ + { + file: 'dist/index.browser.cjs.js', + format: 'cjs', + sourcemap: true, + interop: 'compat' + }, + { + file: 'dist/index.browser.mjs.js', + format: 'esm', + sourcemap: true + } + ], + plugins: [ + typescript(), + nodeResolve({ browser: true, preferBuiltins: false }), + commonjs(), + terser() + ], + external: ['uuid'] + }, + { + input: 'dist/types/packages/analytics/src/index.d.ts', + output: [{ file: 'dist/index.d.ts', format: 'esm' }], + plugins: [dts()] + } +] diff --git a/sdk/packages/analytics/src/app.ts b/sdk/packages/analytics/src/app.ts new file mode 100644 index 00000000..6a2c5248 --- /dev/null +++ b/sdk/packages/analytics/src/app.ts @@ -0,0 +1,216 @@ +import { AppConnectEvent } from '../../../bindings/AppConnectEvent' +import { AppDisconnectEvent } from '../../../bindings/AppDisconnectEvent' +import { ChangeNetworkEvent } from '../../../bindings/ChangeNetworkEvent' +import { ChangeNetworkResolveEvent } from '../../../bindings/ChangeNetworkResolveEvent' +import { ChangeWalletEvent } from '../../../bindings/ChangeWalletEvent' +import { ChangeWalletResolveEvent } from '../../../bindings/ChangeWalletResolveEvent' +import { ClientConnectEvent } from '../../../bindings/ClientConnectEvent' +import { ClientConnectResolveEvent } from '../../../bindings/ClientConnectResolveEvent' +import { ClientDisconnectEvent } from '../../../bindings/ClientDisconnectEvent' +import { HttpNightlyConnectCloudEvent } from '../../../bindings/HttpNightlyConnectCloudEvent' +import { SignAndSendTransactionEvent } from '../../../bindings/SignAndSendTransactionEvent' +import { SignAndSendTransactionResolveEvent } from '../../../bindings/SignAndSendTransactionResolveEvent' +import { SignMessageEvent } from '../../../bindings/SignMessageEvent' +import { SignMessageResolveEvent } from '../../../bindings/SignMessageResolveEvent' +import { SignTransactionEvent } from '../../../bindings/SignTransactionEvent' +import { SignTransactionResolveEvent } from '../../../bindings/SignTransactionResolveEvent' +import { DEFAULT_ANALYTICS_URL } from './utils' +import { fetch } from 'cross-fetch' + +export interface NightlyAnalyticsParams { + sessionId: string + network: string + appId: string + endpoint?: string +} +// SDK for sending analytics +export class NightlyAnalytics { + sessionId: string + network: string + endpoint: string = DEFAULT_ANALYTICS_URL // Endpoint for sending analytics + appId: string + + public constructor(params: NightlyAnalyticsParams) { + this.sessionId = params.sessionId + this.network = params.network + this.endpoint = params.endpoint ?? DEFAULT_ANALYTICS_URL + this.appId = params.appId + } + + sendEvent = async (request: HttpNightlyConnectCloudEvent, method = 'POST') => { + // We don't need response + return await fetch(this.endpoint, { + body: JSON.stringify(request), + method: method, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + } + }) + } + + appConnected = async (event: AppConnectEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'AppConnect', + ...event + } + }) + } + + appDisconnected = async (event: AppDisconnectEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'AppDisconnect', + ...event + } + }) + } + + clientConnect = async (event: ClientConnectEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'ClientConnect', + ...event + } + }) + } + + clientConnectResolve = async (event: ClientConnectResolveEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'ClientConnectResolve', + ...event + } + }) + } + + clientDisconnect = async (event: ClientDisconnectEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'ClientDisconnect', + ...event + } + }) + } + + signMessage = async (event: SignMessageEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'SignMessage', + ...event + } + }) + } + + signMessageResolve = async (event: SignMessageResolveEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'SignMessageResolve', + ...event + } + }) + } + + signTransaction = async (event: SignTransactionEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'SignTransaction', + ...event + } + }) + } + + signTransactionResolve = async (event: SignTransactionResolveEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'SignTransactionResolve', + ...event + } + }) + } + + signAndSendTransaction = async (event: SignAndSendTransactionEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'SignAndSendTransaction', + ...event + } + }) + } + + signAndSendTransactionResolve = async (event: SignAndSendTransactionResolveEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'SignAndSendTransactionResolve', + ...event + } + }) + } + + changeNetwork = async (event: ChangeNetworkEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'ChangeNetwork', + ...event + } + }) + } + + changeNetworkResolve = async (event: ChangeNetworkResolveEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'ChangeNetworkResolve', + ...event + } + }) + } + + changeWallet = async (event: ChangeWalletEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'ChangeWallet', + ...event + } + }) + } + + changeWalletResolve = async (event: ChangeWalletResolveEvent) => { + return await this.sendEvent({ + appId: this.appId, + network: this.network, + event: { + type: 'ChangeWalletResolve', + ...event + } + }) + } +} diff --git a/sdk/packages/analytics/src/e2e.test.ts b/sdk/packages/analytics/src/e2e.test.ts new file mode 100644 index 00000000..7156d54a --- /dev/null +++ b/sdk/packages/analytics/src/e2e.test.ts @@ -0,0 +1,575 @@ +import { assert, beforeAll, describe, expect, test } from 'vitest' +import { TEST_RELAY_ENDPOINT, smartDelay } from '../../../commonTestUtils' +import { NightlyAnalytics } from './app' +import { NightlyCloud } from '@nightlylabs/nightly-cloud' +import { BaseApp } from '@nightlylabs/nightly-connect-base' +import { + createUser, + randomDomainName, + randomEmail, + randomOrigin, + setupAnalytics, + setupTestTeam, + verifyDomain +} from './test_utils' +import { + AppConnectEvent, + AppDisconnectEvent, + ChangeNetworkEvent, + ChangeNetworkResolveEvent, + ChangeWalletEvent, + ChangeWalletResolveEvent, + ClientConnectEvent, + ClientConnectResolveEvent, + ClientDisconnectEvent, + RequestFail, + SignAndSendTransactionEvent, + SignAndSendTransactionResolveEvent, + SignMessageEvent, + SignMessageResolveEvent, + SignTransactionEvent, + SignTransactionResolveEvent +} from '../../../bindings' + +const TEST_CLOUD_ENDPOINT = 'http://127.0.0.1:6969/cloud' +const TEST_ENDPOINT = 'http://127.0.0.1:6969/cloud/public/events' + +describe.concurrent('Analytics client tests', () => { + let cloudClient: NightlyCloud + let baseApp: BaseApp + let teamId: string + let appId: string + let sessionId: string + + beforeAll(async () => { + cloudClient = new NightlyCloud({ + url: TEST_CLOUD_ENDPOINT + }) + + const { origin, domainName } = randomOrigin() + + // Create a test team and register one app under it + const response = await setupTestTeam(cloudClient) + await verifyDomain(cloudClient, response.appId, domainName) + // Create a new sessions under new app id + baseApp = await BaseApp.build( + { + appMetadata: { + additionalInfo: 'test-additional-info', + description: 'test-app-description', + icon: 'test-app-icon', + name: 'test-app-name' + }, + network: 'Solana', + persistent: false, + persistentSessionId: undefined, + timeout: undefined, + url: TEST_RELAY_ENDPOINT, + appId: response.appId + }, + { + origin + } + ) + + sessionId = baseApp.sessionId + teamId = response.teamId + appId = response.appId + + await smartDelay() + }) + + test('Create mock test team with app', async () => { + const tempCloudClient = new NightlyCloud({ + url: TEST_CLOUD_ENDPOINT + }) + const setupResult = await setupTestTeam(tempCloudClient) + expect(setupResult).toBeDefined() + expect(setupResult.teamId).toBeDefined() + expect(setupResult.appId).toBeDefined() + }) + + test('Send event, original client without origin', async () => { + const analyticsOriginal = new NightlyAnalytics({ + sessionId: sessionId, + network: 'Solana', + endpoint: TEST_ENDPOINT, + appId: appId + }) + + const request = { + sessionId: analyticsOriginal.sessionId, + deviceMetadata: { + mobile: { + system: 'Unknown', + version: '15.0' + } + }, + language: 'en', + timezone: 'Europe/London', + network: analyticsOriginal.network, + newSession: false + } as AppConnectEvent + + const responseWithoutOrigin = await analyticsOriginal.appConnected(request) + assert(responseWithoutOrigin.status === 403) + }) + + test('Reject send event without domain verification', async () => { + const { origin } = randomOrigin() + const analytics = setupAnalytics(origin, 'Solana', TEST_ENDPOINT, appId, sessionId) + const request = { + sessionId: analytics.sessionId, + deviceMetadata: { + mobile: { + system: 'Unknown', + version: '15.0' + } + }, + language: 'en', + timezone: 'Europe/London', + network: analytics.network, + newSession: false + } as AppConnectEvent + + const response = await analytics.appConnected(request) + expect(response.status).toBe(403) + }) + + test('Test domain verification', async () => { + const domain = randomDomainName() + // Try to verify domain with invalid domain name + await expect(cloudClient.verifyDomainStart({ appId, domainName: '' })).rejects.toThrow( + 'InvalidDomainName' + ) + + // Start domain verification with valid domain name + const verifyResponse = await cloudClient.verifyDomainStart({ appId, domainName: domain }) + expect(verifyResponse.code.length >= 36) + + // Try to finish domain verification with invalid domain name + await expect(cloudClient.verifyDomainFinish({ appId, domainName: '' })).rejects.toThrow( + 'InvalidDomainName' + ) + + // Finish domain verification with valid domain name + await cloudClient.verifyDomainFinish({ + appId, + domainName: domain + }) + + // Try to verify domain with the same domain name again + await expect(cloudClient.verifyDomainStart({ appId, domainName: domain })).rejects.toThrow( + 'DomainAlreadyVerified' + ) + + // Try to finish domain verification for domain that has already been verified + await expect(cloudClient.verifyDomainFinish({ appId, domainName: domain })).rejects.toThrow( + 'DomainAlreadyVerified' + ) + + // Try to finish domain verification for domain that has not been started + await expect( + cloudClient.verifyDomainFinish({ appId, domainName: randomEmail() }) + ).rejects.toThrow('DomainVerificationNotStarted') + + // Try to verify new domain without permissions to the previously created app with already one verified domain, create new cloud client + const tempCloudClient = new NightlyCloud({ + url: TEST_CLOUD_ENDPOINT + }) + // create user + await createUser(tempCloudClient) + + await expect( + tempCloudClient.verifyDomainStart({ appId, domainName: randomEmail() }) + ).rejects.toThrow('InsufficientPermissions') + + // Try to properly verify new domain with new cloud client for the app + const newDomain = randomEmail() + const secondVerifyResponse = await cloudClient.verifyDomainStart({ + appId, + domainName: newDomain + }) + expect(secondVerifyResponse.code.length === 6) + + await cloudClient.verifyDomainFinish({ + appId, + domainName: newDomain + }) + + // Get app data and validate that 2 domains has been verified + const appData = await cloudClient.getUserJoinedTeams() + + const appWhitelistedDomains = appData.teamsApps[teamId][0].whitelistedDomains + assert(appWhitelistedDomains.some((d) => d.domain === domain && d.status === 'Verified')) + assert(appWhitelistedDomains.some((d) => d.domain === newDomain && d.status === 'Verified')) + }) + + test('Test verified domain removal', async () => { + const domain = randomDomainName() + + // Verify the domain + await verifyDomain(cloudClient, appId, domain) + + // Remove the domain from the app + await cloudClient.removeDomain({ appId, domainName: domain }) + + // Verify that the domain has been removed + const appData = await cloudClient.getUserJoinedTeams() + const appWhitelistedDomains = appData.teamsApps[teamId][0].whitelistedDomains + assert(appWhitelistedDomains.find((d) => d.domain === domain) === undefined) + }) + + test('Test cancel domain verification challenge', async () => { + const domain = randomDomainName() + + // Start domain verification with valid domain name + const firstVerifyResponse = await cloudClient.verifyDomainStart({ appId, domainName: domain }) + expect(firstVerifyResponse.code.length >= 36) + + // Try to start challenge again, should simply return the same code + const secondVerifyResponse = await cloudClient.verifyDomainStart({ appId, domainName: domain }) + expect(secondVerifyResponse.code === firstVerifyResponse.code) + + // Fetch the app data and validate that the domain is in the pending state + const appData = await cloudClient.getTeamMetadata({ teamId }) + const currentWhitelistChallenge = appData.teamApps[0].whitelistedDomains.find( + (d) => d.domain === domain + ) + + // Check if currentWhitelistChallenge is defined + if (currentWhitelistChallenge !== undefined) { + assert(currentWhitelistChallenge.status === 'Pending') + + // Cancel the challenge + await cloudClient.cancelDomainVerification({ + appId, + domainName: currentWhitelistChallenge.domain + }) + } else { + throw new Error(`Domain ${domain} not found in the whitelist.`) + } + + // Fetch the app data and validate that the domain verification has been removed + const appDataAfter = await cloudClient.getTeamMetadata({ teamId }) + const currentWhitelistChallengeAfter = appDataAfter.teamApps[0].whitelistedDomains.find( + (d) => d.domain === domain + ) + assert(currentWhitelistChallengeAfter === undefined) + }) + + test('Send event during unfinished domain registration process', async () => { + const { origin, domainName } = randomOrigin() + const verifyResponse = await cloudClient.verifyDomainStart({ appId, domainName }) + expect(verifyResponse.code.length >= 36) + + const analytics = setupAnalytics(origin, 'Solana', TEST_ENDPOINT, appId, sessionId) + const request = { + sessionId: analytics.sessionId, + deviceMetadata: { + mobile: { + system: 'Unknown', + version: '15.0' + } + }, + language: 'en', + timezone: 'Europe/London', + network: analytics.network, + newSession: false + } as AppConnectEvent + + const response = await analytics.appConnected(request) + expect(response.status).toBe(403) + }) + + test('Send event success', async () => { + const { origin, domainName } = randomOrigin() + await verifyDomain(cloudClient, appId, domainName) + + const analytics = setupAnalytics(origin, 'Solana', TEST_ENDPOINT, appId, sessionId) + const request = { + sessionId: analytics.sessionId, + deviceMetadata: { + mobile: { + system: 'Unknown', + version: '15.0' + } + }, + language: 'en', + timezone: 'Europe/London', + network: analytics.network, + newSession: false + } as AppConnectEvent + + const response = await analytics.appConnected(request) + expect(response.status).toBe(200) + }) + + test('Reject event from different origin', async () => { + const { domainName } = randomOrigin() + await verifyDomain(cloudClient, appId, domainName) + + // Send event from origin unverified for this app id + const differentOrigin = 'http://different-origin' + randomEmail() + '.com' + const analyticsDifferentOrigin = setupAnalytics( + differentOrigin, + 'Solana', + TEST_ENDPOINT, + appId, + sessionId + ) + + const request = { + sessionId: analyticsDifferentOrigin.sessionId, + deviceMetadata: { + mobile: { + system: 'Unknown', + version: '15.0' + } + }, + language: 'en', + timezone: 'Europe/London', + network: analyticsDifferentOrigin.network, + newSession: false + } as AppConnectEvent + + const response = await analyticsDifferentOrigin.appConnected(request) + expect(response.status).toBe(403) + }) + + describe.concurrent('Test events', () => { + let analytics: NightlyAnalytics + const clientId: string = 'test-client-id' + randomEmail() + const addresses: string[] = ['test-address' + randomEmail()] + + beforeAll(async () => { + const { origin, domainName } = randomOrigin() + await verifyDomain(cloudClient, appId, domainName) + analytics = setupAnalytics(origin, 'Solana', TEST_ENDPOINT, appId, sessionId) + }) + + test('Event appConnected', async () => { + // Connect to new session + const request = { + sessionId: analytics.sessionId, + deviceMetadata: { + mobile: { + system: 'Unknown', + version: '15.0' + } + }, + language: 'en', + timezone: 'Europe/London', + network: analytics.network, + newSession: true + } as AppConnectEvent + + const response = await analytics.appConnected(request) + expect(response.status).toBe(200) + + // Reconnect to the same session + request.newSession = false + const response2 = await analytics.appConnected(request) + expect(response2.status).toBe(200) + }) + + test('Event appDisconnected', async () => { + const request = { + sessionId: analytics.sessionId + } as AppDisconnectEvent + + const response = await analytics.appDisconnected(request) + expect(response.status).toBe(200) + }) + + test('Event clientConnect', async () => { + // Send event clientConnect with success set to false + const request = { + sessionId: analytics.sessionId, + walletName: 'test-wallet-name', + walletType: 'test-wallet-type', + clientId: clientId, + sessionType: 'Extension' + } as ClientConnectEvent + + const response = await analytics.clientConnect(request) + expect(response.status).toBe(200) + }) + + test('Event clientConnectResolve', async () => { + const request = { + addresses: addresses, + sessionId: analytics.sessionId, + success: true, + walletName: 'test-wallet-name', + walletType: 'test-wallet-type', + clientId: clientId + } as ClientConnectResolveEvent + + const response = await analytics.clientConnectResolve(request) + expect(response.status).toBe(200) + }) + + test('Event clientDisconnect', async () => { + const request = { + disconnectedSessionId: analytics.sessionId, + clientId: clientId + } as ClientDisconnectEvent + + const response = await analytics.clientDisconnect(request) + expect(response.status).toBe(200) + }) + + test('Event signMessage', async () => { + const request = { + network: 'Solana', + requestId: 'test-request-id', + sessionId: analytics.sessionId + } as SignMessageEvent + + const response = await analytics.signMessage(request) + expect(response.status).toBe(200) + }) + + test('Event signMessageResolve', async () => { + // First send signMessageResolve event with failureReason + const request = { + requestId: 'test-request-id', + sessionId: analytics.sessionId, + failureReason: 'Rejected' as RequestFail + } as SignMessageResolveEvent + + const response = await analytics.signMessageResolve(request) + expect(response.status).toBe(200) + + // Then send signMessageResolve event with success + request.failureReason = undefined + + const responseSuccess = await analytics.signMessageResolve(request) + expect(responseSuccess.status).toBe(200) + }) + + test('Event signTransaction', async () => { + const request = { + network: 'Solana', + requestId: 'test-request-id', + sessionId: analytics.sessionId + } as SignTransactionEvent + + const response = await analytics.signTransaction(request) + expect(response.status).toBe(200) + }) + + test('Event signTransactionResolve', async () => { + // First send signTransactionResolve event with failureReason + const request = { + requestId: 'test-request-id', + sessionId: analytics.sessionId, + failureReason: 'Rejected' as RequestFail + } as SignTransactionResolveEvent + + const response = await analytics.signTransactionResolve(request) + expect(response.status).toBe(200) + + // Then send signTransactionResolve event with success + request.failureReason = undefined + request.txHash = 'test-tx-hash' + + const responseSuccess = await analytics.signTransactionResolve(request) + expect(responseSuccess.status).toBe(200) + }) + + test('Event signAndSendTransaction', async () => { + const request = { + network: 'Solana', + requestId: 'test-request-id', + sessionId: analytics.sessionId + } as SignAndSendTransactionEvent + + const response = await analytics.signAndSendTransaction(request) + expect(response.status).toBe(200) + }) + + test('Event signAndSendTransactionResolve', async () => { + // First send signAndSendTransactionResolve event with failureReason + const request = { + requestId: 'test-request-id', + sessionId: analytics.sessionId, + failureReason: 'Rejected' as RequestFail + } as SignAndSendTransactionResolveEvent + + const response = await analytics.signAndSendTransactionResolve(request) + expect(response.status).toBe(200) + + // Then send signAndSendTransactionResolve event with success + request.failureReason = undefined + request.txHash = 'test-tx-hash' + + const responseSuccess = await analytics.signAndSendTransactionResolve(request) + expect(responseSuccess.status).toBe(200) + }) + + test('Event changeWallet', async () => { + const request = { + network: 'Solana', + requestId: 'test-request-id', + sessionId: analytics.sessionId, + walletName: 'test-wallet-name', + walletType: 'test-wallet-type', + oldWalletAddress: 'test-old-wallet-address' + } as ChangeWalletEvent + + const response = await analytics.changeWallet(request) + expect(response.status).toBe(200) + }) + + test('Event changeWalletResolve', async () => { + // First send changeWalletResolve event with failureReason + const request = { + requestId: 'test-request-id', + sessionId: analytics.sessionId, + failureReason: 'TimedOut' as RequestFail + } as ChangeWalletResolveEvent + + const response = await analytics.changeWalletResolve(request) + expect(response.status).toBe(200) + + // Then send changeWalletResolve event with success + request.failureReason = undefined + request.newWalletAddress = 'new-wallet-address' + + const responseSuccess = await analytics.changeWalletResolve(request) + expect(responseSuccess.status).toBe(200) + }) + + test('Event changeNetwork', async () => { + const request = { + oldNetwork: 'Solana', + requestId: 'test-request-id', + sessionId: analytics.sessionId + } as ChangeNetworkEvent + + const response = await analytics.changeNetwork(request) + expect(response.status).toBe(200) + }) + + test('Event changeNetworkResolve', async () => { + // First send changeNetworkResolve event with failureReason + const request = { + requestId: 'test-request-id', + sessionId: analytics.sessionId, + failureReason: 'TimedOut' as RequestFail + } as ChangeNetworkResolveEvent + + const response = await analytics.changeNetworkResolve(request) + expect(response.status).toBe(200) + + // Then send changeWalletResolve event with success + request.failureReason = undefined + request.newNetwork = 'Aptos' + + const responseSuccess = await analytics.changeNetworkResolve(request) + expect(responseSuccess.status).toBe(200) + }) + }) +}) diff --git a/sdk/packages/analytics/src/index.ts b/sdk/packages/analytics/src/index.ts new file mode 100644 index 00000000..2a8de0c9 --- /dev/null +++ b/sdk/packages/analytics/src/index.ts @@ -0,0 +1,2 @@ +export * from './app' +export * from './utils' diff --git a/sdk/packages/analytics/src/test_utils.ts b/sdk/packages/analytics/src/test_utils.ts new file mode 100644 index 00000000..0b168f83 --- /dev/null +++ b/sdk/packages/analytics/src/test_utils.ts @@ -0,0 +1,131 @@ +import { NightlyCloud } from '@nightlylabs/nightly-cloud' +import { + HttpLoginRequest, + HttpRegisterNewTeamRequest, + HttpRegisterNewAppRequest, + HttpRegisterWithPasswordStartRequest, + HttpVerifyDomainStartRequest +} from '../../../bindings' +import { NightlyAnalytics } from './app' +import { fetch } from 'cross-fetch' + +export async function createUser( + cloudClient: NightlyCloud +): Promise<{ userId: string; email: string }> { + const email = randomEmail() + '@gmail.com' + const password = 'Password123' + + const registerPayload = { + email, + password, + device: 'device', + browser: 'browser' + } as HttpRegisterWithPasswordStartRequest + + await cloudClient.registerWithPasswordStart(registerPayload) + + const verifyResponse = await cloudClient.verifyCode({ + email, + code: '123456', + action: 'registerPassword' + }) + + await cloudClient.registerWithPasswordFinish({ + authCode: verifyResponse.verificationCode, + email, + newPassword: password + }) + + const loginPayload = { + email, + password, + enforceIp: false + } as HttpLoginRequest + + const userId = (await cloudClient.loginWithPassword(loginPayload)).userId.toString() + + return { userId, email } +} + +export async function setupTestTeam( + cloudClient: NightlyCloud +): Promise<{ teamId: string; appId: string }> { + // create user + await createUser(cloudClient) + + // create basic team setup + return await basicTeamSetup(cloudClient) +} + +export async function basicTeamSetup( + cloudClient: NightlyCloud +): Promise<{ teamId: string; appId: string }> { + // create team + const registerTeamPayload = { + personal: false, + teamName: 'Test_Team' + } as HttpRegisterNewTeamRequest + + const teamId = (await cloudClient.registerNewTeam(registerTeamPayload)).teamId + + // create app + const registerAppPayload = { + teamId: teamId, + appName: 'Test_App', + ackPublicKeys: [], + whitelistedDomains: ['localhost'] + } as HttpRegisterNewAppRequest + + const appId = (await cloudClient.registerNewApp(registerAppPayload)).appId + + // Return both teamId and appId in an object + return { teamId, appId } +} + +export function randomEmail(): string { + return Math.random().toString(36).substring(7) +} + +export function setupAnalytics( + origin: string, + network: string, + endpoint: string, + appId: string, + sessionId: string +): NightlyAnalytics { + const analytics = new NightlyAnalytics({ + sessionId: sessionId, + network: network, + endpoint: endpoint, + appId: appId + }) + + // Override sendEvent within the setup + analytics.sendEvent = async function (request, method = 'POST') { + return await fetch(this.endpoint, { + body: JSON.stringify(request), + method: method, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + Origin: origin + } + }) + } + + return analytics +} + +export async function verifyDomain(cloudClient: NightlyCloud, appId: string, domainName: string) { + await cloudClient.verifyDomainStart({ appId, domainName } as HttpVerifyDomainStartRequest) + await cloudClient.verifyDomainFinish({ appId, domainName }) +} + +export function randomDomainName(): string { + return randomEmail() + '.com' +} + +export function randomOrigin(): { origin: string; domainName: string } { + const domainName = randomDomainName() + return { origin: 'https://' + domainName, domainName } +} diff --git a/sdk/packages/analytics/src/utils.ts b/sdk/packages/analytics/src/utils.ts new file mode 100644 index 00000000..0377af6b --- /dev/null +++ b/sdk/packages/analytics/src/utils.ts @@ -0,0 +1 @@ +export const DEFAULT_ANALYTICS_URL = 'https://nc2.nightly.app/cloud/public/events' diff --git a/sdk/packages/analytics/tsconfig.json b/sdk/packages/analytics/tsconfig.json new file mode 100644 index 00000000..75a9ae75 --- /dev/null +++ b/sdk/packages/analytics/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "lib": ["es2015", "DOM"], + "types": ["node"], + "target": "esnext", + "moduleDetection": "force", + "resolveJsonModule": true, + "allowJs": true, + "baseUrl": ".", + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "noImplicitAny": false, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "isolatedModules": true, + "noFallthroughCasesInSwitch": true, + "declaration": true, + "declarationDir": "types", + "emitDeclarationOnly": true, + "outDir": "dist", + "rootDir": "../.." + }, + "ts-node": { + "require": ["tsconfig-paths/register"] + }, + "include": ["../../bindings/*", "src/*"] +} diff --git a/sdk/packages/analytics/vitest.config.ts b/sdk/packages/analytics/vitest.config.ts new file mode 100644 index 00000000..b7b4aacd --- /dev/null +++ b/sdk/packages/analytics/vitest.config.ts @@ -0,0 +1,9 @@ +import tsconfigPath from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [tsconfigPath()], + test: { + // singleThread: true + } +}) diff --git a/sdk/packages/base/src/app.ts b/sdk/packages/base/src/app.ts index 99d74ddf..7027835a 100644 --- a/sdk/packages/base/src/app.ts +++ b/sdk/packages/base/src/app.ts @@ -49,12 +49,12 @@ export class BaseApp extends EventEmitter { clientMetadata: string | undefined initializeData: AppBaseInitialize // TODO add info about the app - private constructor(initializeData: AppBaseInitialize) { + private constructor(initializeData: AppBaseInitialize, wsOptions?: WebSocket.ClientOptions) { super() const url = initializeData.url ?? 'https://nc2.nightly.app' // get domain from url const path = url.replace('https://', 'wss://').replace('http://', 'ws://') - const ws = new WebSocket(path + '/app') + const ws = new WebSocket(path + '/app', wsOptions) this.initializeData = initializeData this.url = url this.ws = ws @@ -66,7 +66,10 @@ export class BaseApp extends EventEmitter { ): Promise => { return getWalletsMetadata(url, network) } - public static build = async (baseInitialize: AppBaseInitialize): Promise => { + public static build = async ( + baseInitialize: AppBaseInitialize, + wsOptions?: WebSocket.ClientOptions + ): Promise => { return new Promise((resolve, reject) => { const localStorage = getLocalStorage() const persistent = baseInitialize.persistent ?? true @@ -74,7 +77,8 @@ export class BaseApp extends EventEmitter { ? localStorage.getItem(getSessionIdLocalStorageKey(baseInitialize.network)) ?? undefined : undefined - const baseApp = new BaseApp(baseInitialize) + const baseApp = new BaseApp(baseInitialize, wsOptions) + baseApp.ws.onclose = () => { baseApp.emit('serverDisconnected') } @@ -122,7 +126,8 @@ export class BaseApp extends EventEmitter { persistent: persistent, responseId: responseId, version: '#TODO version 0.0.0', - type: 'InitializeRequest' + type: 'InitializeRequest', + appId: baseInitialize.appId } // Set up the timeout const timer = setTimeout(() => { diff --git a/sdk/packages/base/src/initializeTypes.ts b/sdk/packages/base/src/initializeTypes.ts index e4bf49fb..233647f4 100644 --- a/sdk/packages/base/src/initializeTypes.ts +++ b/sdk/packages/base/src/initializeTypes.ts @@ -8,6 +8,7 @@ export interface AppBaseInitialize { timeout?: number persistentSessionId?: string persistent?: boolean + appId?: string } export interface ClientBaseInitialize { diff --git a/sdk/packages/cloud/.gitignore b/sdk/packages/cloud/.gitignore new file mode 100644 index 00000000..37b1898b --- /dev/null +++ b/sdk/packages/cloud/.gitignore @@ -0,0 +1 @@ +/.nightly-connect-session \ No newline at end of file diff --git a/sdk/packages/cloud/package.json b/sdk/packages/cloud/package.json new file mode 100644 index 00000000..edb89b98 --- /dev/null +++ b/sdk/packages/cloud/package.json @@ -0,0 +1,50 @@ +{ + "name": "@nightlylabs/nightly-cloud", + "version": "0.0.33", + "type": "module", + "exports": { + ".": { + "import": "./dist/index.mjs.js", + "require": "./dist/index.cjs.js", + "types": "./dist/index.d.ts" + } + }, + "browser": { + "./dist/index.cjs.js": "./dist/index.browser.cjs.js", + "./dist/index.mjs.js": "./dist/index.browser.mjs.js" + }, + "react-native": "dist/index.browser.cjs.js", + "main": "dist/index.cjs.js", + "module": "dist/index.mjs.js", + "types": "dist/index.d.ts", + "typings": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "test": "vitest", + "test:ui": "vitest --ui", + "test:run": "vitest run", + "test:production": "PRODUCTION=true vitest run", + "test:ci": "IS_CI=true vitest run", + "build": "rm -rf ./dist && rollup -c" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.0", + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-terser": "^0.4.3", + "@rollup/plugin-typescript": "^11.1.1", + "@types/node": "^20.3.0", + "@vitest/ui": "^0.31.1", + "bs58": "^5.0.0", + "rollup": "^3.23.1", + "rollup-plugin-dts": "^5.3.0", + "tslib": "^2.5.3", + "tweetnacl": "^1.0.3", + "typescript": "^5.1.3" + }, + "dependencies": { + "cross-fetch": "^3.1.6", + "uuid": "^9.0.0" + } +} diff --git a/sdk/packages/cloud/rollup.config.js b/sdk/packages/cloud/rollup.config.js new file mode 100644 index 00000000..04f5a274 --- /dev/null +++ b/sdk/packages/cloud/rollup.config.js @@ -0,0 +1,54 @@ +import typescript from '@rollup/plugin-typescript' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import terser from '@rollup/plugin-terser' +import dts from 'rollup-plugin-dts' + +export default [ + { + input: 'src/index.ts', + output: [ + { + file: 'dist/index.cjs.js', + format: 'cjs', + sourcemap: true, + interop: 'compat' + }, + { + file: 'dist/index.mjs.js', + format: 'esm', + sourcemap: true + } + ], + plugins: [typescript(), nodeResolve(), commonjs(), terser()], + external: ['uuid', 'cross-fetch'] + }, + { + input: 'src/index.ts', + output: [ + { + file: 'dist/index.browser.cjs.js', + format: 'cjs', + sourcemap: true, + interop: 'compat' + }, + { + file: 'dist/index.browser.mjs.js', + format: 'esm', + sourcemap: true + } + ], + plugins: [ + typescript(), + nodeResolve({ browser: true, preferBuiltins: false }), + commonjs(), + terser() + ], + external: ['uuid'] + }, + { + input: 'dist/types/packages/cloud/src/index.d.ts', + output: [{ file: 'dist/index.d.ts', format: 'esm' }], + plugins: [dts()] + } +] diff --git a/sdk/packages/cloud/src/app.ts b/sdk/packages/cloud/src/app.ts new file mode 100644 index 00000000..6ab065ad --- /dev/null +++ b/sdk/packages/cloud/src/app.ts @@ -0,0 +1,667 @@ +import { + HttpAcceptTeamInviteRequest, + HttpAcceptTeamInviteResponse, + HttpCancelPendingDomainVerificationRequest, + HttpCancelTeamUserInviteRequest, + HttpCancelTeamUserInviteResponse, + HttpCancelUserTeamInviteRequest, + HttpCancelUserTeamInviteResponse, + HttpChangeUsersPrivilegesRequest, + HttpChangeUsersPrivilegesResponse, + HttpCloudEndpoint, + HttpDeleteAccountFinishRequest, + HttpDeleteAccountStartRequest, + HttpDeleteAppRequest, + HttpDeleteTeamRequest, + HttpGetAppEventsRequest, + HttpGetAppEventsResponse, + HttpGetTeamMetadataRequest, + HttpGetTeamMetadataResponse, + HttpGetTeamUserInvitesRequest, + HttpGetTeamUserInvitesResponse, + HttpGetTeamUsersPrivilegesRequest, + HttpGetTeamUsersPrivilegesResponse, + HttpGetUserJoinedTeamsResponse, + HttpGetUserTeamInvitesResponse, + HttpInviteUserToTeamRequest, + HttpInviteUserToTeamResponse, + HttpLeaveTeamRequest, + HttpLeaveTeamResponse, + HttpLoginRequest, + HttpLoginResponse, + HttpLoginWithGoogleRequest, + HttpLoginWithGoogleResponse, + HttpLoginWithPasskeyFinishResponse, + HttpLoginWithPasskeyStartRequest, + HttpRefreshRequest, + HttpRefreshResponse, + HttpRegisterNewAppRequest, + HttpRegisterNewAppResponse, + HttpRegisterNewTeamRequest, + HttpRegisterNewTeamResponse, + HttpRegisterWithPasskeyFinishResponse, + HttpRegisterWithPasskeyStartRequest, + HttpRegisterWithPasswordFinishRequest, + HttpRegisterWithPasswordFinishResponse, + HttpRegisterWithPasswordStartRequest, + HttpRegisterWithPasswordStartResponse, + HttpRemoveUserFromTeamRequest, + HttpRemoveUserFromTeamResponse, + HttpRemoveWhitelistedDomainRequest, + HttpRemoveWhitelistedDomainResponse, + HttpResetPasskeyFinishResponse, + HttpResetPasskeyStartRequest, + HttpResetPasswordFinishRequest, + HttpResetPasswordFinishResponse, + HttpResetPasswordStartRequest, + HttpResetPasswordStartResponse, + HttpUserMetadataResponse, + HttpVerifyCodeRequest, + HttpVerifyCodeResponse, + HttpVerifyDomainFinishRequest, + HttpVerifyDomainFinishResponse, + HttpVerifyDomainStartRequest, + HttpVerifyDomainStartResponse +} from '../../../bindings' +import { + HttpAddNewPasskeyFinishRequest, + HttpAddNewPasskeyStartResponse, + HttpDeletePasskeyRequest, + HttpGetPasskeyChallengeResponse, + HttpLoginWithPasskeyFinishRequest, + HttpLoginWithPasskeyStartResponse, + HttpRegisterWithPasskeyFinishRequest, + HttpRegisterWithPasskeyStartResponse, + HttpResetPasskeyFinishRequest, + HttpResetPasskeyStartResponse +} from './passkeyTypes' +import { DEFAULT_CLOUD_URL, EndpointType, Method } from './utils' +import { fetch } from 'cross-fetch' + +export interface NightlyCloudParams { + url?: string +} +// SDK for sending cloud messages +export class NightlyCloud { + url: string = DEFAULT_CLOUD_URL + authToken: string | undefined = undefined + refreshToken: string | undefined = undefined + + public constructor(params: NightlyCloudParams) { + this.url = params.url ?? DEFAULT_CLOUD_URL + } + + sendPostJson = async ( + endpoint: HttpCloudEndpoint, + endpointType: EndpointType, + request: object + ): Promise => { + const URL = this.url + endpointType + endpoint + + const header = { + Accept: 'application/json', + 'Content-Type': 'application/json' + } + const headerAuth = { + Accept: 'application/json', + 'Content-Type': 'application/json', + Authorization: 'Bearer ' + this.authToken + } + const headers = endpointType === EndpointType.Private ? headerAuth : header + + try { + const response: Response = await fetch(URL, { + body: JSON.stringify(request), + method: Method.POST, + headers: headers + }) + if (response.status !== 200) { + const msg = await response.text() + throw new Error(msg) + } + return await response.json() + } catch (e) { + const error = e as any + throw new Error(error) + } + } + + sendGetJson = async ( + endpoint: HttpCloudEndpoint, + endpointType: EndpointType, + message?: { [key: string]: any } + ): Promise => { + let URL = this.url + endpointType + endpoint + '?' + + if (message) { + for (const key of Object.keys(message)) { + if (Array.isArray(message[key])) { + message[key].forEach((value: any) => { + URL += key + '=' + value + '&' + }) + } else if (message[key]) { + // @ts-ignore + URL += key + '=' + message[key] + '&' + } + } + // remove last & + URL = URL.slice(0, -1) + } + + const header = { + Accept: 'application/json', + 'Content-Type': 'application/json' + } + const headerAuth = { + Accept: 'application/json', + 'Content-Type': 'application/json', + Authorization: 'Bearer ' + this.authToken + } + const headers = endpointType === EndpointType.Private ? headerAuth : header + + try { + const response: Response = await fetch(URL, { + method: Method.GET, + headers: headers + }) + if (response.status !== 200) { + const msg = await response.text() + throw new Error(msg) + } + return await response.json() + } catch (e) { + const error = e as any + throw new Error(error) + } + } + + ///////////////////////////////////////////////////// Register + + registerWithPasswordStart = async ( + request: HttpRegisterWithPasswordStartRequest + ): Promise => { + const response = (await this.sendPostJson( + '/register_with_password_start', + EndpointType.Public, + request + )) as HttpRegisterWithPasswordStartResponse + + return response + } + + registerWithPasswordFinish = async ( + request: HttpRegisterWithPasswordFinishRequest + ): Promise => { + const response = (await this.sendPostJson( + '/register_with_password_finish', + EndpointType.Public, + request + )) as HttpRegisterWithPasswordFinishResponse + + return response + } + + registerWithPasskeyStart = async ( + request: HttpRegisterWithPasskeyStartRequest + ): Promise => { + const response = (await this.sendPostJson( + '/register_with_passkey_start', + EndpointType.Public, + request + )) as HttpRegisterWithPasskeyStartResponse + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.challenge = Buffer.from(response.publicKey.challenge, 'base64') + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.user.id = Buffer.from(response.publicKey.user.id, 'base64') + return response + } + + registerWithPasskeyFinish = async ( + request: HttpRegisterWithPasskeyFinishRequest + ): Promise => { + const response = (await this.sendPostJson( + '/register_with_passkey_finish', + EndpointType.Public, + request + )) as HttpRegisterWithPasskeyFinishResponse + + this.authToken = response.authToken + this.refreshToken = response.refreshToken + + return response + } + + verifyCode = async (request: HttpVerifyCodeRequest): Promise => { + const response = (await this.sendPostJson( + '/verify_code', + EndpointType.Public, + request + )) as HttpVerifyCodeResponse + + return response + } + + ///////////////////////////////////////////////////// Delete account + + deleteAccountStart = async (request: HttpDeleteAccountStartRequest): Promise => { + await this.sendPostJson('/delete_account_start', EndpointType.Private, request) + } + + deleteAccountFinish = async (request: HttpDeleteAccountFinishRequest): Promise => { + await this.sendPostJson('/delete_account_finish', EndpointType.Private, request) + } + + ///////////////////////////////////////////////////// Login + + loginWithPassword = async (request: HttpLoginRequest): Promise => { + const response = (await this.sendPostJson( + '/login_with_password', + EndpointType.Public, + request + )) as HttpLoginResponse + + this.authToken = response.authToken + this.refreshToken = response.refreshToken + + return response + } + + loginWithGoogle = async ( + request: HttpLoginWithGoogleRequest + ): Promise => { + const response = (await this.sendPostJson( + '/login_with_google', + EndpointType.Public, + request + )) as HttpLoginWithGoogleResponse + + this.authToken = response.authToken + this.refreshToken = response.refreshToken + + return response + } + + loginWithPasskeyStart = async ( + request: HttpLoginWithPasskeyStartRequest + ): Promise => { + const response = (await this.sendPostJson( + '/login_with_passkey_start', + EndpointType.Public, + request + )) as HttpLoginWithPasskeyStartResponse + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.challenge = Buffer.from(response.publicKey.challenge, 'base64') + if (response.publicKey.allowCredentials) { + response.publicKey.allowCredentials.forEach((c) => { + // @ts-expect-error Fixes in direct parsing of the response + c.id = Buffer.from(c.id, 'base64') + }) + } + return response + } + + loginWithPasskeyFinish = async ( + request: HttpLoginWithPasskeyFinishRequest + ): Promise => { + const response = (await this.sendPostJson( + '/login_with_passkey_finish', + EndpointType.Public, + request + )) as HttpLoginWithPasskeyFinishResponse + + this.authToken = response.authToken + this.refreshToken = response.refreshToken + + return response + } + + refreshAuthToken = async (enforceIp?: boolean): Promise => { + const request = { + refreshToken: this.refreshToken ?? '', + enforceIp: enforceIp ?? true + } as HttpRefreshRequest + + const response = (await this.sendPostJson( + '/refresh_token', + EndpointType.Public, + request + )) as HttpRefreshResponse + + // Replace the old token with the refreshed one + this.authToken = response.authToken + + return response + } + + ///////////////////////////////////////////////////// Credentials + + resetPasswordStart = async ( + request: HttpResetPasswordStartRequest + ): Promise => { + const response = (await this.sendPostJson( + '/reset_password_start', + EndpointType.Public, + request + )) as HttpResetPasswordStartResponse + + return response + } + + resetPasswordFinish = async ( + request: HttpResetPasswordFinishRequest + ): Promise => { + const response = (await this.sendPostJson( + '/reset_password_finish', + EndpointType.Public, + request + )) as HttpResetPasswordFinishResponse + + return response + } + + resetPasskeyStart = async ( + request: HttpResetPasskeyStartRequest + ): Promise => { + const response = (await this.sendPostJson( + '/reset_passkey_start', + EndpointType.Public, + request + )) as HttpResetPasskeyStartResponse + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.challenge = Buffer.from(response.publicKey.challenge, 'base64') + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.user.id = Buffer.from(response.publicKey.user.id, 'base64') + + return response + } + + resetPasskeyFinish = async ( + request: HttpResetPasskeyFinishRequest + ): Promise => { + const response = (await this.sendPostJson( + '/reset_passkey_finish', + EndpointType.Public, + request + )) as HttpResetPasskeyFinishResponse + + return response + } + + deletePasskey = async (request: HttpDeletePasskeyRequest): Promise => { + await this.sendPostJson('/delete_passkey', EndpointType.Private, request) + } + + addNewPasskeyStart = async (): Promise => { + const response = (await this.sendPostJson( + '/add_passkey_start', + EndpointType.Private, + {} + )) as HttpAddNewPasskeyStartResponse + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.challenge = Buffer.from(response.publicKey.challenge, 'base64') + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.user.id = Buffer.from(response.publicKey.user.id, 'base64') + + return response + } + + addNewPasskeyFinish = async (request: HttpAddNewPasskeyFinishRequest): Promise => { + await this.sendPostJson('/add_passkey_finish', EndpointType.Private, request) + } + + ///////////////////////////////////////////////////// Teams actions + + registerNewTeam = async ( + request: HttpRegisterNewTeamRequest + ): Promise => { + const response = (await this.sendPostJson( + '/register_new_team', + EndpointType.Private, + request + )) as HttpRegisterNewTeamResponse + + return response + } + + deleteTeam = async (request: HttpDeleteTeamRequest): Promise => { + await this.sendPostJson('/delete_team', EndpointType.Private, request) + } + + registerNewApp = async ( + request: HttpRegisterNewAppRequest + ): Promise => { + const response = (await this.sendPostJson( + '/register_new_app', + EndpointType.Private, + request + )) as HttpRegisterNewAppResponse + + return response + } + + deleteApp = async (request: HttpDeleteAppRequest): Promise => { + await this.sendPostJson('/delete_app', EndpointType.Private, request) + } + + inviteUserToTeam = async ( + request: HttpInviteUserToTeamRequest + ): Promise => { + const response = (await this.sendPostJson( + '/invite_user_to_team', + EndpointType.Private, + request + )) as HttpInviteUserToTeamResponse + + return response + } + + acceptTeamInvite = async ( + request: HttpAcceptTeamInviteRequest + ): Promise => { + const response = (await this.sendPostJson( + '/accept_team_invite', + EndpointType.Private, + request + )) as HttpAcceptTeamInviteResponse + + return response + } + + removeUserFromTeam = async ( + request: HttpRemoveUserFromTeamRequest + ): Promise => { + const response = (await this.sendPostJson( + '/remove_user_from_team', + EndpointType.Private, + request + )) as HttpRemoveUserFromTeamResponse + + return response + } + + leaveTeam = async (request: HttpLeaveTeamRequest): Promise => { + const response = (await this.sendPostJson( + '/leave_team', + EndpointType.Private, + request + )) as HttpLeaveTeamResponse + + return response + } + + cancelTeamUserInvite = async ( + request: HttpCancelTeamUserInviteRequest + ): Promise => { + const response = (await this.sendPostJson( + '/cancel_team_user_invite', + EndpointType.Private, + request + )) as HttpCancelTeamUserInviteResponse + + return response + } + + cancelUserTeamInvite = async ( + request: HttpCancelUserTeamInviteRequest + ): Promise => { + const response = (await this.sendPostJson( + '/cancel_user_team_invite', + EndpointType.Private, + request + )) as HttpCancelTeamUserInviteResponse + + return response + } + + changeUserPrivileges = async ( + request: HttpChangeUsersPrivilegesRequest + ): Promise => { + const response = (await this.sendPostJson( + '/change_user_privileges', + EndpointType.Private, + request + )) as HttpChangeUsersPrivilegesResponse + + return response + } + + ///////////////////////////////////////////////////// App actions + + verifyDomainStart = async ( + request: HttpVerifyDomainStartRequest + ): Promise => { + const response = (await this.sendPostJson( + '/verify_domain_start', + EndpointType.Private, + request + )) as HttpVerifyDomainStartResponse + + return response + } + + verifyDomainFinish = async ( + request: HttpVerifyDomainFinishRequest + ): Promise => { + const response = (await this.sendPostJson( + '/verify_domain_finish', + EndpointType.Private, + request + )) as HttpVerifyDomainFinishResponse + + return response + } + + removeDomain = async ( + request: HttpRemoveWhitelistedDomainRequest + ): Promise => { + const response = (await this.sendPostJson( + '/remove_whitelisted_domain', + EndpointType.Private, + request + )) as HttpRemoveWhitelistedDomainResponse + + return response + } + + cancelDomainVerification = async ( + request: HttpCancelPendingDomainVerificationRequest + ): Promise => { + const response = (await this.sendPostJson( + '/cancel_pending_domain_verification', + EndpointType.Private, + request + )) as HttpRemoveWhitelistedDomainResponse + + return response + } + + ///////////////////////////////////////////////////// Getters + + getUserTeamInvites = async (): Promise => { + const response = (await this.sendGetJson( + '/get_user_team_invites', + EndpointType.Private + )) as HttpGetUserTeamInvitesResponse + + return response + } + + getTeamUserInvites = async ( + request: HttpGetTeamUserInvitesRequest + ): Promise => { + const response = (await this.sendGetJson( + '/get_team_user_invites', + EndpointType.Private, + request + )) as HttpGetTeamUserInvitesResponse + + return response + } + + getUserJoinedTeams = async (): Promise => { + const response = (await this.sendGetJson( + '/get_user_joined_teams', + EndpointType.Private + )) as HttpGetUserJoinedTeamsResponse + + return response + } + + getAppEvents = async (request: HttpGetAppEventsRequest): Promise => { + const response = (await this.sendGetJson( + '/get_app_events', + EndpointType.Private, + request + )) as HttpGetAppEventsResponse + + return response + } + + getPasskeyChallenge = async (): Promise => { + const response = (await this.sendGetJson( + '/get_passkey_challenge', + EndpointType.Private + )) as HttpGetPasskeyChallengeResponse + + // @ts-expect-error Fixes in direct parsing of the response + response.publicKey.challenge = Buffer.from(response.publicKey.challenge, 'base64') + response.publicKey.allowCredentials?.forEach((c) => { + // @ts-expect-error Fixes in direct parsing of the response + c.id = Buffer.from(c.id, 'base64') + }) + return response + } + + getTeamUsersPrivileges = async ( + request: HttpGetTeamUsersPrivilegesRequest + ): Promise => { + const response = (await this.sendGetJson( + '/get_team_users_privileges', + EndpointType.Private, + request + )) as HttpGetTeamUsersPrivilegesResponse + + return response + } + + getUserMetadata = async (): Promise => { + const response = (await this.sendGetJson( + '/get_user_metadata', + EndpointType.Private + )) as HttpUserMetadataResponse + + return response + } + + getTeamMetadata = async ( + request: HttpGetTeamMetadataRequest + ): Promise => { + const response = (await this.sendGetJson( + '/get_team_metadata', + EndpointType.Private, + request + )) as HttpGetTeamMetadataResponse + + return response + } +} diff --git a/sdk/packages/cloud/src/e2e.test.ts b/sdk/packages/cloud/src/e2e.test.ts new file mode 100644 index 00000000..67a7b1be --- /dev/null +++ b/sdk/packages/cloud/src/e2e.test.ts @@ -0,0 +1,683 @@ +import { assert, describe, expect, test } from 'vitest' +import { NightlyCloud } from './app' +import { addUserToTeam, basicTeamSetup, createUser, randomEmail } from './testUtils' +import { + HttpCancelUserTeamInviteRequest, + HttpGetAppEventsRequest, + HttpInviteUserToTeamRequest, + HttpLeaveTeamRequest, + HttpLoginRequest, + HttpRegisterNewAppRequest, + HttpRegisterNewTeamRequest, + HttpRegisterWithPasswordStartRequest, + HttpRemoveUserFromTeamRequest +} from '../../../bindings' + +const TEST_ENDPOINT = 'http://127.0.0.1:6969/cloud' + +describe.concurrent( + 'Base Client tests', + () => { + test('#registerWithPassword()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + + const email = randomEmail() + '@gmail.com' + + const registerPayload = { + email, + password: 'Password123', + device: 'device', + browser: 'browser' + } as HttpRegisterWithPasswordStartRequest + + await cloudClient.registerWithPasswordStart(registerPayload) + }) + + test('#loginWithPassword()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const email = randomEmail() + '@gmail.com' + const password = 'Password123' + + const registerPayload = { + email, + password, + device: 'device', + browser: 'browser' + } as HttpRegisterWithPasswordStartRequest + + await cloudClient.registerWithPasswordStart(registerPayload) + + const authCode = await cloudClient.verifyCode({ + email, + code: '123456', + action: 'registerPassword' + }) + + await cloudClient.registerWithPasswordFinish({ + authCode: authCode.verificationCode, + email, + newPassword: password + }) + + const loginPayload = { + email, + password, + enforceIp: false + } as HttpLoginRequest + + const loginResponse = await cloudClient.loginWithPassword(loginPayload) + + assert(loginResponse.userId.length > 0) + }) + + test('#refreshToken()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const email = randomEmail() + '@gmail.com' + const password = 'Password123' + + const registerPayload = { + email, + password, + device: 'device', + browser: 'browser' + } as HttpRegisterWithPasswordStartRequest + + await cloudClient.registerWithPasswordStart(registerPayload) + + const authCode = await cloudClient.verifyCode({ + email, + code: '123456', + action: 'registerPassword' + }) + + await cloudClient.registerWithPasswordFinish({ + authCode: authCode.verificationCode, + email, + newPassword: password + }) + + const loginPayload = { + email, + password, + enforceIp: false + } as HttpLoginRequest + + const loginResponse = await cloudClient.loginWithPassword(loginPayload) + + assert(loginResponse.userId.length > 0) + + // Save current token + const currentToken = cloudClient.authToken + + // Refresh token + const refreshToken = await cloudClient.refreshAuthToken() + assert(refreshToken.authToken.length > 0) + + // Check if token is different + assert(currentToken !== refreshToken.authToken) + + // Check if token is valid + const response = await cloudClient.getUserMetadata() + assert(response.userId.length > 0) + assert(response.email === email) + }) + + test('#resetPassword()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + const { userId, email } = await createUser(cloudClient) + + // Send reset password request + const newPassword = 'NewPassword123124123' + await cloudClient.resetPasswordStart({ + email, + device: 'device', + browser: 'browser' + }) + + const authCode = await cloudClient.verifyCode({ + email, + code: '123456', + action: 'resetPassword' + }) + + // Finish reset password, the authCode doesn't matter + await cloudClient.resetPasswordFinish({ + authCode: authCode.verificationCode, + email, + newPassword: newPassword + }) + + // Login once again with new password + const loginPayload = { + email, + password: newPassword, + enforceIp: false + } as HttpLoginRequest + + const loginResponse = await cloudClient.loginWithPassword(loginPayload) + + assert(loginResponse.userId == userId) + }) + + test('#registerNewTeam()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create team + const registerTeamPayload = { + personal: false, + teamName: 'Test_Team' + } as HttpRegisterNewTeamRequest + + const response = await cloudClient.registerNewTeam(registerTeamPayload) + + assert(response.teamId.length > 0) + }, 10000) + + test('#registerNewApp()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create team + const registerTeamPayload = { + personal: false, + teamName: 'Test_Team' + } as HttpRegisterNewTeamRequest + + const teamId = (await cloudClient.registerNewTeam(registerTeamPayload)).teamId + + // create app + const registerAppPayload = { + teamId: teamId, + appName: 'Test_App', + ackPublicKeys: [], + whitelistedDomains: [] + } as HttpRegisterNewAppRequest + + const response = await cloudClient.registerNewApp(registerAppPayload) + + assert(response.appId.length > 0) + }) + + test('#getUserTeamInvites()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + const invitePayload = { + teamId: teamId, + userEmail: email + } as HttpInviteUserToTeamRequest + + // Use team admin client to invite new user + await cloudClient.inviteUserToTeam(invitePayload) + + // Get use team invites by new user + const response = await newClient.getUserTeamInvites() + + assert(response.teamInvites.length > 0) + assert(response.teamInvites[0].teamName === 'Test_Team') + assert(response.teamInvites[0].userEmail === email) + }) + + test('#getTeamUserInvites()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + const invitePayload = { + teamId: teamId, + userEmail: email + } as HttpInviteUserToTeamRequest + + // Use team admin client to invite new user + await cloudClient.inviteUserToTeam(invitePayload) + + // Get team invites by team admin + const payload = { + teamId: teamId + } as HttpInviteUserToTeamRequest + + const response = await cloudClient.getTeamUserInvites(payload) + + assert(response.teamInvites.length > 0) + assert(response.teamInvites[0].teamName === 'Test_Team') + assert(response.teamInvites[0].userEmail === email) + }) + + test('#acceptTeamInvite()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + const invitePayload = { + teamId: teamId, + userEmail: email + } as HttpInviteUserToTeamRequest + + // Use team admin client to invite new user + await cloudClient.inviteUserToTeam(invitePayload) + + // Get team invites by invited user + const payload = { + teamId: teamId + } as HttpInviteUserToTeamRequest + + const response = await cloudClient.getTeamUserInvites(payload) + + assert(response.teamInvites.length > 0) + assert(response.teamInvites[0].teamName === 'Test_Team') + assert(response.teamInvites[0].userEmail === email) + + // Accept team invite + const acceptPayload = { + teamId: teamId + } as HttpInviteUserToTeamRequest + + await newClient.acceptTeamInvite(acceptPayload) + + // Get team invites by invited user + const secondResponse = await cloudClient.getTeamUserInvites(payload) + + assert(secondResponse.teamInvites.length === 0) + }) + + test('#getUserJoinedTeams()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + // Get user joined team + const response = await newClient.getUserJoinedTeams() + + expect(Object.keys(response.teams)).toHaveLength(0) + expect(Object.keys(response.teamsApps)).toHaveLength(0) + expect(Object.keys(response.userPrivileges)).toHaveLength(0) + + // Add user to team + await addUserToTeam(cloudClient, newClient, teamId, email) + + // Get user joined team + const secondResponse = await newClient.getUserJoinedTeams() + + expect(Object.keys(secondResponse.teams)).toHaveLength(1) + expect(Object.keys(secondResponse.teamsApps)).toHaveLength(1) + expect(Object.keys(secondResponse.userPrivileges)).toHaveLength(1) + }) + + test('#removeUserFromTeam()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + // Get user joined team + const response = await newClient.getUserJoinedTeams() + + expect(Object.keys(response.teams)).toHaveLength(0) + expect(Object.keys(response.teamsApps)).toHaveLength(0) + expect(Object.keys(response.userPrivileges)).toHaveLength(0) + + // Add user to team + await addUserToTeam(cloudClient, newClient, teamId, email) + + // Get user joined team + const secondResponse = await newClient.getUserJoinedTeams() + + expect(Object.keys(secondResponse.teams)).toHaveLength(1) + expect(Object.keys(secondResponse.teamsApps)).toHaveLength(1) + expect(Object.keys(secondResponse.userPrivileges)).toHaveLength(1) + + const removePayload = { + teamId: teamId, + userEmail: email + } as HttpRemoveUserFromTeamRequest + + // Remove user from team + await cloudClient.removeUserFromTeam(removePayload) + + // Get user joined team + const thirdResponse = await newClient.getUserJoinedTeams() + + expect(Object.keys(thirdResponse.teams)).toHaveLength(0) + expect(Object.keys(thirdResponse.teamsApps)).toHaveLength(0) + expect(Object.keys(thirdResponse.userPrivileges)).toHaveLength(0) + }) + + test('#leaveTheTeam()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + // Get user joined team + const response = await newClient.getUserJoinedTeams() + + expect(Object.keys(response.teams)).toHaveLength(0) + expect(Object.keys(response.teamsApps)).toHaveLength(0) + expect(Object.keys(response.userPrivileges)).toHaveLength(0) + + // Add user to team + await addUserToTeam(cloudClient, newClient, teamId, email) + + // Get user joined team + const secondResponse = await newClient.getUserJoinedTeams() + + expect(Object.keys(secondResponse.teams)).toHaveLength(1) + expect(Object.keys(secondResponse.teamsApps)).toHaveLength(1) + expect(Object.keys(secondResponse.userPrivileges)).toHaveLength(1) + + const leavePayload = { + teamId: teamId, + device: 'device', + browser: 'browser' + } as HttpLeaveTeamRequest + + // Remove user from team + await newClient.leaveTeam(leavePayload) + + // Get user joined team + const thirdResponse = await newClient.getUserJoinedTeams() + + expect(Object.keys(thirdResponse.teams)).toHaveLength(0) + expect(Object.keys(thirdResponse.teamsApps)).toHaveLength(0) + expect(Object.keys(thirdResponse.userPrivileges)).toHaveLength(0) + }) + + test('#cancelTeamUserInvite()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + const invitePayload = { + teamId: teamId, + userEmail: email + } as HttpInviteUserToTeamRequest + + // Use team admin client to invite new user + await cloudClient.inviteUserToTeam(invitePayload) + + // Get team invites by team admin + const payload = { + teamId: teamId + } as HttpInviteUserToTeamRequest + + const response = await cloudClient.getTeamUserInvites(payload) + + assert(response.teamInvites.length > 0) + assert(response.teamInvites[0].teamName === 'Test_Team') + assert(response.teamInvites[0].userEmail === email) + + // Cancel team invite + const cancelPayload = { + teamId: teamId, + userEmail: email + } as HttpInviteUserToTeamRequest + + await cloudClient.cancelTeamUserInvite(cancelPayload) + + // Get team invites by team admin + const secondResponse = await cloudClient.getTeamUserInvites(payload) + + assert(secondResponse.teamInvites.length === 0) + }) + + test('#cancelUserTeamInvite()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + const invitePayload = { + teamId: teamId, + userEmail: email + } as HttpInviteUserToTeamRequest + + // Use team admin client to invite new user + await cloudClient.inviteUserToTeam(invitePayload) + + // Get team invites by new user + const response = await newClient.getUserTeamInvites() + + assert(response.teamInvites.length > 0) + assert(response.teamInvites[0].teamName === 'Test_Team') + assert(response.teamInvites[0].userEmail === email) + + // Cancel team invite by invited user + const cancelPayload = { + teamId: teamId + } as HttpCancelUserTeamInviteRequest + + await newClient.cancelUserTeamInvite(cancelPayload) + + // Get team invites by new user + const secondResponse = await newClient.getUserTeamInvites() + + assert(secondResponse.teamInvites.length === 0) + }) + + test('#getAppEvents()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // Get app events, should be empty + const payload = { + appId: appId + } as HttpGetAppEventsRequest + + const response = await cloudClient.getAppEvents(payload) + + expect(response.events).toHaveLength(0) + }) + + test('#changeUserPrivileges()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + const { userId: adminUserId, email: adminEmail } = await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + // Add user to team + await addUserToTeam(cloudClient, newClient, teamId, email) + + // Check user privileges + const firstResponse = await cloudClient.getTeamUsersPrivileges({ teamId }) + + assert(firstResponse.usersPrivileges.length === 2) + assert(firstResponse.usersPrivileges[0].userEmail === adminEmail) + assert(firstResponse.usersPrivileges[0].appId === appId) + assert(firstResponse.usersPrivileges[0].privilege === 'Admin') + assert(firstResponse.usersPrivileges[1].userEmail === email) + assert(firstResponse.usersPrivileges[1].appId === appId) + assert(firstResponse.usersPrivileges[1].privilege === 'Read') + + await cloudClient.changeUserPrivileges({ + teamId: teamId, + privilegesChanges: [{ appId, userEmail: email, newPrivilegeLevel: 'edit' }] + }) + + // Get privileges + const secondResponse = await cloudClient.getTeamUsersPrivileges({ teamId }) + + assert(secondResponse.usersPrivileges.length === 2) + assert(secondResponse.usersPrivileges[0].userEmail === adminEmail) + assert(secondResponse.usersPrivileges[0].appId === appId) + assert(secondResponse.usersPrivileges[0].privilege === 'Admin') + assert(secondResponse.usersPrivileges[1].userEmail === email) + assert(secondResponse.usersPrivileges[1].appId === appId) + assert(secondResponse.usersPrivileges[1].privilege === 'Edit') + }) + + test('#getUserMetadata()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + const { userId, email } = await createUser(cloudClient) + + // Get user metadata + const response = await cloudClient.getUserMetadata() + + assert(response.userId === userId) + assert(response.email === email) + assert(response.passwordSet === true) + assert(response.passkeyIds.length === 0) + }) + + test('#getTeamMetadata()', async () => { + const cloudClient: NightlyCloud = new NightlyCloud({ + url: TEST_ENDPOINT + }) + // create user + const { userId: adminUserId, email: adminEmail } = await createUser(cloudClient) + + // create basic team setup + const { teamId, appId } = await basicTeamSetup(cloudClient) + + // register new user + const newClient = new NightlyCloud({ + url: TEST_ENDPOINT + }) + const { userId, email } = await createUser(newClient) + + // Add user to team + await addUserToTeam(cloudClient, newClient, teamId, email) + + // Get team metadata + const response = await cloudClient.getTeamMetadata({ teamId }) + + assert(response.teamMetadata.teamId === teamId) + assert(response.teamMetadata.teamName === 'Test_Team') + assert(response.teamMetadata.creatorEmail === adminEmail) + assert(response.teamMetadata.personalTeam === false) + + assert(response.teamApps.length === 1) + assert(response.teamApps[0].appId === appId) + assert(response.teamApps[0].appName === 'Test_App') + assert(response.teamApps[0].ackPublicKeys.length === 0) + assert(response.teamApps[0].whitelistedDomains.length === 0) + + assert(response.teamMembers.length === 2) + assert(response.teamMembers.find((member) => member === adminEmail)) + assert(response.teamMembers.find((member) => member === email)) + }) + }, + { + timeout: 10000 + } +) diff --git a/sdk/packages/cloud/src/index.ts b/sdk/packages/cloud/src/index.ts new file mode 100644 index 00000000..b0159ff3 --- /dev/null +++ b/sdk/packages/cloud/src/index.ts @@ -0,0 +1,3 @@ +export * from './app' +export * from './utils' +export * from './passkeyTypes' diff --git a/sdk/packages/cloud/src/passkeyTypes.ts b/sdk/packages/cloud/src/passkeyTypes.ts new file mode 100644 index 00000000..bc966ec0 --- /dev/null +++ b/sdk/packages/cloud/src/passkeyTypes.ts @@ -0,0 +1,76 @@ +/// REFERENCE https://github.com/kanidm/webauthn-rs/blob/master/tutorial/server/axum/assets/auth.js + +// Register +export type HttpRegisterWithPasskeyStartResponse = { publicKey: PublicKeyCredentialCreationOptions } +export type HttpRegisterWithPasskeyFinishRequest = { + email: string + credential: { + id: string + rawId: string + type: string + response: { clientDataJSON: string; attestationObject: string } + } + authCode: string + enforceIp: boolean +} + +// Login +export type HttpLoginWithPasskeyStartResponse = { publicKey: PublicKeyCredentialRequestOptions } +export type HttpLoginWithPasskeyFinishRequest = { + email: string + credential: { + id: string + rawId: string + type: string + response: { + clientDataJSON: string + authenticatorData: string + signature: string + userHandle: string + } + } + enforceIp: boolean +} + +// Add passkey +export type HttpAddNewPasskeyStartResponse = { publicKey: PublicKeyCredentialCreationOptions } +export type HttpAddNewPasskeyFinishRequest = { + credential: { + id: string + rawId: string + type: string + response: { clientDataJSON: string; attestationObject: string } + } +} + +// Reset passkey +export type HttpResetPasskeyStartResponse = { publicKey: PublicKeyCredentialCreationOptions } +export type HttpResetPasskeyFinishRequest = { + email: string + credential: { + id: string + rawId: string + type: string + response: { clientDataJSON: string; attestationObject: string } + } + authCode: string +} + +// Passkey 2FA +export type HttpGetPasskeyChallengeResponse = { publicKey: PublicKeyCredentialRequestOptions } + +// 2FA actions +export type HttpDeletePasskeyRequest = { + passkeyId: string + credential: { + id: string + rawId: string + type: string + response: { + clientDataJSON: string + authenticatorData: string + signature: string + userHandle: string + } + } +} diff --git a/sdk/packages/cloud/src/testUtils.ts b/sdk/packages/cloud/src/testUtils.ts new file mode 100644 index 00000000..a3b4aed8 --- /dev/null +++ b/sdk/packages/cloud/src/testUtils.ts @@ -0,0 +1,97 @@ +import { + HttpInviteUserToTeamRequest, + HttpLoginRequest, + HttpRegisterNewAppRequest, + HttpRegisterNewTeamRequest, + HttpRegisterWithPasswordStartRequest +} from '../../../bindings' +import { NightlyCloud } from './app' + +export async function createUser( + cloudClient: NightlyCloud +): Promise<{ userId: string; email: string }> { + const email = randomEmail() + '@gmail.com' + const password = 'Password123' + + const registerPayload = { + email, + password, + device: 'device', + browser: 'browser' + } as HttpRegisterWithPasswordStartRequest + + await cloudClient.registerWithPasswordStart(registerPayload) + + const verifyResponse = await cloudClient.verifyCode({ + email, + code: '123456', + action: 'registerPassword' + }) + + await cloudClient.registerWithPasswordFinish({ + authCode: verifyResponse.verificationCode, + email, + newPassword: password + }) + + const loginPayload = { + email, + password, + enforceIp: false + } as HttpLoginRequest + + const userId = (await cloudClient.loginWithPassword(loginPayload)).userId.toString() + + return { userId, email } +} + +export async function addUserToTeam( + adminClient: NightlyCloud, + userClient: NightlyCloud, + teamId: string, + userEmail: string +): Promise { + const invitePayload = { + teamId: teamId, + userEmail: userEmail + } as HttpInviteUserToTeamRequest + + // Use team admin client to invite new user + await adminClient.inviteUserToTeam(invitePayload) + + // Accept team invite + const acceptPayload = { + teamId: teamId + } as HttpInviteUserToTeamRequest + + await userClient.acceptTeamInvite(acceptPayload) +} + +export async function basicTeamSetup( + cloudClient: NightlyCloud +): Promise<{ teamId: string; appId: string }> { + // create team + const registerTeamPayload = { + personal: false, + teamName: 'Test_Team' + } as HttpRegisterNewTeamRequest + + const teamId = (await cloudClient.registerNewTeam(registerTeamPayload)).teamId + + // create app + const registerAppPayload = { + teamId: teamId, + appName: 'Test_App', + ackPublicKeys: [], + whitelistedDomains: [] + } as HttpRegisterNewAppRequest + + const appId = (await cloudClient.registerNewApp(registerAppPayload)).appId + + // Return both teamId and appId in an object + return { teamId, appId } +} + +export function randomEmail(): string { + return Math.random().toString(36).substring(7) +} diff --git a/sdk/packages/cloud/src/utils.ts b/sdk/packages/cloud/src/utils.ts new file mode 100644 index 00000000..ef07ebb9 --- /dev/null +++ b/sdk/packages/cloud/src/utils.ts @@ -0,0 +1,10 @@ +export const DEFAULT_CLOUD_URL = 'https://nc2.nightly.app/cloud' +export enum Method { + POST = 'POST', + GET = 'GET' +} + +export enum EndpointType { + Private = '/private', + Public = '/public' +} diff --git a/sdk/packages/cloud/tsconfig.json b/sdk/packages/cloud/tsconfig.json new file mode 100644 index 00000000..75a9ae75 --- /dev/null +++ b/sdk/packages/cloud/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "lib": ["es2015", "DOM"], + "types": ["node"], + "target": "esnext", + "moduleDetection": "force", + "resolveJsonModule": true, + "allowJs": true, + "baseUrl": ".", + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "noImplicitAny": false, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "isolatedModules": true, + "noFallthroughCasesInSwitch": true, + "declaration": true, + "declarationDir": "types", + "emitDeclarationOnly": true, + "outDir": "dist", + "rootDir": "../.." + }, + "ts-node": { + "require": ["tsconfig-paths/register"] + }, + "include": ["../../bindings/*", "src/*"] +} diff --git a/sdk/packages/cloud/vitest.config.ts b/sdk/packages/cloud/vitest.config.ts new file mode 100644 index 00000000..b7b4aacd --- /dev/null +++ b/sdk/packages/cloud/vitest.config.ts @@ -0,0 +1,9 @@ +import tsconfigPath from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [tsconfigPath()], + test: { + // singleThread: true + } +}) diff --git a/sdk/pnpm-lock.yaml b/sdk/pnpm-lock.yaml index adf802d2..4464b74b 100644 --- a/sdk/pnpm-lock.yaml +++ b/sdk/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -95,16 +95,16 @@ importers: specifier: 0.0.29 version: link:../../packages/sui '@nightlylabs/wallet-selector-aptos': - specifier: 0.1.0 + specifier: 0.1.1 version: link:../../packages/selector-aptos '@nightlylabs/wallet-selector-base': specifier: ^0.4.0 version: link:../../packages/selector-base '@nightlylabs/wallet-selector-polkadot': - specifier: 0.2.4 + specifier: 0.2.5 version: link:../../packages/selector-polkadot '@nightlylabs/wallet-selector-solana': - specifier: 0.3.0 + specifier: 0.3.1 version: link:../../packages/selector-solana '@nightlylabs/wallet-selector-sui': specifier: 0.3.1 @@ -226,6 +226,61 @@ importers: specifier: ^4.3.9 version: 4.3.9(@types/node@20.9.0) + packages/analytics: + dependencies: + cross-fetch: + specifier: ^3.1.6 + version: 3.1.6 + uuid: + specifier: ^9.0.0 + version: 9.0.0 + devDependencies: + '@nightlylabs/nightly-cloud': + specifier: workspace:* + version: link:../cloud + '@nightlylabs/nightly-connect-base': + specifier: workspace:* + version: link:../base + '@rollup/plugin-commonjs': + specifier: ^25.0.0 + version: 25.0.0(rollup@3.23.1) + '@rollup/plugin-node-resolve': + specifier: ^15.1.0 + version: 15.2.1(rollup@3.23.1) + '@rollup/plugin-terser': + specifier: ^0.4.3 + version: 0.4.3(rollup@3.23.1) + '@rollup/plugin-typescript': + specifier: ^11.1.1 + version: 11.1.1(rollup@3.23.1)(tslib@2.5.3)(typescript@5.1.6) + '@types/node': + specifier: ^20.3.0 + version: 20.9.0 + '@vitest/ui': + specifier: ^0.31.1 + version: 0.31.1(vitest@0.31.1) + bs58: + specifier: ^5.0.0 + version: 5.0.0 + isomorphic-ws: + specifier: ^5.0.0 + version: 5.0.0(ws@8.14.2) + rollup: + specifier: ^3.23.1 + version: 3.23.1 + rollup-plugin-dts: + specifier: ^5.3.0 + version: 5.3.0(rollup@3.23.1)(typescript@5.1.6) + tslib: + specifier: ^2.5.3 + version: 2.5.3 + tweetnacl: + specifier: ^1.0.3 + version: 1.0.3 + typescript: + specifier: ^5.1.3 + version: 5.1.6 + packages/aptos: dependencies: '@aptos-labs/ts-sdk': @@ -327,6 +382,52 @@ importers: specifier: ^5.1.3 version: 5.1.6 + packages/cloud: + dependencies: + cross-fetch: + specifier: ^3.1.6 + version: 3.1.6 + uuid: + specifier: ^9.0.0 + version: 9.0.0 + devDependencies: + '@rollup/plugin-commonjs': + specifier: ^25.0.0 + version: 25.0.0(rollup@3.23.1) + '@rollup/plugin-node-resolve': + specifier: ^15.1.0 + version: 15.2.1(rollup@3.23.1) + '@rollup/plugin-terser': + specifier: ^0.4.3 + version: 0.4.3(rollup@3.23.1) + '@rollup/plugin-typescript': + specifier: ^11.1.1 + version: 11.1.1(rollup@3.23.1)(tslib@2.6.2)(typescript@5.1.6) + '@types/node': + specifier: ^20.3.0 + version: 20.9.0 + '@vitest/ui': + specifier: ^0.31.1 + version: 0.31.1(vitest@0.31.1) + bs58: + specifier: ^5.0.0 + version: 5.0.0 + rollup: + specifier: ^3.23.1 + version: 3.23.1 + rollup-plugin-dts: + specifier: ^5.3.0 + version: 5.3.0(rollup@3.23.1)(typescript@5.1.6) + tslib: + specifier: ^2.5.3 + version: 2.6.2 + tweetnacl: + specifier: ^1.0.3 + version: 1.0.3 + typescript: + specifier: ^5.1.3 + version: 5.1.6 + packages/eslint-config-custom: dependencies: '@typescript-eslint/eslint-plugin': @@ -905,346 +1006,8734 @@ importers: packages: - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: false - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.6.0): + '@algolia/autocomplete-core@1.9.3': resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.6.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - dev: false - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.6.0): + '@algolia/autocomplete-plugin-algolia-insights@1.9.3': resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) - search-insights: 2.6.0 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - dev: false - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0): + '@algolia/autocomplete-preset-algolia@1.9.3': resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) - '@algolia/client-search': 4.18.0 - algoliasearch: 4.18.0 - dev: false - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0): + '@algolia/autocomplete-shared@1.9.3': resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/client-search': 4.18.0 - algoliasearch: 4.18.0 - dev: false - /@algolia/cache-browser-local-storage@4.18.0: + '@algolia/cache-browser-local-storage@4.18.0': resolution: {integrity: sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==} - dependencies: - '@algolia/cache-common': 4.18.0 - dev: false - /@algolia/cache-common@4.18.0: + '@algolia/cache-common@4.18.0': resolution: {integrity: sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==} - dev: false - /@algolia/cache-in-memory@4.18.0: + '@algolia/cache-in-memory@4.18.0': resolution: {integrity: sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==} - dependencies: - '@algolia/cache-common': 4.18.0 - dev: false - /@algolia/client-account@4.18.0: + '@algolia/client-account@4.18.0': resolution: {integrity: sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==} - dependencies: - '@algolia/client-common': 4.18.0 - '@algolia/client-search': 4.18.0 - '@algolia/transporter': 4.18.0 - dev: false - /@algolia/client-analytics@4.18.0: + '@algolia/client-analytics@4.18.0': resolution: {integrity: sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==} - dependencies: - '@algolia/client-common': 4.18.0 - '@algolia/client-search': 4.18.0 - '@algolia/requester-common': 4.18.0 - '@algolia/transporter': 4.18.0 - dev: false - /@algolia/client-common@4.18.0: + '@algolia/client-common@4.18.0': resolution: {integrity: sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==} - dependencies: - '@algolia/requester-common': 4.18.0 - '@algolia/transporter': 4.18.0 - dev: false - /@algolia/client-personalization@4.18.0: + '@algolia/client-personalization@4.18.0': resolution: {integrity: sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==} - dependencies: - '@algolia/client-common': 4.18.0 - '@algolia/requester-common': 4.18.0 - '@algolia/transporter': 4.18.0 - dev: false - /@algolia/client-search@4.18.0: + '@algolia/client-search@4.18.0': resolution: {integrity: sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==} - dependencies: - '@algolia/client-common': 4.18.0 - '@algolia/requester-common': 4.18.0 - '@algolia/transporter': 4.18.0 - dev: false - /@algolia/events@4.0.1: + '@algolia/events@4.0.1': resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} - dev: false - /@algolia/logger-common@4.18.0: + '@algolia/logger-common@4.18.0': resolution: {integrity: sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==} - dev: false - /@algolia/logger-console@4.18.0: + '@algolia/logger-console@4.18.0': resolution: {integrity: sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==} - dependencies: - '@algolia/logger-common': 4.18.0 - dev: false - /@algolia/requester-browser-xhr@4.18.0: + '@algolia/requester-browser-xhr@4.18.0': resolution: {integrity: sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==} - dependencies: - '@algolia/requester-common': 4.18.0 - dev: false - /@algolia/requester-common@4.18.0: + '@algolia/requester-common@4.18.0': resolution: {integrity: sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==} - dev: false - /@algolia/requester-node-http@4.18.0: + '@algolia/requester-node-http@4.18.0': resolution: {integrity: sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==} - dependencies: - '@algolia/requester-common': 4.18.0 - dev: false - /@algolia/transporter@4.18.0: + '@algolia/transporter@4.18.0': resolution: {integrity: sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==} - dependencies: - '@algolia/cache-common': 4.18.0 - '@algolia/logger-common': 4.18.0 - '@algolia/requester-common': 4.18.0 - dev: false - /@alloc/quick-lru@5.2.0: + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - dev: false - /@ampproject/remapping@2.2.1: + '@ampproject/remapping@2.2.1': resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - /@antfu/utils@0.7.4: + '@antfu/utils@0.7.4': resolution: {integrity: sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==} - /@aptos-labs/aptos-client@0.1.0: + '@aptos-labs/aptos-client@0.1.0': resolution: {integrity: sha512-q3s6pPq8H2buGp+tPuIRInWsYOuhSEwuNJPwd2YnsiID3YSLihn2ug39ktDJAcSOprUcp7Nid8WK7hKqnUmSdA==} engines: {node: '>=15.10.0'} - dependencies: - axios: 1.6.2 - got: 11.8.6 - transitivePeerDependencies: - - debug - dev: false - /@aptos-labs/ts-sdk@1.9.1: + '@aptos-labs/ts-sdk@1.9.1': resolution: {integrity: sha512-aXoKbBKkhHutgKokEErFQHnyV8mheak01xqWZQIh3EExOkC0/KOFdWmCmOIXkXg1px2wiKHfPzg3ZW34142Kyw==} engines: {node: '>=11.0.0'} - dependencies: - '@aptos-labs/aptos-client': 0.1.0 - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.1 - eventemitter3: 5.0.1 - form-data: 4.0.0 - tweetnacl: 1.0.3 - transitivePeerDependencies: - - debug - dev: false - /@aptos-labs/wallet-standard@0.0.11: + '@aptos-labs/wallet-standard@0.0.11': resolution: {integrity: sha512-8dygyPBby7TaMJjUSyeVP4R1WC9D/FPpX9gVMMLaqTKCXrSbkzhGDxcuwbMZ3ziEwRmx3zz+d6BIJbDhd0hm5g==} - dependencies: - '@aptos-labs/ts-sdk': 1.9.1 - '@wallet-standard/core': 1.0.3 - transitivePeerDependencies: - - debug - dev: false - /@aw-web-design/x-default-browser@1.4.88: + '@aw-web-design/x-default-browser@1.4.88': resolution: {integrity: sha512-AkEmF0wcwYC2QkhK703Y83fxWARttIWXDmQN8+cof8FmFZ5BRhnNXGymeb1S73bOCLfWjYELxtujL56idCN/XA==} hasBin: true - dependencies: - default-browser-id: 3.0.0 - dev: true - /@babel/code-frame@7.12.11: + '@babel/code-frame@7.12.11': resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - dependencies: - '@babel/highlight': 7.18.6 - /@babel/code-frame@7.21.4: + '@babel/code-frame@7.21.4': resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - /@babel/compat-data@7.22.3: + '@babel/compat-data@7.22.3': resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.12.9: + '@babel/core@7.12.9': resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.22.3 - '@babel/helper-module-transforms': 7.22.1 - '@babel/helpers': 7.22.3 - '@babel/parser': 7.22.4 - '@babel/template': 7.21.9 - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - lodash: 4.17.21 - resolve: 1.22.2 - semver: 5.7.1 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/core@7.21.8: + '@babel/core@7.21.8': resolution: {integrity: sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.22.3 - '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.21.8) - '@babel/helper-module-transforms': 7.22.1 - '@babel/helpers': 7.22.3 - '@babel/parser': 7.22.4 - '@babel/template': 7.21.9 - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/core@7.22.1: + '@babel/core@7.22.1': resolution: {integrity: sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.22.3 - '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) - '@babel/helper-module-transforms': 7.22.1 - '@babel/helpers': 7.22.3 - '@babel/parser': 7.22.4 - '@babel/template': 7.21.9 - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.5 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - /@babel/generator@7.21.9: + '@babel/generator@7.21.9': resolution: {integrity: sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - dev: true - /@babel/generator@7.22.3: + '@babel/generator@7.22.3': resolution: {integrity: sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.18.6: + '@babel/helper-annotate-as-pure@7.18.6': resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - /@babel/helper-annotate-as-pure@7.22.5: + '@babel/helper-annotate-as-pure@7.22.5': resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.3: + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.3': resolution: {integrity: sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - /@babel/helper-compilation-targets@7.22.1(@babel/core@7.21.8): + '@babel/helper-compilation-targets@7.22.1': resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.22.3 - '@babel/core': 7.21.8 + + '@babel/helper-create-class-features-plugin@7.22.1': + resolution: {integrity: sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.22.1': + resolution: {integrity: sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.3.3': + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + + '@babel/helper-define-polyfill-provider@0.4.0': + resolution: {integrity: sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + + '@babel/helper-environment-visitor@7.22.1': + resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.21.0': + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.18.6': + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.22.3': + resolution: {integrity: sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.5': + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.22.1': + resolution: {integrity: sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-optimise-call-expression@7.18.6': + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.10.4': + resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} + + '@babel/helper-plugin-utils@7.21.5': + resolution: {integrity: sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.18.9': + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.22.1': + resolution: {integrity: sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.21.5': + resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.20.0': + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.18.6': + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.22.5': + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.5': + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.22.5': + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.20.5': + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.22.3': + resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.18.6': + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.21.9': + resolution: {integrity: sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.22.4': + resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6': + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3': + resolution: {integrity: sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-proposal-async-generator-functions@7.20.7': + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-class-static-block@7.21.0': + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-proposal-dynamic-import@7.18.6': + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-export-namespace-from@7.18.9': + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-json-strings@7.18.6': + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-logical-assignment-operators@7.20.7': + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-numeric-separator@7.18.6': + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-object-rest-spread@7.12.1': + resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-object-rest-spread@7.20.7': + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-optional-catch-binding@7.18.6': + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-optional-chaining@7.21.0': + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0': + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-unicode-property-regex@7.18.6': + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.21.4': + resolution: {integrity: sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.20.0': + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.22.3': + resolution: {integrity: sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.12.1': + resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.21.4': + resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.22.5': + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.21.4': + resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.21.5': + resolution: {integrity: sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.22.3': + resolution: {integrity: sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.20.7': + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.18.6': + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.21.0': + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.22.3': + resolution: {integrity: sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.22.3': + resolution: {integrity: sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.21.0': + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.21.5': + resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.21.3': + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.18.6': + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.18.9': + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dynamic-import@7.22.1': + resolution: {integrity: sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.18.6': + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.22.3': + resolution: {integrity: sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.21.0': + resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.21.5': + resolution: {integrity: sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.18.9': + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.22.3': + resolution: {integrity: sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.18.9': + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.22.3': + resolution: {integrity: sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.18.6': + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.20.11': + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.21.5': + resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.22.3': + resolution: {integrity: sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.18.6': + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.22.3': + resolution: {integrity: sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.22.3': + resolution: {integrity: sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.22.3': + resolution: {integrity: sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.22.3': + resolution: {integrity: sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.22.3': + resolution: {integrity: sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.18.6': + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.22.3': + resolution: {integrity: sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.22.3': + resolution: {integrity: sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.22.3': + resolution: {integrity: sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.22.3': + resolution: {integrity: sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.22.3': + resolution: {integrity: sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.18.6': + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.22.5': + resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.22.5': + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.22.5': + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.22.3': + resolution: {integrity: sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.22.5': + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.22.5': + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.21.5': + resolution: {integrity: sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.18.6': + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.22.5': + resolution: {integrity: sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.18.6': + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.20.7': + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.18.6': + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.18.9': + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.18.9': + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.22.3': + resolution: {integrity: sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.21.5': + resolution: {integrity: sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.22.3': + resolution: {integrity: sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.18.6': + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.22.3': + resolution: {integrity: sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.21.5': + resolution: {integrity: sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-env@7.22.4': + resolution: {integrity: sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.21.4': + resolution: {integrity: sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.5': + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-react@7.22.5': + resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.21.5': + resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.21.0': + resolution: {integrity: sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime-corejs3@7.22.5': + resolution: {integrity: sha512-TNPDN6aBFaUox2Lu+H/Y1dKKQgr4ucz/FGyCz67RVYLsBpVpUFf1dDngzg+Od8aqbrqwyztkaZjtWCZEUOT8zA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.22.3': + resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.21.9': + resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.21.5': + resolution: {integrity: sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.22.4': + resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.21.5': + resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.22.5': + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + engines: {node: '>=6.9.0'} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@docsearch/css@3.5.1': + resolution: {integrity: sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==} + + '@docsearch/react@3.5.1': + resolution: {integrity: sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + + '@docusaurus/core@2.4.1': + resolution: {integrity: sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==} + engines: {node: '>=16.14'} + hasBin: true + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/cssnano-preset@2.4.1': + resolution: {integrity: sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==} + engines: {node: '>=16.14'} + + '@docusaurus/logger@2.4.1': + resolution: {integrity: sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==} + engines: {node: '>=16.14'} + + '@docusaurus/mdx-loader@2.4.1': + resolution: {integrity: sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/module-type-aliases@2.4.1': + resolution: {integrity: sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==} + peerDependencies: + react: '*' + react-dom: '*' + + '@docusaurus/plugin-content-blog@2.4.1': + resolution: {integrity: sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/plugin-content-docs@2.4.1': + resolution: {integrity: sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/plugin-content-pages@2.4.1': + resolution: {integrity: sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/plugin-debug@2.4.1': + resolution: {integrity: sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/plugin-google-analytics@2.4.1': + resolution: {integrity: sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/plugin-google-gtag@2.4.1': + resolution: {integrity: sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/plugin-google-tag-manager@2.4.1': + resolution: {integrity: sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/plugin-sitemap@2.4.1': + resolution: {integrity: sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/preset-classic@2.4.1': + resolution: {integrity: sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/react-loadable@5.5.2': + resolution: {integrity: sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==} + peerDependencies: + react: '*' + + '@docusaurus/theme-classic@2.4.1': + resolution: {integrity: sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/theme-common@2.4.1': + resolution: {integrity: sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/theme-search-algolia@2.4.1': + resolution: {integrity: sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/theme-translations@2.4.1': + resolution: {integrity: sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==} + engines: {node: '>=16.14'} + + '@docusaurus/types@2.4.1': + resolution: {integrity: sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + + '@docusaurus/utils-common@2.4.1': + resolution: {integrity: sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==} + engines: {node: '>=16.14'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + + '@docusaurus/utils-validation@2.4.1': + resolution: {integrity: sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==} + engines: {node: '>=16.14'} + + '@docusaurus/utils@2.4.1': + resolution: {integrity: sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==} + engines: {node: '>=16.14'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + + '@esbuild/android-arm64@0.16.10': + resolution: {integrity: sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.17.19': + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.16.10': + resolution: {integrity: sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.17.19': + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.16.10': + resolution: {integrity: sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.17.19': + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.16.10': + resolution: {integrity: sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.17.19': + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.16.10': + resolution: {integrity: sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.17.19': + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.16.10': + resolution: {integrity: sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.17.19': + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.16.10': + resolution: {integrity: sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.17.19': + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.16.10': + resolution: {integrity: sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.17.19': + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.16.10': + resolution: {integrity: sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.17.19': + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.16.10': + resolution: {integrity: sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.17.19': + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.14.54': + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.16.10': + resolution: {integrity: sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.17.19': + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.16.10': + resolution: {integrity: sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.17.19': + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.16.10': + resolution: {integrity: sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.17.19': + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.16.10': + resolution: {integrity: sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.17.19': + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.16.10': + resolution: {integrity: sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.17.19': + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.16.10': + resolution: {integrity: sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.17.19': + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.16.10': + resolution: {integrity: sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.17.19': + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.16.10': + resolution: {integrity: sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.17.19': + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.16.10': + resolution: {integrity: sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.17.19': + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.16.10': + resolution: {integrity: sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.17.19': + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.16.10': + resolution: {integrity: sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.17.19': + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.16.10': + resolution: {integrity: sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.17.19': + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.5.1': + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@0.4.3': + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + + '@eslint/eslintrc@2.1.0': + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.44.0': + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fal-works/esbuild-plugin-global-externals@2.1.2': + resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@headlessui/react@1.7.15': + resolution: {integrity: sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + + '@humanwhocodes/config-array@0.11.10': + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/config-array@0.5.0': + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@1.2.1': + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.4.3': + resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.5.0': + resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.5.0': + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.0': + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.3': + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + + '@jridgewell/sourcemap-codec@1.4.14': + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.18': + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@leichtgewicht/ip-codec@2.0.4': + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + + '@lit-labs/ssr-dom-shim@1.1.1': + resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + + '@lit/reactive-element@1.6.2': + resolution: {integrity: sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==} + + '@mapbox/node-pre-gyp@1.0.10': + resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true + + '@mdx-js/mdx@1.6.22': + resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} + + '@mdx-js/react@1.6.22': + resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 + + '@mdx-js/react@2.3.0': + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' + + '@mdx-js/util@1.6.22': + resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} + + '@mysten/bcs@0.7.3': + resolution: {integrity: sha512-fbusBfsyc2MpTACi72H5edWJ670T84va+qn9jSPpb5BzZ+pzUM1Q0ApPrF5OT+mB1o5Ng+mxPQpBCZQkfiV2TA==} + + '@mysten/bcs@0.7.4': + resolution: {integrity: sha512-6DKzM4L10Au3Og5EJRBqJZmXWZ7hS/clVjbVUH4sA0aFtS3AZo2xc+r5fUFfdJbaWZUxVaDiQ8BNiEZWkAnEOw==} + + '@mysten/sui.js@0.40.0': + resolution: {integrity: sha512-PEGdMe+QgpIdDIpyO4/yb+CK4x3Hki+kYPbQ5n3DVsWyb2ztFwB+5oYdc7qG3QkniO1lnCrlSHqZ5mN+x3RzrQ==} + engines: {node: '>=16'} + + '@mysten/sui.js@0.42.0': + resolution: {integrity: sha512-khYpfrWTRNk7WTuDWJx/KCbleqY1B40gVRt1DttqlNkD2lvg134xZn7F/r94jxgnUETbK+hVoQvBY7F36MsfRw==} + engines: {node: '>=16'} + + '@mysten/wallet-adapter-base@0.9.0': + resolution: {integrity: sha512-Obcfd30AC0Tcyvqc9+h0vvjrRB6Td2PNWhxRlTq/hSxDY66M3XqTLgoO8wDBtz+91oga4obAYvM02m7xV7X0Zw==} + deprecated: Wallet adapters have been deprecated in favor of the Wallet Standard. Please upgrade to the latest Wallet Kit versions. + + '@mysten/wallet-adapter-wallet-standard@0.8.0': + resolution: {integrity: sha512-WPQSQTUvQCX2PPuVU8NHEzXg+mMCzIKqMG6llt0tLxc4enTtFHw9Do4i298NyZ00zWWzHdx9MXjBOl1OuybURg==} + deprecated: Wallet adapters have been deprecated in favor of the Wallet Standard. Please upgrade to the latest Wallet Kit versions. + + '@mysten/wallet-kit-core@0.6.3': + resolution: {integrity: sha512-Crm18bHFecxqDI6ZGhHCAOB8CpLQ84NB3RFpvYnyk0yDGzNcYahjaG37ns+M7cHp0jbg64ySRV/ETzOaGPfRIw==} + + '@mysten/wallet-kit@0.7.3': + resolution: {integrity: sha512-wkmVny9Cqu2AiLf7FW3wq11+XNOoCi/gQ6ZiKcMsRmTWT8uoP7BG89lsIkP98lOARUa/GaWjTItESiHBNYXcZw==} + peerDependencies: + react: '*' + react-dom: '*' + + '@mysten/wallet-standard@0.6.0': + resolution: {integrity: sha512-xE/OijN9zIPoTjTWuxlYMHtp7kXPcAR8dDAbxOIH5h7EZCTk+G6p+SzDp8jV5magf50VcYP0cVjS4CQLx1wQuQ==} + + '@mysten/wallet-standard@0.8.0': + resolution: {integrity: sha512-kFh1iybKxaY+lchN+rtVBT5+UL1IHorZ81Ktg9200tcLeUqLB3V/K1PRqkj2dk0eUGDaLEH+yWjBF9hnyH4rgQ==} + + '@ndelangen/get-tarball@3.0.9': + resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} + + '@next/env@13.4.10': + resolution: {integrity: sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==} + + '@next/eslint-plugin-next@13.4.10': + resolution: {integrity: sha512-YJqyq6vk39JQfvaNtN83t/p5Jy45+bazRL+V4QI8FPd3FBqFYMEsULiwRLgSJMgFqkk4t4JbeZurz+gILEAFpA==} + + '@next/swc-darwin-arm64@13.4.10': + resolution: {integrity: sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@13.4.10': + resolution: {integrity: sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@13.4.10': + resolution: {integrity: sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@13.4.10': + resolution: {integrity: sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@13.4.10': + resolution: {integrity: sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@13.4.10': + resolution: {integrity: sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@13.4.10': + resolution: {integrity: sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@13.4.10': + resolution: {integrity: sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@13.4.10': + resolution: {integrity: sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nightlylabs/nightly-connect-base@0.0.27': + resolution: {integrity: sha512-aDpQJicIjL7S+EzwBgUzMEY/L/HtFalfhf4APE3GaDqK9JqtLJDO9d2RmUQDinTtb1mG9MsHpWBtU6fjYo+PHw==} + + '@nightlylabs/nightly-connect-polkadot@0.0.15': + resolution: {integrity: sha512-WCsumvHwhPipbxPQoswKCwHykwJ48Dffwb9hCf7zjCgEysIBCnA6Dzj/2G80drLqYYpS285nMa8z+3NaXVu2dA==} + + '@nightlylabs/nightly-connect-solana@0.0.28': + resolution: {integrity: sha512-8PBkmuXzWZNPqu6SGT2tsGK4DgD3yswQsUVb3L+GgFGCdQI7eUqyHd2ofWFWzEgj4a1XuixA29ZcSyw20ajgzw==} + + '@nightlylabs/nightly-connect-sui@0.0.28': + resolution: {integrity: sha512-2+4YFTN+86J3kGYQMKiurThU5J+3g1+IDtCnv9+JSXvagU1bU9Kfps5NGCYASGlZ9Ut6duAoMiw8IBwr0Rd0mQ==} + + '@nightlylabs/qr-code@2.0.4': + resolution: {integrity: sha512-GU8u8Cm1Q5YnoB/kikM4whFQhJ7ZWKaazBm4wiZK9Qi64Ht9tyRVzASBbZRpeOZVzxwi7Mml5sz0hUKPEFMpdA==} + + '@nightlylabs/wallet-selector-base@0.2.4': + resolution: {integrity: sha512-r5WktkwgsNz6SFgEXnWYKdxmQMU2+0emckxyJqGgi9bnV5TnohWmXMaRHukB202ptYUI++37tbZa7P3DXm+BqQ==} + + '@nightlylabs/wallet-selector-modal@0.1.2': + resolution: {integrity: sha512-vxy9S2dEf3NARW6LDq2ZKpWMlk5JJFIuwUfSxkuJlgUg2OVSlnDS7vdho3h4DmluRU5GM9vVhaXUGHAVp5sDQg==} + + '@nightlylabs/wallet-selector-solana@0.2.6': + resolution: {integrity: sha512-cVTKk+c6tGv4GeSQMlUaZ2si4A6ySKj41emkGJ8OtuwmtzwUym4Xuh3chXZYgGrMQgvPrX5+erIR4oq2GmGIPg==} + + '@nightlylabs/wallet-selector-sui@0.2.6': + resolution: {integrity: sha512-FlFPbNo64leFM2qrH3obYH7UiXdyFjYtaojbuOqJW+a0+5LSwY3Wvjj5UEP4m968FCRXuTYkEliDiTm7c+4Hbg==} + + '@noble/curves@1.0.0': + resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} + + '@noble/curves@1.1.0': + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.3.0': + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + + '@noble/hashes@1.3.0': + resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} + + '@noble/hashes@1.3.1': + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@open-rpc/client-js@1.8.1': + resolution: {integrity: sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g==} + + '@pkgr/utils@2.4.2': + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@1.0.0-next.21': + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + + '@polkadot/api-augment@10.10.1': + resolution: {integrity: sha512-J0r1DT1M5y75iO1iwcpUBokKD3q6b22kWlPfiHEDNFydVw5vm7OTRBk9Njjl8rOnlSzcW/Ya8qWfV/wkrqHxUQ==} + engines: {node: '>=16'} + + '@polkadot/api-base@10.10.1': + resolution: {integrity: sha512-joH2Ywxnn+AStkw+JWAdF3i3WJy4NcBYp0SWJM/WqGafWR/FuHnati2pcj/MHzkHT8JkBippmSSJFvsqRhlwcQ==} + engines: {node: '>=16'} + + '@polkadot/api-derive@10.10.1': + resolution: {integrity: sha512-Q9Ibs4eRPqdV8qnRzFPD3dlWNbLHxRqMqNTNPmNQwKPo5m6fcQbZ0UZy3yJ+PI9S4AQHGhsWtfoi5qW8006GHQ==} + engines: {node: '>=16'} + + '@polkadot/api@10.10.1': + resolution: {integrity: sha512-YHVkmNvjGF4Eg3thAbVhj9UX3SXx+Yxk6yVuzsEcckEudIRHzL2ikIWGCfUprfzSeFNpUCKdJIi1tsxVHtA7Tg==} + engines: {node: '>=16'} + + '@polkadot/extension-inject@0.46.5': + resolution: {integrity: sha512-QcpkCMuv7iFbWjufkw14JRozpEYFyjP0H8KOJ8IsHGfPd2DPiismQ0NXr+AS7f6U+0I+Rhv9E4dnXxtJPROVMQ==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/api': '*' + '@polkadot/util': '*' + + '@polkadot/keyring@12.5.1': + resolution: {integrity: sha512-u6b+Q7wI6WY/vwmJS9uUHy/5hKZ226nTlVNmxjkj9GvrRsQvUSwS94163yHPJwiZJiIv5xK5m0rwCMyoYu+wjA==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': 12.5.1 + '@polkadot/util-crypto': 12.5.1 + + '@polkadot/networks@12.3.2': + resolution: {integrity: sha512-uCkyybKoeEm1daKr0uT/9oNDHDDzCy2/ZdVl346hQqfdR1Ct3BaxMjxqvdmb5N8aCw0cBWSfgsxAYtw8ESmllQ==} + engines: {node: '>=16'} + + '@polkadot/networks@12.5.1': + resolution: {integrity: sha512-PP6UUdzz6iHHZH4q96cUEhTcydHj16+61sqeaYEJSF6Q9iY+5WVWQ26+rdjmre/EBdrMQkSS/CKy73mO5z/JkQ==} + engines: {node: '>=16'} + + '@polkadot/rpc-augment@10.10.1': + resolution: {integrity: sha512-PcvsX8DNV8BNDXXnY2K8F4mE7cWz7fKg8ykXNZTN8XUN6MrI4k/ohv7itYic7X5LaP25ZmQt5UiGyjKDGIELow==} + engines: {node: '>=16'} + + '@polkadot/rpc-core@10.10.1': + resolution: {integrity: sha512-awfFfJYsVF6W4DrqTj5RP00SSDRNB770FIoe1QE1Op4NcSrfeLpwh54HUJS716f4l5mOSYuvMp+zCbKzt8zKow==} + engines: {node: '>=16'} + + '@polkadot/rpc-provider@10.10.1': + resolution: {integrity: sha512-VMDWoJgx6/mPHAOT66Sq+Jf2lJABfV/ZUIXtT2k8HjOndbm6oKrFqGEOSSLvB2q4olDee3FkFFxkyW1s6k4JaQ==} + engines: {node: '>=16'} + + '@polkadot/rpc-provider@10.9.1': + resolution: {integrity: sha512-4QzT2QzD+320+eT6b79sGAA85Tt3Bb8fQvse4r5Mom2iiBd2SO81vOhxSAOaIe4GUsw25VzFJmsbe7+OObItdg==} + engines: {node: '>=16'} + + '@polkadot/types-augment@10.10.1': + resolution: {integrity: sha512-XRHE75IocXfFE6EADYov3pqXCyBk5SWbiHoZ0+4WYWP9SwMuzsBaAy84NlhLBlkG3+ehIqi0HpAd/qrljJGZbg==} + engines: {node: '>=16'} + + '@polkadot/types-augment@10.9.1': + resolution: {integrity: sha512-OY9/jTMFRFqYdkUnfcGwqMLC64A0Q25bjvCuVQCVjsPFKE3wl0Kt5rNT01eV2UmLXrR6fY0xWbR2w80bLA7CIQ==} + engines: {node: '>=16'} + + '@polkadot/types-codec@10.10.1': + resolution: {integrity: sha512-ETPG0wzWzt/bDKRQmYbO7CLe/0lUt8VrG6/bECdv+Kye+8Qedba2LZyTWm/9f2ngms8TZ82yI8mPv/mozdtfnw==} + engines: {node: '>=16'} + + '@polkadot/types-codec@10.9.1': + resolution: {integrity: sha512-mJ5OegKGraY1FLvEa8FopRCr3pQrhDkcn5RNOjmgJQozENVeRaxhk0NwxYz7IojFvSDnKnc6lNQfKaaSe5pLHg==} + engines: {node: '>=16'} + + '@polkadot/types-create@10.10.1': + resolution: {integrity: sha512-7OiLzd+Ter5zrpjP7fDwA1m89kd38VvMVixfOSv8x7ld2pDT+yyyKl14TCwRSWrKWCMtIb6M3iasPhq5cUa7cw==} + engines: {node: '>=16'} + + '@polkadot/types-create@10.9.1': + resolution: {integrity: sha512-OVz50MGTTuiuVnRP/zAx4CTuLioc0hsiwNwqN2lNhmIJGtnQ4Vy/7mQRsIWehiYz6g0Vzzm5B3qWkTXO1NSN5w==} + engines: {node: '>=16'} + + '@polkadot/types-known@10.10.1': + resolution: {integrity: sha512-yRa1lbDRqg3V/zoa0vSwdGOiYTIWktILW8OfkaLDExTu0GZBSbVHZlLAta52XVpA9Zww7mrUUC9+iernOwk//w==} + engines: {node: '>=16'} + + '@polkadot/types-support@10.10.1': + resolution: {integrity: sha512-Cd2mwk9RG6LlX8X3H0bRY7wCTbZPqU3z38CMFhvNkFDAyjqKjtn8hpS4n8mMrZK2EwCs/MjQH1wb7rtFkaWmJw==} + engines: {node: '>=16'} + + '@polkadot/types-support@10.9.1': + resolution: {integrity: sha512-XsieuLDsszvMZQlleacQBfx07i/JkwQV/UxH9q8Hz7Okmaz9pEVEW1h3ka2/cPuC7a4l32JhaORBUYshBZNdJg==} + engines: {node: '>=16'} + + '@polkadot/types@10.10.1': + resolution: {integrity: sha512-Ben62P1tjYEhKag34GBGcLX6NqcFR1VD5nNbWaxgr+t36Jl/tlHs6P9DlbFqQP7Tt9FmGrAYY0m3oTkhjG1NzA==} + engines: {node: '>=16'} + + '@polkadot/types@10.9.1': + resolution: {integrity: sha512-AG33i2ZGGfq7u+5rkAdGrXAQHHl844/Yv+junH5ZzX69xiCoWO1bH/yzDUNBdpki2GlACWvF9nLYh3F2tVF93w==} + engines: {node: '>=16'} + + '@polkadot/util-crypto@12.3.2': + resolution: {integrity: sha512-pTpx+YxolY0BDT4RcGmgeKbHHD/dI6Ll9xRsqmVdIjpcVVY20uDNTyXs81ZNtfKgyod1y9JQkfNv2Dz9iEpTkQ==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': 12.3.2 + + '@polkadot/util-crypto@12.5.1': + resolution: {integrity: sha512-Y8ORbMcsM/VOqSG3DgqutRGQ8XXK+X9M3C8oOEI2Tji65ZsXbh9Yh+ryPLM0oBp/9vqOXjkLgZJbbVuQceOw0A==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': 12.5.1 + + '@polkadot/util@12.3.2': + resolution: {integrity: sha512-y/JShcGyOamCUiSIg++XZuLHt1ktSKBaSH2K5Nw5NXlgP0+7am+GZzqPB8fQ4qhYLruEOv+YRiz0GC1Zr9S+wg==} + engines: {node: '>=16'} + + '@polkadot/util@12.5.1': + resolution: {integrity: sha512-fDBZL7D4/baMG09Qowseo884m3QBzErGkRWNBId1UjWR99kyex+cIY9fOSzmuQxo6nLdJlLHw1Nz2caN3+Bq0A==} + engines: {node: '>=16'} + + '@polkadot/wasm-bridge@7.2.1': + resolution: {integrity: sha512-uV/LHREDBGBbHrrv7HTki+Klw0PYZzFomagFWII4lp6Toj/VCvRh5WMzooVC+g/XsBGosAwrvBhoModabyHx+A==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-bridge@7.2.2': + resolution: {integrity: sha512-CgNENd65DVYtackOVXXRA0D1RPoCv5+77IdBCf7kNqu6LeAnR4nfTI6qjaApUdN1xRweUsQjSH7tu7VjkMOA0A==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto-asmjs@7.2.1': + resolution: {integrity: sha512-z/d21bmxyVfkzGsKef/FWswKX02x5lK97f4NPBZ9XBeiFkmzlXhdSnu58/+b1sKsRAGdW/Rn/rTNRDhW0GqCAg==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto-asmjs@7.2.2': + resolution: {integrity: sha512-wKg+cpsWQCTSVhjlHuNeB/184rxKqY3vaklacbLOMbUXieIfuDBav5PJdzS3yeiVE60TpYaHW4iX/5OYHS82gg==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto-init@7.2.1': + resolution: {integrity: sha512-GcEXtwN9LcSf32V9zSaYjHImFw16hCyo2Xzg4GLLDPPeaAAfbFr2oQMgwyDbvBrBjLKHVHjsPZyGhXae831amw==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto-init@7.2.2': + resolution: {integrity: sha512-vD4iPIp9x+SssUIWUenxWLPw4BVIwhXHNMpsV81egK990tvpyIxL205/EF5QRb1mKn8WfWcNFm5tYwwh9NdnnA==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto-wasm@7.2.1': + resolution: {integrity: sha512-DqyXE4rSD0CVlLIw88B58+HHNyrvm+JAnYyuEDYZwCvzUWOCNos/DDg9wi/K39VAIsCCKDmwKqkkfIofuOj/lA==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto-wasm@7.2.2': + resolution: {integrity: sha512-3efoIB6jA3Hhv6k0YIBwCtlC8gCSWCk+R296yIXRLLr3cGN415KM/PO/d1JIXYI64lbrRzWRmZRhllw3jf6Atg==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto@7.2.1': + resolution: {integrity: sha512-SA2+33S9TAwGhniKgztVN6pxUKpGfN4Tre/eUZGUfpgRkT92wIUT2GpGWQE+fCCqGQgADrNiBcwt6XwdPqMQ4Q==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto@7.2.2': + resolution: {integrity: sha512-1ZY1rxUTawYm0m1zylvBMFovNIHYgG2v/XoASNp/EMG5c8FQIxCbhJRaTBA983GVq4lN/IAKREKEp9ZbLLqssA==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-util@7.2.1': + resolution: {integrity: sha512-FBSn/3aYJzhN0sYAYhHB8y9JL8mVgxLy4M1kUXYbyo+8GLRQEN5rns8Vcb8TAlIzBWgVTOOptYBvxo0oj0h7Og==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-util@7.2.2': + resolution: {integrity: sha512-N/25960ifCc56sBlJZ2h5UBpEPvxBmMLgwYsl7CUuT+ea2LuJW9Xh8VHDN/guYXwmm92/KvuendYkEUykpm/JQ==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/x-bigint@12.3.2': + resolution: {integrity: sha512-JLqLgfGXe/x+hZJETd5ZqfpVsbwyMsH5Nn1Q20ineMMjXN/ig+kVR8Mc15LXBMuw4g7LldFW6UUrotWnuMI8Yw==} + engines: {node: '>=16'} + + '@polkadot/x-bigint@12.5.1': + resolution: {integrity: sha512-Fw39eoN9v0sqxSzfSC5awaDVdzojIiE7d1hRSQgVSrES+8whWvtbYMR0qwbVhTuW7DvogHmye41P9xKMlXZysg==} + engines: {node: '>=16'} + + '@polkadot/x-fetch@12.3.2': + resolution: {integrity: sha512-3IEuZ5S+RI/t33NsdPLIIa5COfDCfpUW2sbaByEczn75aD1jLqJZSEDwiBniJ2osyNd4uUxBf6e5jw7LAZeZJg==} + engines: {node: '>=16'} + + '@polkadot/x-fetch@12.5.1': + resolution: {integrity: sha512-Bc019lOKCoQJrthiS+H3LwCahGtl5tNnb2HK7xe3DBQIUx9r2HsF/uEngNfMRUFkUYg5TPCLFbEWU8NIREBS1A==} + engines: {node: '>=16'} + + '@polkadot/x-global@12.3.2': + resolution: {integrity: sha512-yVZq6oIegjlyh5rUZiTklgu+fL+W/DG1ypEa02683tUCB3avV5cA3PAHKptMSlb6FpweHu37lKKrqfAWrraDxg==} + engines: {node: '>=16'} + + '@polkadot/x-global@12.5.1': + resolution: {integrity: sha512-6K0YtWEg0eXInDOihU5aSzeb1t9TiDdX9ZuRly+58ALSqw5kPZYmQLbzE1d8HWzyXRXK+YH65GtLzfMGqfYHmw==} + engines: {node: '>=16'} + + '@polkadot/x-randomvalues@12.3.2': + resolution: {integrity: sha512-ywjIs8CWpvOGmq+3cGCNPOHxAjPHdBUiXyDccftx5BRVdmtbt36gK/V84bKr6Xs73FGu0jprUAOSRRsLZX/3dg==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': 12.3.2 + '@polkadot/wasm-util': '*' + + '@polkadot/x-randomvalues@12.5.1': + resolution: {integrity: sha512-UsMb1d+77EPNjW78BpHjZLIm4TaIpfqq89OhZP/6gDIoS2V9iE/AK3jOWKm1G7Y2F8XIoX1qzQpuMakjfagFoQ==} + engines: {node: '>=16'} + peerDependencies: + '@polkadot/util': 12.5.1 + '@polkadot/wasm-util': '*' + + '@polkadot/x-textdecoder@12.3.2': + resolution: {integrity: sha512-lY5bfA5xArJRWEJlYOlQQMJeTjWD8s0yMhchirVgf5xj8Id9vPGeUoneH+VFDEwgXxrqBvDFJ4smN4T/r6a/fg==} + engines: {node: '>=16'} + + '@polkadot/x-textdecoder@12.5.1': + resolution: {integrity: sha512-j2YZGWfwhMC8nHW3BXq10fAPY02ObLL/qoTjCMJ1Cmc/OGq18Ep7k9cXXbjFAq3wf3tUUewt/u/hStKCk3IvfQ==} + engines: {node: '>=16'} + + '@polkadot/x-textencoder@12.3.2': + resolution: {integrity: sha512-iP3qEBiHzBckQ9zeY7ZHRWuu7mCEg5SMpOugs6UODRk8sx6KHzGQYlghBbWLit0uppPDVE0ifEwZ2n73djJHWQ==} + engines: {node: '>=16'} + + '@polkadot/x-textencoder@12.5.1': + resolution: {integrity: sha512-1JNNpOGb4wD+c7zFuOqjibl49LPnHNr4rj4s3WflLUIZvOMY6euoDuN3ISjQSHCLlVSoH0sOCWA3qXZU4bCTDQ==} + engines: {node: '>=16'} + + '@polkadot/x-ws@12.3.2': + resolution: {integrity: sha512-yM9Z64pLNlHpJE43+Xtr+iUXmYpFFY5u5hrke2PJt13O48H8f9Vb9cRaIh94appLyICoS0aekGhDkGH+MCspBA==} + engines: {node: '>=16'} + + '@polkadot/x-ws@12.5.1': + resolution: {integrity: sha512-efNMhB3Lh6pW2iTipMkqwrjpuUtb3EwR/jYZftiIGo5tDPB7rqoMOp9s6KRFJEIUfZkLnMUtbkZ5fHzUJaCjmQ==} + engines: {node: '>=16'} + + '@pwrs/lit-css@2.0.0': + resolution: {integrity: sha512-Yb2Q+7ZlCfdCbQ4tvlpQ9uzwB2yc340fdEoeUu2FdO3w6z4+YLPQAPerV1XA8uFxQtSn88nCW4kH+J0TVL3Iyg==} + + '@rollup/plugin-commonjs@24.1.0': + resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@25.0.0': + resolution: {integrity: sha512-hoho2Kay9TZrLu0bnDsTTCaj4Npa+THk9snajP/XDNb9a9mmjTjh52EQM9sKl3HD1LsnihX7js+eA2sd2uKAhw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-image@3.0.2': + resolution: {integrity: sha512-eGVrD6lummWH5ENo9LWX3JY62uBb9okUNQ2htXkugrG6WjACrMUVhWvss+0wW3fwJWmFYpoEny3yL4spEdh15g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.0.0': + resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@13.3.0': + resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + + '@rollup/plugin-node-resolve@15.1.0': + resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.2.1': + resolution: {integrity: sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.3': + resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-typescript@11.1.1': + resolution: {integrity: sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.0.2': + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rushstack/eslint-patch@1.3.2': + resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} + + '@scure/base@1.1.1': + resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} + + '@scure/base@1.1.3': + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + + '@scure/base@1.1.5': + resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} + + '@scure/bip32@1.3.2': + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + + '@scure/bip32@1.3.3': + resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@sideway/address@4.1.4': + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.25.24': + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + + '@sindresorhus/is@0.14.0': + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@slorber/static-site-generator-webpack-plugin@4.0.7': + resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} + engines: {node: '>=14'} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/wallet-adapter-base@0.9.22': + resolution: {integrity: sha512-xbLEZPGSJFvgTeldG9D55evhl7QK/3e/F7vhvcA97mEt1eieTgeKMnGlmmjs3yivI3/gtZNZeSk1XZLnhKcQvw==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.58.0 + + '@solana/wallet-standard-chains@1.0.0': + resolution: {integrity: sha512-kr3+JAo7mEBhVCH9cYzjn/vXeUiZeYfB4BF6E8u3U2jq3KlZA/KB+YM976+zGumTfN0NmMXUm066pTTG9kJsNQ==} + engines: {node: '>=16'} + + '@solana/wallet-standard-core@1.0.0': + resolution: {integrity: sha512-58wYbx2FpV1lE+rsIfme6FhzwQcBQAy4dcLqDJJ5HSI3OCBdeyv8PytDuYi3CSDo3u0UFynvHCYTsn1FeBx4tw==} + engines: {node: '>=16'} + + '@solana/wallet-standard-features@1.0.1': + resolution: {integrity: sha512-SUfx7KtBJ55XIj0qAhhVcC1I6MklAXqWFEz9hDHW+6YcJIyvfix/EilBhaBik1FJ2JT0zukpOfFv8zpuAbFRbw==} + engines: {node: '>=16'} + + '@solana/wallet-standard-util@1.0.0': + resolution: {integrity: sha512-qRAOBXnN7dwvtgzTtxIHsSeJAMbGNZdSWs57TT8pCyBrKL5dVxaK2u95Dm17SRSzwfKl/EByV1lTjOxXyKWS+g==} + engines: {node: '>=16'} + + '@solana/wallet-standard-wallet-adapter-base@1.0.2': + resolution: {integrity: sha512-QqkupdWvWuihX87W6ijt174u6ZdP5OSFlNhZhuhoMlIdyI/sj7MhGsdppuRlMh65oVO2WNWTL9y2bO5Pbx+dfg==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.58.0 + bs58: ^4.0.1 + + '@solana/wallet-standard-wallet-adapter-react@1.0.2': + resolution: {integrity: sha512-0YTPUnjiSG5ajDP2hK8EipxkeHhO3+nCtXeF1eS/ZP2QcFAgS/4luywrn/6CdfzQ2cQYPCFdnG/QculpUp6bBg==} + engines: {node: '>=16'} + peerDependencies: + '@solana/wallet-adapter-base': '*' + react: '*' + + '@solana/wallet-standard-wallet-adapter@1.0.2': + resolution: {integrity: sha512-xVMIr/+Be4ftmNXJ5QJWSinIeUPYShWFeR5i7c2TBRkc1WFK+pRgNUl0mPhBo5hZU/oyrwo+g8NTb8mS9a1Shw==} + engines: {node: '>=16'} + + '@solana/wallet-standard@1.0.2': + resolution: {integrity: sha512-bv3qJng+Uyy9okCdsrfrMVJjnmbhj4/EzOhCQVKX9VY0nW6gXXjV6uwu7GPdRwYNxBP+lgNejrDI8QPfE9W45g==} + engines: {node: '>=16'} + + '@solana/web3.js@1.77.2': + resolution: {integrity: sha512-pKu9S21NGAi6Nsayz2KEdhqOlPUJIr3L911bgQvPg2Dbk/U4gJsk41XGdxyfsfnwKPEI/KbitcByterst4VQ3g==} + deprecated: This build contains a bad TypeScript definition for getProgramAccounts + + '@solidjs/meta@0.28.2': + resolution: {integrity: sha512-avlLgBPdk4KVxzRGFlYp/MIJo8B5jVgXPgk6OUnUP8km21Z+ovO+DUd7ZPA7ejv8PBdWi9GE3zCzw8RU2YuV2Q==} + peerDependencies: + solid-js: '>=1.4.0' + + '@solidjs/router@0.8.2': + resolution: {integrity: sha512-gUKW+LZqxtX6y/Aw6JKyy4gQ9E7dLqp513oB9pSYJR1HM5c56Pf7eijzyXX+b3WuXig18Cxqah4tMtF0YGu80w==} + peerDependencies: + solid-js: ^1.5.3 + + '@stitches/react@1.2.8': + resolution: {integrity: sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==} + peerDependencies: + react: '>= 16.3.0' + + '@storybook/addon-actions@7.0.18': + resolution: {integrity: sha512-3M5AU/ZD79YP88vKlFezIJbIoG/II7wCixUBTmwiC3BeQZDuVsqPNl8eiP6MGT70xwyx7a993lSM5f5N5W93vg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-backgrounds@7.0.18': + resolution: {integrity: sha512-cPQy1Ot7Urf4hQz+xnF1YKrqSyR0DRwozBmF+sGzceACWmueFl0CifYZC8RSmaiIyVh0RyWPxZ9F/eT67NX2lA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-controls@7.0.18': + resolution: {integrity: sha512-mD6DE52CCMKugXk2Uab0QxwgfE76kFJroxASmnePnXUNWfP9EZJpJXYE3cyyBbmZuxa46VHDGGEGXQWRl4+Eog==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-docs@7.0.18': + resolution: {integrity: sha512-oq+ZN5809gIRdTZQIpeK1F8BJtL1/VWo9rWvl6ymVOL/Xzdgd7AOfKf9Y99X35RcxAGysRIHLGJjF4bgLoY1Aw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/addon-essentials@7.0.18': + resolution: {integrity: sha512-0XXu7xhtRefA1WxxorKk6BWeeB+7gQ+r2+bG1zQEfBgDYPR06YbPw4H79IZ8JiR97aJRsZBK5UUhOZMDrc5zcQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/addon-highlight@7.0.18': + resolution: {integrity: sha512-a3nfUhbu6whoDclIZSV/fzLj132tNNjV05ENTpuN3JpLoMd3+obDUWzeQUs9TetK4RBRN3ewM7sIMEI4oBpgmg==} + + '@storybook/addon-links@7.0.18': + resolution: {integrity: sha512-xEwflt7bp9FRoZVeqPGb6d3s2Gh+/jaSmnyIxMxrBy2oovKIqu9ptolqz1AhjFOXfaLs9c2RAmJUuFZJtETLxA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-measure@7.0.18': + resolution: {integrity: sha512-iu8vQpGOA+CFYbWR6QNshj20o33OQ/xcTbp5P4U6xGYDUliUBbwJ2KLxcKlmIeBanBrBdz0jPFtHwY4dM1ZdKw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-outline@7.0.18': + resolution: {integrity: sha512-3vNWO7ezo6GIvidbz8JxFrKtfVEoTQN7tnZx+wpqmCF8ihBORewkpeMUnvgb9ZKjD0X7gE8eQvvG8KKWcyHDBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-toolbars@7.0.18': + resolution: {integrity: sha512-mwhq962o0WloHAeFjJ6BXO2nzdTo5KE2fqawPpqcB2lwXP6tvaA2tDWwgntjPCHejqWTS+ZTdO4/1xrMhWYt/g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-viewport@7.0.18': + resolution: {integrity: sha512-aVVLBsWXfGDX3z1pc93LWWdG5RUoJbGL/JJPMZGwXdwWpP8V3OBl8D8bgPymyg+MgwhSRZZDDGgnJaVGGwZ6bQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/blocks@7.0.18': + resolution: {integrity: sha512-HLsuzmUdVIeFXEP5v5vyjnEePRNYjzltwTjCKQhHAlt8/aQZmREiIMOfoMoAa1Rd+On8Ib2DUd2cN10VS18H8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/builder-manager@7.0.18': + resolution: {integrity: sha512-yFMm3xuYkyg2hS1uz3CkvyvLzK7qJsDPVEh7lew8GiJK1Xx8cc+FnAOlRTjWNxvhfiT296wAMCTPWv7LeoSgqQ==} + + '@storybook/builder-vite@7.0.18': + resolution: {integrity: sha512-Qze6/PwUJq+z776dBoG5uinAEVZyPalZIaU/VOWpTrN8L9FQbL0+HDrZU2E/BMNW+ZfnSjF3V2USLyiutsC1Tw==} + peerDependencies: + '@preact/preset-vite': '*' + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 + vite-plugin-glimmerx: '*' + peerDependenciesMeta: + '@preact/preset-vite': + optional: true + typescript: + optional: true + vite-plugin-glimmerx: + optional: true + + '@storybook/channel-postmessage@7.0.18': + resolution: {integrity: sha512-rpwBH5ANdPnugS6+7xG9qHSoS+aPSEnBxDKsONWFubfMTTXQuFkf/793rBbxGkoINdqh8kSdKOM2rIty6e9cmQ==} + + '@storybook/channel-postmessage@7.0.26': + resolution: {integrity: sha512-ZvFLr/tUD9dWIjQtIn1JXHjqrbOP/uEEOqzwpKSVj0Cl4Vgc12s8hecbzBufkOF7fwLsFvfieSi7ENOmjoncdQ==} + + '@storybook/channel-websocket@7.0.18': + resolution: {integrity: sha512-QYsZIfe23NN4i+oIdPKHaYBehk3a/HYk57a+M2oR3Frmv8IOqc/e31uH+xx5NxnjHrTJj7Y80ZJw6EKB682S6w==} + + '@storybook/channels@7.0.18': + resolution: {integrity: sha512-rkA7ea0M3+dWS+71iHJdiZ5R2QuIdiVg0CgyLJHDagc1qej7pEVNhMWtppeq+X5Pwp9nkz8ZTQ7aCjTf6th0/A==} + + '@storybook/channels@7.0.26': + resolution: {integrity: sha512-Br3XILhrtuL5Sdp91I04kKjJzSqU/N8gGL6B6nIfnuaHUvGMDuMCHAB+g7aoiyH5dnpDZ6yBVGNwtYAyJA+0Og==} + + '@storybook/cli@7.0.18': + resolution: {integrity: sha512-9n4J4thiCUsGSXiRc6ZysqYUaCMCrpu0/qgC+5ngfFRuMmZgUV0y5+0fmaOhT2XjsonTTgucizO82i7+ottCVg==} + hasBin: true + + '@storybook/client-api@7.0.26': + resolution: {integrity: sha512-55Oy5Es8ACABWT01iddUJHt8oT4VnuCvec/FUC4iN7ITiOGjk7YzZB3NftmD6C5+pVQC99buspuwg7IFxmj+Aw==} + + '@storybook/client-logger@7.0.18': + resolution: {integrity: sha512-uKgFdVedYoRDZBVrE1IBdWNHDFln1IxWEeI+7ZiNSQwREG9swHpU5Fa8DceclM/oLjJRuzG1jFzv+XZY8894+Q==} + + '@storybook/client-logger@7.0.26': + resolution: {integrity: sha512-OMVLbgceoeuM8sWOfTX/9a4zCrH78G32hg7x8yXLZnRJ9OLaHJHzUM0Onc4MLudqVUdaKH0c8ejpBXUyIr1rJQ==} + + '@storybook/codemod@7.0.18': + resolution: {integrity: sha512-+9XFns29e8FpPLsqA8ZCQ3mNnIIKD3QnqGYkbkCVKi/G1fomvVQsIfsnkrYv5SobTbz29B4aNWxAaeSnO7/OGg==} + + '@storybook/components@7.0.18': + resolution: {integrity: sha512-Jn1CbF9UAKt8BVaZtuhmthpcZ02VMaCFXR0ISfDXCpiMKnylmpP0+WfXcoKLzz6yS+EW8EW5S9+Qq8xgQY8H7A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/core-client@7.0.18': + resolution: {integrity: sha512-ueExRZx6fd9LRssgdhDJ0bL4Ir2RrbXzJz/kjIT2KgYY3l7jkhe0dpT3bOgGKjQt0f7XMFU24t/r7aDLGMB+2Q==} + + '@storybook/core-common@7.0.18': + resolution: {integrity: sha512-HZAB1NIK/Yv0x9poyzqYcue2tx39+MAF1mbHgGy+JJZRerO2fRShgo8f8VPH9ChbFCoJ7isL5wNhgGdg9kp2kA==} + + '@storybook/core-events@7.0.18': + resolution: {integrity: sha512-7gxHBQDezdKOeq/u1LL80Bwjfcwsv7XOS3yWQElcgqp+gLaYB6OwwgtkCB2yV6a6l4nep9IdPWE8G3TxIzn9xw==} + + '@storybook/core-events@7.0.26': + resolution: {integrity: sha512-ckZszphEAYs9wp8tPVhayEMzk8JxCiQfzbq0S45sbdqdTrl40PmsOjv5iPNaUYElI/Stfz+v4gDCEUfOsxyC+w==} + + '@storybook/core-server@7.0.18': + resolution: {integrity: sha512-zGSGYSoCaSXM28OYKW7zsmpo8VU1icubXLRgdF21fbMhFN1WVS+bPA5+gSkAMf8acq5RNM8uSKskh7E2YDVEqA==} + + '@storybook/csf-plugin@7.0.18': + resolution: {integrity: sha512-Cr/Qr4/H4JIYgbbmDjQIYuqjp6nOaZga73R3KZcuClk27B90sI2ADegMYvORgbFgSkwweNQjgak6hLoOyogAhw==} + + '@storybook/csf-tools@7.0.18': + resolution: {integrity: sha512-0IJ2qdrxleTl67FUzsEvGcy96CY0OKyERE33tAsLNbvWcabdJKpLHP+rJwbsCw4z6IlS+kkmEffeFf5qRPTwkQ==} + + '@storybook/csf@0.1.1': + resolution: {integrity: sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg==} + + '@storybook/docs-mdx@0.1.0': + resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} + + '@storybook/docs-tools@7.0.18': + resolution: {integrity: sha512-H95dW2DquGQ75ZVrFjvznPdCxT0eW6esDnemzLJB61KitcYZrWRavfrZzFtUcpzIa84OgY5pllFYt636v11LHQ==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/manager-api@7.0.18': + resolution: {integrity: sha512-anQkm09twL96YkKGXHa+LI0+yMaY6Jxs1lRaetHdMlIqN4VHBHhizHaMgtGfH6xCTuO3WdrKTN7cZii5RH7PBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/manager@7.0.18': + resolution: {integrity: sha512-hasb8XDmkT9lyX2cwb3Xg0ngcNQ1QCNHKurl2YJtXowb1CvawGKokhnVUTso15NCnurolDyw/Wqka1sagfm+Mg==} + + '@storybook/mdx2-csf@1.1.0': + resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} + + '@storybook/node-logger@7.0.18': + resolution: {integrity: sha512-cIeKEBvELtoVP/5UeQ01GJWZ7wM69/9Q+R5uOtNQBlwWFcCD6AVFWMRqq7ObMvdJG/okhXSF+sDetb+BF3zvdw==} + + '@storybook/postinstall@7.0.18': + resolution: {integrity: sha512-ObIwAK2UiYhXN/7UifISQgBoH5jnyxh6T8kvCw83YhC78SDOPNgIGjToJECizJ7iubtqAWtCfCT5TrGEpyLGbg==} + + '@storybook/preview-api@7.0.18': + resolution: {integrity: sha512-xxtC0gPGMn/DbwvS4ZuJaBwfFNsjUCf0yLYHFrNe6fxncbvcLZ550RuyUwYuIRfsiKrlgfa3QmmCa4JM/JesHQ==} + + '@storybook/preview-api@7.0.26': + resolution: {integrity: sha512-uJwA4errBOZOoDF2T7Z2oLqjAYvvjMr31sTsOoT0niJtWr29RQp8yS6VoSrsuh+y3FAVqBEl5pS+DX3IGLjvxw==} + + '@storybook/preview@7.0.18': + resolution: {integrity: sha512-L53p2eo8G12U6tp7hD3mk5tdWFXLvdEyV9e7a1x9bw1LfH15K/bp8lO6U/W1kkpse7+rqWBqoTjJC1Ktm5Sxog==} + + '@storybook/react-dom-shim@7.0.18': + resolution: {integrity: sha512-O1FRypR8q1katjbznnxI+NtALd2gaWa7KnTwbIDf+ddZltXHMZ8xMiEGEtAMrfXlIuqIr9UvmLRfKZC/ysuA+g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/router@7.0.18': + resolution: {integrity: sha512-Mue4s/BnKgdYcsiW9yuvW3qL9k3AgYn5HIhnkBExAteyiUGdAca4IJFhArmGgFktgeLc4ecBQ7sgaCljApnbgg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/telemetry@7.0.18': + resolution: {integrity: sha512-JP5Z7lGU+oKjNmz2cZW5J7EerwyWBBPOU+NvvooZsymIx02ZvJ4ClmFtolJnBM7m4KoAy50JxV5NQWi+q8PicQ==} + + '@storybook/theming@7.0.18': + resolution: {integrity: sha512-P1gMKa/mKQHIMq0sxBIwTzAcF6v/6hrc62YmkuV62vXu+8zNV2YWbRwywqm3Q6faZEadmb/bL9+z8whaKhCL/g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/types@7.0.18': + resolution: {integrity: sha512-qPop2CbvmX42/BX29YT9jIzW2TlMcMjAE+KCpcKLBiD1oT5DJ1fhMzpe6RW9HkMegkBxjWx54iamN4oHM/pwcQ==} + + '@storybook/types@7.0.26': + resolution: {integrity: sha512-5RBi6agtDglNXdffmw4+Fyv2dUdlIdeOdUj0O5+JRYajTxfHdurZd9r/42z4OstN+ORDkLA/svt8Q9JyRpIb6Q==} + + '@storybook/web-components-vite@7.0.18': + resolution: {integrity: sha512-OQbaSnwNHikC9nfz3dSZIvD1RhrDT5AIst+ZYxGbYLkgxlmZv/SBmEt+XH4nX1XLhR9gFu6Qd3b+r/4xT2b/WA==} + engines: {node: ^14.18 || >=16} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/web-components@7.0.18': + resolution: {integrity: sha512-nDs9AuRd9vvAXg2E7M/pN1ChQcUHKkmqqvswT8KUlr0o0qoZnAtUloeFVH+4X06s/OZco7ROkHn1CQp1vbH5Sw==} + engines: {node: '>=16.0.0'} + peerDependencies: + lit: ^2.0.0 + + '@substrate/connect-extension-protocol@1.0.1': + resolution: {integrity: sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==} + + '@substrate/connect@0.7.26': + resolution: {integrity: sha512-uuGSiroGuKWj1+38n1kY5HReer5iL9bRwPCzuoLtqAOmI1fGI0hsSI2LlNQMAbfRgr7VRHXOk5MTuQf5ulsFRw==} + + '@substrate/connect@0.7.33': + resolution: {integrity: sha512-1B984/bmXVQvTT9oV3c3b7215lvWmulP9rfP3T3Ri+OU3uIsyCzYw0A+XG6J8/jgO2FnroeNIBWlgoLaUM1uzw==} + + '@substrate/ss58-registry@1.43.0': + resolution: {integrity: sha512-USEkXA46P9sqClL7PZv0QFsit4S8Im97wchKG0/H/9q3AT/S76r40UHfCr4Un7eBJPE23f7fU9BZ0ITpP9MCsA==} + + '@suchipi/femver@1.0.0': + resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} + + '@svgr/babel-plugin-add-jsx-attribute@6.5.1': + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1': + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@6.5.1': + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@6.5.1': + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@6.5.1': + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@6.5.1': + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@6.5.1': + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@6.5.1': + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + + '@svgr/hast-util-to-babel-ast@6.5.1': + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + + '@svgr/plugin-jsx@6.5.1': + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + + '@svgr/plugin-svgo@6.5.1': + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/webpack@6.5.1': + resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} + engines: {node: '>=10'} + + '@swc/helpers@0.5.1': + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + + '@szmarczak/http-timer@1.1.2': + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@tsconfig/docusaurus@1.0.5': + resolution: {integrity: sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg==} + + '@types/babel__core@7.20.1': + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + + '@types/babel__generator@7.6.4': + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + + '@types/babel__template@7.4.1': + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + + '@types/babel__traverse@7.20.1': + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + + '@types/bn.js@5.1.1': + resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} + + '@types/body-parser@1.19.2': + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + + '@types/bonjour@3.5.10': + resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} + + '@types/bs58@4.0.1': + resolution: {integrity: sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/chai-subset@1.3.3': + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + + '@types/chai@4.3.5': + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + + '@types/clean-css@4.2.6': + resolution: {integrity: sha512-Ze1tf+LnGPmG6hBFMi0B4TEB0mhF7EiMM5oyjLDNPE9hxrPU0W+5+bHvO+eFPA+bt0iC1zkQMoU/iGdRVjcRbw==} + + '@types/connect-history-api-fallback@1.5.0': + resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} + + '@types/connect@3.4.35': + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + + '@types/cookie@0.5.1': + resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} + + '@types/cssnano@5.1.0': + resolution: {integrity: sha512-ikR+18UpFGgvaWSur4og6SJYF/6QEYHXvrIt36dp81p1MG3cAPTYDMBJGeyWa3LCnqEbgNMHKRb+FP0NrXtoWQ==} + deprecated: This is a stub types definition. cssnano provides its own type definitions, so you do not need this installed. + + '@types/detect-port@1.3.3': + resolution: {integrity: sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==} + + '@types/doctrine@0.0.3': + resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} + + '@types/ejs@3.1.2': + resolution: {integrity: sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==} + + '@types/eslint-scope@3.7.4': + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + + '@types/eslint@8.40.2': + resolution: {integrity: sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.1': + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + + '@types/express-serve-static-core@4.17.35': + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + + '@types/express@4.17.17': + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + + '@types/find-cache-dir@3.2.1': + resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} + + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + + '@types/graceful-fs@4.1.6': + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + + '@types/hast@2.3.4': + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/html-minifier@3.5.3': + resolution: {integrity: sha512-j1P/4PcWVVCPEy5lofcHnQ6BtXz9tHGiFPWzqm7TtGuWZEfCHEP446HlkSNc9fQgNJaJZ6ewPtp2aaFla/Uerg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-proxy@1.17.11': + resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} + + '@types/istanbul-lib-coverage@2.0.4': + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + + '@types/istanbul-lib-report@3.0.0': + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + + '@types/istanbul-reports@3.0.1': + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + + '@types/json-schema@7.0.11': + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash@4.14.195': + resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} + + '@types/mdast@3.0.11': + resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} + + '@types/mdx@2.0.5': + resolution: {integrity: sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==} + + '@types/mime-types@2.1.1': + resolution: {integrity: sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==} + + '@types/mime@1.3.2': + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + + '@types/mime@3.0.1': + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/node-fetch@2.6.4': + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@16.18.34': + resolution: {integrity: sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@18.11.18': + resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + + '@types/node@20.4.2': + resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} + + '@types/node@20.9.0': + resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} + + '@types/normalize-package-data@2.4.1': + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + + '@types/npmlog@4.1.4': + resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} + + '@types/parse-json@4.0.0': + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + '@types/parse5@5.0.3': + resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} + + '@types/pretty-hrtime@1.0.1': + resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} + + '@types/prop-types@15.7.5': + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + '@types/qs@6.9.7': + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + + '@types/range-parser@1.2.4': + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + + '@types/react-dom@18.2.7': + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + + '@types/react-router-config@5.0.7': + resolution: {integrity: sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w==} + + '@types/react-router-dom@5.3.3': + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + + '@types/react@18.2.15': + resolution: {integrity: sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==} + + '@types/react@18.2.8': + resolution: {integrity: sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==} + + '@types/relateurl@0.2.29': + resolution: {integrity: sha512-QSvevZ+IRww2ldtfv1QskYsqVVVwCKQf1XbwtcyyoRvLIQzfyPhj/C+3+PKzSDRdiyejaiLgnq//XTkleorpLg==} + + '@types/resolve@1.17.1': + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/responselike@1.0.0': + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/sax@1.2.4': + resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + + '@types/scheduler@0.16.3': + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + + '@types/semver@7.3.13': + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + + '@types/send@0.17.1': + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + + '@types/serve-index@1.9.1': + resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} + + '@types/serve-static@1.15.1': + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + + '@types/sockjs@0.3.33': + resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + + '@types/trusted-types@2.0.3': + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + + '@types/uglify-js@3.17.1': + resolution: {integrity: sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==} + + '@types/unist@2.0.6': + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.5.5': + resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} + + '@types/yargs-parser@21.0.0': + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + + '@types/yargs@17.0.24': + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + + '@typescript-eslint/eslint-plugin@5.44.0': + resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.44.0': + resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.44.0': + resolution: {integrity: sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.44.0': + resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.44.0': + resolution: {integrity: sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.44.0': + resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.44.0': + resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.44.0': + resolution: {integrity: sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@vercel/nft@0.22.6': + resolution: {integrity: sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==} + engines: {node: '>=14'} + hasBin: true + + '@vitest/expect@0.31.1': + resolution: {integrity: sha512-BV1LyNvhnX+eNYzJxlHIGPWZpwJFZaCcOIzp2CNG0P+bbetenTupk6EO0LANm4QFt0TTit+yqx7Rxd1qxi/SQA==} + + '@vitest/runner@0.31.1': + resolution: {integrity: sha512-imWuc82ngOtxdCUpXwtEzZIuc1KMr+VlQ3Ondph45VhWoQWit5yvG/fFcldbnCi8DUuFi+NmNx5ehMUw/cGLUw==} + + '@vitest/snapshot@0.31.1': + resolution: {integrity: sha512-L3w5uU9bMe6asrNzJ8WZzN+jUTX4KSgCinEJPXyny0o90fG4FPQMV0OWsq7vrCWfQlAilMjDnOF9nP8lidsJ+g==} + + '@vitest/spy@0.31.1': + resolution: {integrity: sha512-1cTpt2m9mdo3hRLDyCG2hDQvRrePTDgEJBFQQNz1ydHHZy03EiA6EpFxY+7ODaY7vMRCie+WlFZBZ0/dQWyssQ==} + + '@vitest/ui@0.31.1': + resolution: {integrity: sha512-+JJ2+rvRPAVxFLNE+WJOMzOjxqYPn7V2hl00uNwid6kquD+UHTa716Z7szfNeZMLnHOHv+fxq1UgLCymvVpE5w==} + peerDependencies: + vitest: '>=0.30.1 <1' + + '@vitest/utils@0.31.1': + resolution: {integrity: sha512-yFyRD5ilwojsZfo3E0BnH72pSVSuLg2356cN1tCEe/0RtDzxTPYwOomIC+eQbot7m6DRy4tPZw+09mB7NkbMmA==} + + '@wallet-standard/app@1.0.1': + resolution: {integrity: sha512-LnLYq2Vy2guTZ8GQKKSXQK3+FRGPil75XEdkZqE6fiLixJhZJoJa5hT7lXxwe0ykVTt9LEThdTbOpT7KadS26Q==} + engines: {node: '>=16'} + + '@wallet-standard/base@1.0.1': + resolution: {integrity: sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==} + engines: {node: '>=16'} + + '@wallet-standard/core@1.0.3': + resolution: {integrity: sha512-Jb33IIjC1wM1HoKkYD7xQ6d6PZ8EmMZvyc8R7dFgX66n/xkvksVTW04g9yLvQXrLFbcIjHrCxW6TXMhvpsAAzg==} + engines: {node: '>=16'} + + '@wallet-standard/features@1.0.3': + resolution: {integrity: sha512-m8475I6W5LTatTZuUz5JJNK42wFRgkJTB0I9tkruMwfqBF2UN2eomkYNVf9RbrsROelCRzSFmugqjKZBFaubsA==} + engines: {node: '>=16'} + + '@wallet-standard/wallet@1.0.1': + resolution: {integrity: sha512-qkhJeuQU2afQTZ02yMZE5SFc91Fo3hyFjFkpQglHudENNyiSG0oUKcIjky8X32xVSaumgTZSQUAzpXnCTWHzKQ==} + engines: {node: '>=16'} + + '@webassemblyjs/ast@1.11.6': + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.11.6': + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.11.6': + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.11.6': + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + + '@webassemblyjs/wasm-gen@1.11.6': + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + + '@webassemblyjs/wasm-opt@1.11.6': + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + + '@webassemblyjs/wasm-parser@1.11.6': + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + + '@webassemblyjs/wast-printer@1.11.6': + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': + resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} + engines: {node: '>=14.15.0'} + peerDependencies: + esbuild: '>=0.10.0' + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + agent-base@5.1.1: + resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} + engines: {node: '>= 6.0.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.3.0: + resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.11.2: + resolution: {integrity: sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==} + + algoliasearch-helper@3.13.3: + resolution: {integrity: sha512-jhbbuYZ+fheXpaJlqdJdFa1jOsrTWKmRRTYDM3oVTto5VodZzM7tT+BHzslAotaJf/81CKrm6yLRQn8WIr/K4A==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + + algoliasearch@4.18.0: + resolution: {integrity: sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + app-root-dir@1.0.2: + resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + + array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + + arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + + ast-types@0.15.2: + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + autoprefixer@10.4.14: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + axe-core@4.7.2: + resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + engines: {node: '>=4'} + + axios@0.25.0: + resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} + + axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + babel-core@7.0.0-bridge.0: + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-loader@8.3.0: + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + + babel-plugin-apply-mdx-type-prop@1.6.22: + resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} + peerDependencies: + '@babel/core': ^7.11.6 + + babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + + babel-plugin-extract-import-names@1.6.22: + resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==} + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jsx-dom-expressions@0.36.10: + resolution: {integrity: sha512-QA2k/14WGw+RgcGGnEuLWwnu4em6CGhjeXtjvgOYyFHYS2a+CzPeaVQHDOlfuiBcjq/3hWMspHMIMnPEOIzdBg==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-plugin-polyfill-corejs2@0.3.3: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-polyfill-corejs2@0.4.3: + resolution: {integrity: sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-polyfill-corejs3@0.6.0: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-polyfill-corejs3@0.8.1: + resolution: {integrity: sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-polyfill-regenerator@0.4.1: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-polyfill-regenerator@0.5.0: + resolution: {integrity: sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-preset-solid@1.7.4: + resolution: {integrity: sha512-0mbHNYkbOVYhH6L95VlHVkBEVQjOXSzUqLDiFxUcsg/tU4yTM/qx7FI8C+kmos9LHckQBSm3wtwoe1BZLNJR1w==} + peerDependencies: + '@babel/core': ^7.0.0 + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + + base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + + base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + better-opn@2.1.1: + resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} + engines: {node: '>8.0.0'} + + big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.1.1: + resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + + browserslist@4.21.7: + resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.7: + resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} + engines: {node: '>=6.14.2'} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001492: + resolution: {integrity: sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==} + + ccount@1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + + chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + + clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + + clean-css@5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + + cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + collapse-white-space@1.0.6: + resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combine-promises@1.1.0: + resolution: {integrity: sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==} + engines: {node: '>=10'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + copy-text-to-clipboard@3.1.0: + resolution: {integrity: sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==} + engines: {node: '>=12'} + + copy-webpack-plugin@11.0.0: + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.30.2: + resolution: {integrity: sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==} + + core-js-pure@3.31.0: + resolution: {integrity: sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg==} + + core-js@3.31.0: + resolution: {integrity: sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + + cross-fetch@3.1.6: + resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-declaration-sorter@6.4.0: + resolution: {integrity: sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + + css-loader@6.8.1: + resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + css-minimizer-webpack-plugin@4.2.2: + resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-advanced@5.3.10: + resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-preset-default@5.2.14: + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-utils@3.1.0: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano@5.1.15: + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + + defu@6.1.2: + resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} + + del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detab@2.0.4: + resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + detect-package-manager@2.0.1: + resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} + engines: {node: '>=12'} + + detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + + detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dns-equal@1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + + dns-packet@5.6.0: + resolution: {integrity: sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==} + engines: {node: '>=6'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.1.3: + resolution: {integrity: sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==} + engines: {node: '>=12'} + + duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.417: + resolution: {integrity: sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + emoticon@3.2.0: + resolution: {integrity: sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + envinfo@7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + + es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + + es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + + es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + esbuild-android-64@0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-plugin-alias@0.2.1: + resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} + + esbuild-plugin-solid@0.5.0: + resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} + peerDependencies: + esbuild: '>=0.12' + solid-js: '>= 1.0' + + esbuild-register@3.4.2: + resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild-sunos-64@0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.16.10: + resolution: {integrity: sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@13.4.10: + resolution: {integrity: sha512-+JjcM6lQmFR5Mw0ORm9o1CR29+z/uajgSfYAPEGIBxOhTHBgCMs7ysuwi72o7LkMmA8E3N7/h09pSGZxs0s85g==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@8.5.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + + eslint-import-resolver-typescript@3.5.5: + resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.27.5: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.7.1: + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: + resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.32.2: + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.1: + resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + + eslint@8.45.0: + resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@1.7.0: + resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} + hasBin: true + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + + fastq@1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fetch-retry@5.0.6: + resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + + fflate@0.7.4: + resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + file-system-cache@2.3.0: + resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + flow-parser@0.207.0: + resolution: {integrity: sha512-s90OlXqzWj1xc4yUtqD1Gr8pGVx0/5rk9gsqPrOYF1kBAPMH4opkmzdWgQ8aNe3Pckqtwr8DlYGbfE2GnW+zsg==} + engines: {node: '>=0.4.0'} + + flux@4.0.4: + resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + + follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + fork-ts-checker-webpack-plugin@6.5.3: + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + + form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-monkey@1.0.4: + resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + + get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + + get-npm-tarball-url@2.0.3: + resolution: {integrity: sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==} + engines: {node: '>=12.17'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-port@6.1.2: + resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.6.2: + resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} + + giget@1.1.2: + resolution: {integrity: sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==} + hasBin: true + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-promise@6.0.2: + resolution: {integrity: sha512-Ni2aDyD1ekD6x8/+K4hDriRDbzzfuK4yKpqSymJ4P7IxbtARiOOuU+k40kbHM0sLIlbf1Qh0qdMkAHMZYE6XJQ==} + engines: {node: '>=16'} + peerDependencies: + glob: ^8.0.3 + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.18.0: + resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==} + engines: {node: '>=8'} + + globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.0: + resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hast-to-hyperscript@9.0.1: + resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + + hast-util-from-parse5@6.0.1: + resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-raw@6.0.1: + resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} + + hast-util-to-parse5@6.0.0: + resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-minifier@4.0.0: + resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} + engines: {node: '>=6'} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + html-void-elements@1.0.5: + resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} + + html-webpack-plugin@5.5.3: + resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} + engines: {node: '>=10.13.0'} + peerDependencies: + webpack: ^5.20.0 + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + + http-proxy-middleware@2.0.6: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@4.0.0: + resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} + engines: {node: '>= 6.0.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + + ignore@5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + + image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infima@0.2.0-alpha.43: + resolution: {integrity: sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.1.0: + resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + engines: {node: '>= 10'} + + is-absolute-url@3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + + is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-npm@5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} + engines: {node: '>=10'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-what@4.1.15: + resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} + engines: {node: '>=12.13'} + + is-whitespace-character@1.0.4: + resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} + + is-word-character@1.0.4: + resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + + isomorphic-localstorage@1.0.2: + resolution: {integrity: sha512-FwfdaTRe4ICraQ0JR0C1ibmIN17WPZxCVQDkYx2E134xmDMamdwv/mgRARW5J7exxKy8vmtmOem05vWWUSlVIw==} + + isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + + jayson@3.7.0: + resolution: {integrity: sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==} + engines: {node: '>=8'} + hasBin: true + + jest-haste-map@29.5.0: + resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-regex-util@29.4.3: + resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.5.0: + resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.5.0: + resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jiti@1.18.2: + resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + hasBin: true + + joi@17.9.2: + resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} + + js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + + js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jscodeshift@0.14.0: + resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsx-ast-utils@3.3.4: + resolution: {integrity: sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==} + engines: {node: '>=4.0'} + + keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + + latest-version@5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} + engines: {node: '>=8'} + + launch-editor@2.6.0: + resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + + lazy-universal-dotenv@4.0.0: + resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} + engines: {node: '>=14.0.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lit-element@3.3.2: + resolution: {integrity: sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==} + + lit-html@2.7.4: + resolution: {integrity: sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g==} + + lit@2.7.2: + resolution: {integrity: sha512-9QnZmG5mIKPRja96cpndMclLSi0Qrz2BXD6EbqNqCKMMjOWVm/BwAeXufFk2jqFsNmY07HOzU8X+8aTSVt3yrA==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 + + lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + + markdown-escapes@1.0.4: + resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} + + markdown-to-jsx@7.2.0: + resolution: {integrity: sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + + md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + + mdast-squeeze-paragraphs@4.0.0: + resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==} + + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + + mdast-util-to-hast@10.0.1: + resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} + + mdast-util-to-string@1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mini-css-extract-plugin@2.7.6: + resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minify-html-literals@1.3.5: + resolution: {integrity: sha512-p8T8ryePRR8FVfJZLVFmM53WY25FL0moCCTycUDuAu6rf9GMLwy0gNjXBGNin3Yun7Y+tIWd28axOf0t2EpAlQ==} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.3.0: + resolution: {integrity: sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==} + + mock-socket@9.2.1: + resolution: {integrity: sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag==} + engines: {node: '>= 8'} + + mock-socket@9.3.1: + resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==} + engines: {node: '>= 8'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next@13.4.10: + resolution: {integrity: sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + fibers: '>= 3.1.0' + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + sass: + optional: true + + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + nock@13.3.2: + resolution: {integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==} + engines: {node: '>= 10.13'} + + nock@13.3.4: + resolution: {integrity: sha512-DDpmn5oLEdCTclEqweOT4U7bEpuoifBMFUXem9sA4turDAZ5tlbrEoWqCorwXey8CaAw44mst5JOQeVNiwtkhw==} + engines: {node: '>= 10.13'} + + node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-fetch-native@1.1.1: + resolution: {integrity: sha512-9VvspTSUp2Sxbl+9vbZTlFGq9lHwE8GDVVekxx6YsNd1YH59sb3Ba8v3Y3cD8PkLNcileGGcA21PFjVl0jzDaw==} + + node-fetch@2.6.11: + resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-localstorage@2.2.1: + resolution: {integrity: sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==} + engines: {node: '>=0.12'} + + node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + + object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} + engines: {node: '>=8'} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-literals@1.2.1: + resolution: {integrity: sha512-Ml0w104Ph2wwzuRdxrg9booVWsngXbB4bZ5T2z6WyF8b5oaNkUmBiDtahi34yUIpXD8Y13JjAK6UyIyApJ73RQ==} + + parse-multipart-data@1.5.0: + resolution: {integrity: sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + + path-to-regexp@2.2.1: + resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + polished@4.2.2: + resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} + engines: {node: '>=10'} + + polka@1.0.0-next.22: + resolution: {integrity: sha512-a7tsZy5gFbJr0aUltZS97xCkbPglXuD67AMvTyZX7BTDBH384FWf0ZQF6rPvdutSxnO1vUlXM2zSLf5tCKk5RA==} + engines: {node: '>=8'} + + postcss-calc@8.2.4: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + + postcss-colormin@5.3.1: + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-convert-values@5.1.3: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-comments@5.1.2: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-empty@5.1.1: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-overridden@5.1.0: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-unused@5.1.0: + resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-lit@1.1.0: + resolution: {integrity: sha512-JGrJOVKkSTOHp8dEooq+IzmwiLlx+v7muXXZIV59URcwCpTN53szlrmQA2i7r4cdFxTfPFXId5O0cWjEg6rkQQ==} + peerDependencies: + postcss: ^8.3.11 + + postcss-load-config@4.0.1: + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-loader@7.3.3: + resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + + postcss-merge-idents@5.1.1: + resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-longhand@5.1.7: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-rules@5.1.4: + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-font-values@5.1.0: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-gradients@5.1.1: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-params@5.1.4: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-selectors@5.2.1: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-modules-extract-imports@3.0.0: + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.0.3: + resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.0.0: + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-normalize-charset@5.1.0: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-display-values@5.1.0: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-positions@5.1.1: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-repeat-style@5.1.1: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-string@5.1.0: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-timing-functions@5.1.0: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-unicode@5.1.1: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-url@5.1.0: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-whitespace@5.1.1: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-ordered-values@5.1.3: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-idents@5.2.0: + resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-initial@5.1.2: + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-transforms@5.1.0: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + + postcss-sort-media-queries@4.4.1: + resolution: {integrity: sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.4.16 + + postcss-svgo@5.1.0: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-unique-selectors@5.1.1: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss-zindex@5.1.0: + resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.24: + resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + + prettier@2.8.0: + resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} + engines: {node: '>=10.13.0'} + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + pretty-time@1.1.0: + resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} + engines: {node: '>=4'} + + prism-react-renderer@1.3.5: + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + peerDependencies: + react: '>=0.14.9' + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + propagate@2.0.1: + resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} + engines: {node: '>= 8'} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + + pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + + puppeteer-core@2.1.1: + resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} + engines: {node: '>=8.16.0'} + + pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + + qrcode-generator@1.4.4: + resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + + react-colorful@5.6.1: + resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-dev-utils@12.0.1: + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true + + react-dom@17.0.2: + resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + peerDependencies: + react: 17.0.2 + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-helmet-async@1.3.0: + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + + react-inspector@6.0.1: + resolution: {integrity: sha512-cxKSeFTf7jpSSVddm66sKdolG90qURAX3g1roTeaN6x0YEbtWc8JpmFN9+yIqLNH2uEkYerWLtJZIXRIFuBKrg==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-json-view@1.21.3: + resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} + peerDependencies: + react: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-loadable-ssr-addon-v5-slorber@1.0.1: + resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: '>=4.41.1 || 5.x' + + react-router-config@5.1.1: + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + + react-router-dom@5.3.4: + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} + peerDependencies: + react: '>=15' + + react-router@5.3.4: + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + peerDependencies: + react: '>=15' + + react-textarea-autosize@8.5.0: + resolution: {integrity: sha512-cp488su3U9RygmHmGpJp0KEt0i/+57KCK33XVPH+50swVRBhIZYh0fGduz2YLKXwl9vSKBZ9HUXcg9PQXUXqIw==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + recast@0.21.5: + resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} + engines: {node: '>= 4'} + + recast@0.23.2: + resolution: {integrity: sha512-Qv6cPfVZyMOtPszK6PgW70pUgm7gPlFitAPf0Q69rlOA0zLw2XdDcNmPbVGYicFGT9O8I7TZ/0ryJD+6COvIPw==} + engines: {node: '>= 4'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + regenerate-unicode-properties@10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-transform@0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + + regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + + regexparam@1.3.0: + resolution: {integrity: sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==} + engines: {node: '>=6'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + registry-auth-token@4.2.2: + resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} + engines: {node: '>=6.0.0'} + + registry-url@5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} + engines: {node: '>=8'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-emoji@2.2.0: + resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==} + + remark-external-links@8.0.0: + resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + + remark-footnotes@2.0.0: + resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} + + remark-mdx@1.6.22: + resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} + + remark-parse@8.0.3: + resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==} + + remark-slug@6.1.0: + resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + + remark-squeeze-paragraphs@4.0.0: + resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + + resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + + resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + + responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup-plugin-dts@5.3.0: + resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==} + engines: {node: '>=v14'} + peerDependencies: + rollup: ^3.0.0 + typescript: ^4.1 || ^5.0 + + rollup-plugin-html-literals@1.1.6: + resolution: {integrity: sha512-pF2V4wE3qk+fQQboBw2hwnRaElr/QN3uYu4tBXvYXXWQor41/Xa8FYVpbuOZX57VJHAYZm+a2yLanFr+yo2GRw==} + peerDependencies: + rollup: ^1.x.x||^2.x.x||^3.x.x + + rollup-plugin-lit-css@4.0.1: + resolution: {integrity: sha512-DgCypZzKNzERjwGK/kYVuAM/4lnw9VCO7x0FVgix8NV0pxL8cIswDdaaUECsanG79N2tUR4UcrC6YR/NiXHqcA==} + + rollup-plugin-styles@4.0.0: + resolution: {integrity: sha512-A2K2sao84OsTmDxXG83JTCdXWrmgvQkkI38XDat46rdtpGMRm9tSYqeCdlwwGDJF4kKIafhV1mUidqu8MxUGig==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + rollup: ^2.63.0 + + rollup-plugin-visualizer@5.9.2: + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + + rollup-route-manifest@1.0.0: + resolution: {integrity: sha512-3CmcMmCLAzJDUXiO3z6386/Pt8/k9xTZv8gIHyXI8hYGoAInnYdOsFXiGGzQRMy6TXR1jUZme2qbdwjH2nFMjg==} + engines: {node: '>=8'} + peerDependencies: + rollup: '>=2.0.0' + + rollup@3.23.1: + resolution: {integrity: sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + route-sort@1.0.0: + resolution: {integrity: sha512-SFgmvjoIhp5S4iBEDW3XnbT+7PRuZ55oRuNjY+CDB1SGZkyCG9bqQ3/dhaZTctTBYMAvDxd2Uy9dStuaUfgJqQ==} + engines: {node: '>= 6'} + + rpc-websockets@7.5.1: + resolution: {integrity: sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w==} + + rtl-detect@1.0.4: + resolution: {integrity: sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==} + + rtlcss@3.5.0: + resolution: {integrity: sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.1: + resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + + schema-utils@2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + + search-insights@2.6.0: + resolution: {integrity: sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==} + engines: {node: '>=8.16.0'} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + engines: {node: '>=10'} + + semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + + semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + + semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + + semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + + semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + + seroval@0.5.1: + resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} + engines: {node: '>=10'} + + serve-favicon@2.5.0: + resolution: {integrity: sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==} + engines: {node: '>= 0.8.0'} + + serve-handler@6.1.5: + resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + + sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + + sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slide@1.1.6: + resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} + + smob@1.4.0: + resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} + + smoldot@1.0.4: + resolution: {integrity: sha512-N3TazI1C4GGrseFH/piWyZCCCRJTRx2QhDfrUKRT4SzILlW5m8ayZ3QTKICcz1C/536T9cbHHJyP7afxI6Mi1A==} + + smoldot@2.0.1: + resolution: {integrity: sha512-Wqw2fL/sELQByLSeeTX1Z/d0H4McmphPMx8vh6UZS/bIIDx81oU7s/drmx2iL/ME36uk++YxpRuJey8/MOyfOA==} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + solid-js@1.7.2: + resolution: {integrity: sha512-01f8GIc+HTTlfDXtK+TFku3AllHyJ3hNsIpxM2qpObRP4VbEGVIP6VbULnThPlpse+J1y/I/1N9QeQ9MNkE8Ow==} + + solid-refresh@0.5.3: + resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} + peerDependencies: + solid-js: ^1.3 + + solid-start-node@0.2.19: + resolution: {integrity: sha512-5Rtlh4PKm6zDuvFoPzf8xEzz5ca35uoyCeHbEqhcVnD9OqqhW8iKevaoNwlJ3Vm9yZHP53SWcS6F3e/KOnvBpA==} + peerDependencies: + solid-start: '*' + undici: ^5.8.0 + vite: '*' + + solid-start-vercel@0.2.26: + resolution: {integrity: sha512-wSw2+P7xhAvh0+rgeogVl1PO052hgLbL7B//0JYnEd/M1eWSK0wcT0VgiExkbZUSouWQpLY1f0n1RYswBzpjWw==} + peerDependencies: + solid-start: '*' + vite: '*' + + solid-start@0.2.26: + resolution: {integrity: sha512-kne2HZlnSMzsirdnvNs1CsDqBl0L0uvKKt1t4de1CH7JIngyqoMcER97jTE0Ejr84KknANaKAdvJAzZcL7Ueng==} + hasBin: true + peerDependencies: + '@solidjs/meta': ^0.28.0 + '@solidjs/router': ^0.8.2 + solid-js: ^1.6.2 + solid-start-aws: '*' + solid-start-cloudflare-pages: '*' + solid-start-cloudflare-workers: '*' + solid-start-deno: '*' + solid-start-netlify: '*' + solid-start-node: '*' + solid-start-static: '*' + solid-start-vercel: '*' + vite: ^4.1.4 + peerDependenciesMeta: + solid-start-aws: + optional: true + solid-start-cloudflare-pages: + optional: true + solid-start-cloudflare-workers: + optional: true + solid-start-deno: + optional: true + solid-start-netlify: + optional: true + solid-start-node: + optional: true + solid-start-static: + optional: true + solid-start-vercel: + optional: true + + solid-toast@0.5.0: + resolution: {integrity: sha512-t770JakjyS2P9b8Qa1zMLOD51KYKWXbTAyJePVUoYex5c5FH5S/HtUBUbZAWFcqRCKmAE8KhyIiCvDZA8bOnxQ==} + peerDependencies: + solid-js: ^1.5.4 + + sort-css-media-queries@2.1.0: + resolution: {integrity: sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==} + engines: {node: '>= 6.3.0'} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + state-toggle@1.0.3: + resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + + store2@2.14.2: + resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} + + storybook@7.0.18: + resolution: {integrity: sha512-FXMmTiomSlLPTHty7vGLr0prPf6pCV07EwAmNOYYYTskitEYV0R7hlhawByd7HuobjIhHvSTKesa1Whl86zLNA==} + hasBin: true + + stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + strict-event-emitter-types@2.0.0: + resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-to-template-literal@2.0.0: + resolution: {integrity: sha512-AbTUWHXMyoRlTFP9qe013dfGTFq1XbcBLUoLC7PcumbJewtUwNXCvnko5cH2gZkUFC7kD2Fwxiv4YIndkU0xHA==} + engines: {node: '>=12.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + + string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + + string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + + style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylehacks@5.1.1: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + sucrase@3.32.0: + resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} + engines: {node: '>=8'} + hasBin: true + + superstruct@0.14.2: + resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} + + superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} + engines: {node: '>=14.0.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + synchronous-promise@2.0.17: + resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} + + synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + + table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + + tailwindcss@3.3.2: + resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + + telejson@7.1.0: + resolution: {integrity: sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA==} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + + tempy@1.0.1: + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + + terser-webpack-plugin@5.3.9: + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.17.7: + resolution: {integrity: sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + + tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + + tinypool@0.5.0: + resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.1.0: + resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + engines: {node: '>=14.0.0'} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-readable-stream@1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-trailing-lines@1.1.4: + resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} + + trim@0.0.1: + resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} + deprecated: Use String.prototype.trim() instead + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + trouter@3.2.1: + resolution: {integrity: sha512-oY3CmIiEYOe1YMEzh++I67lrNOUldtCeuLL0vRPydvQLHZpSJ03B5dgDFlpFsiriMq6e//NDjjopjUzXOztHow==} + engines: {node: '>=6'} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfck@2.1.1: + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + turbo-darwin-64@1.10.7: + resolution: {integrity: sha512-N2MNuhwrl6g7vGuz4y3fFG2aR1oCs0UZ5HKl8KSTn/VC2y2YIuLGedQ3OVbo0TfEvygAlF3QGAAKKtOCmGPNKA==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@1.10.7: + resolution: {integrity: sha512-WbJkvjU+6qkngp7K4EsswOriO3xrNQag7YEGRtfLoDdMTk4O4QTeU6sfg2dKfDsBpTidTvEDwgIYJhYVGzrz9Q==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@1.10.7: + resolution: {integrity: sha512-x1CF2CDP1pDz/J8/B2T0hnmmOQI2+y11JGIzNP0KtwxDM7rmeg3DDTtDM/9PwGqfPotN9iVGgMiMvBuMFbsLhg==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@1.10.7: + resolution: {integrity: sha512-JtnBmaBSYbs7peJPkXzXxsRGSGBmBEIb6/kC8RRmyvPAMyqF8wIex0pttsI+9plghREiGPtRWv/lfQEPRlXnNQ==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@1.10.7: + resolution: {integrity: sha512-7A/4CByoHdolWS8dg3DPm99owfu1aY/W0V0+KxFd0o2JQMTQtoBgIMSvZesXaWM57z3OLsietFivDLQPuzE75w==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@1.10.7: + resolution: {integrity: sha512-D36K/3b6+hqm9IBAymnuVgyePktwQ+F0lSXr2B9JfAdFPBktSqGmp50JNC7pahxhnuCLj0Vdpe9RqfnJw5zATA==} + cpu: [arm64] + os: [win32] + + turbo@1.10.7: + resolution: {integrity: sha512-xm0MPM28TWx1e6TNC3wokfE5eaDqlfi0G24kmeHupDUZt5Wd0OzHFENEHMPqEaNKJ0I+AMObL6nbSZonZBV2HA==} + hasBin: true + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.35: + resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} + + ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + uglifycss@0.0.29: + resolution: {integrity: sha512-J2SQ2QLjiknNGbNdScaNZsXgmMGI0kYNrXaDlr4obnPW9ni1jljb1NeEVWAiTgZ8z+EBWP2ozfT9vpy03rjlMQ==} + engines: {node: '>=6.4.0'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.15.1: + resolution: {integrity: sha512-XLk8g0WAngdvFqTI+VKfBtM4YWXgdxkf1WezC771Es0Dd+Pm1KmNx8t93WTC+Hh9tnghmVxkclU1HN+j+CvIUA==} + engines: {node: '>=12.18'} + + unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + + unherit@1.1.3: + resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unified@9.2.0: + resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} + + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + unist-builder@2.0.3: + resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} + + unist-util-generated@1.1.6: + resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-position@3.1.0: + resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} + + unist-util-remove-position@2.0.1: + resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} + + unist-util-remove@2.1.0: + resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin@0.10.2: + resolution: {integrity: sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.0.11: + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@5.1.0: + resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} + engines: {node: '>=10'} + + upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-loader@4.1.1: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + + url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + + use-composed-ref@1.3.0: + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.2.1: + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-resize-observer@9.1.0: + resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} + peerDependencies: + react: 16.8.0 - 18 + react-dom: 16.8.0 - 18 + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utility-types@3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + + v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + + validate-html-nesting@1.2.2: + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@3.2.0: + resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + vite-node@0.31.1: + resolution: {integrity: sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA==} + engines: {node: '>=v14.18.0'} + hasBin: true + + vite-plugin-inspect@0.7.28: + resolution: {integrity: sha512-XRdQGdf+PU6eT0EoL8beUyFQfcCrHr06OyRM71IT8t7rEC9JywdsscehGHEAyFZryfaVBWAI280N63BI2N+1BA==} + engines: {node: '>=14'} + peerDependencies: + vite: ^3.1.0 || ^4.0.0 + + vite-plugin-solid@2.7.0: + resolution: {integrity: sha512-avp/Jl5zOp/Itfo67xtDB2O61U7idviaIp4mLsjhCa13PjKNasz+IID0jYTyqUp9SFx6/PmBr6v4KgDppqompg==} + peerDependencies: + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 + + vite-tsconfig-paths@4.2.0: + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@4.0.3: + resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@4.3.9: + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.4: + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@0.31.1: + resolution: {integrity: sha512-/dOoOgzoFk/5pTvg1E65WVaobknWREN15+HF+0ucudo3dDG/vCZoXTQrjIfEaWvQXmqScwkRodrTbM/ScMpRcQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + + wait-on@6.0.1: + resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} + engines: {node: '>=10.0.0'} + hasBin: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-namespaces@1.1.4: + resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + + web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-bundle-analyzer@4.9.0: + resolution: {integrity: sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-dev-middleware@5.3.3: + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + webpack-dev-server@4.15.1: + resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.4.6: + resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==} + + webpack@5.88.0: + resolution: {integrity: sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + webpackbar@5.0.2: + resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} + engines: {node: '>=12'} + peerDependencies: + webpack: 3 || 4 || 5 + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + + whatwg-fetch@3.6.2: + resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.10: + resolution: {integrity: sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@1.3.4: + resolution: {integrity: sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@6.2.2: + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + + zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.6.0)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.6.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.6.0)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) + search-insights: 2.6.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) + '@algolia/client-search': 4.18.0 + algoliasearch: 4.18.0 + + '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)': + dependencies: + '@algolia/client-search': 4.18.0 + algoliasearch: 4.18.0 + + '@algolia/cache-browser-local-storage@4.18.0': + dependencies: + '@algolia/cache-common': 4.18.0 + + '@algolia/cache-common@4.18.0': {} + + '@algolia/cache-in-memory@4.18.0': + dependencies: + '@algolia/cache-common': 4.18.0 + + '@algolia/client-account@4.18.0': + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/transporter': 4.18.0 + + '@algolia/client-analytics@4.18.0': + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + + '@algolia/client-common@4.18.0': + dependencies: + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + + '@algolia/client-personalization@4.18.0': + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + + '@algolia/client-search@4.18.0': + dependencies: + '@algolia/client-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 + + '@algolia/events@4.0.1': {} + + '@algolia/logger-common@4.18.0': {} + + '@algolia/logger-console@4.18.0': + dependencies: + '@algolia/logger-common': 4.18.0 + + '@algolia/requester-browser-xhr@4.18.0': + dependencies: + '@algolia/requester-common': 4.18.0 + + '@algolia/requester-common@4.18.0': {} + + '@algolia/requester-node-http@4.18.0': + dependencies: + '@algolia/requester-common': 4.18.0 + + '@algolia/transporter@4.18.0': + dependencies: + '@algolia/cache-common': 4.18.0 + '@algolia/logger-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + + '@antfu/utils@0.7.4': {} + + '@aptos-labs/aptos-client@0.1.0': + dependencies: + axios: 1.6.2 + got: 11.8.6 + transitivePeerDependencies: + - debug + + '@aptos-labs/ts-sdk@1.9.1': + dependencies: + '@aptos-labs/aptos-client': 0.1.0 + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/bip32': 1.3.3 + '@scure/bip39': 1.2.1 + eventemitter3: 5.0.1 + form-data: 4.0.0 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - debug + + '@aptos-labs/wallet-standard@0.0.11': + dependencies: + '@aptos-labs/ts-sdk': 1.9.1 + '@wallet-standard/core': 1.0.3 + transitivePeerDependencies: + - debug + + '@aw-web-design/x-default-browser@1.4.88': + dependencies: + default-browser-id: 3.0.0 + + '@babel/code-frame@7.12.11': + dependencies: + '@babel/highlight': 7.18.6 + + '@babel/code-frame@7.21.4': + dependencies: + '@babel/highlight': 7.18.6 + + '@babel/compat-data@7.22.3': {} + + '@babel/core@7.12.9': + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.22.3 + '@babel/helper-module-transforms': 7.22.1 + '@babel/helpers': 7.22.3 + '@babel/parser': 7.22.4 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + lodash: 4.17.21 + resolve: 1.22.2 + semver: 5.7.1 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.21.8': + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.22.3 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.21.8) + '@babel/helper-module-transforms': 7.22.1 + '@babel/helpers': 7.22.3 + '@babel/parser': 7.22.4 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.22.1': + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.22.3 + '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) + '@babel/helper-module-transforms': 7.22.1 + '@babel/helpers': 7.22.3 + '@babel/parser': 7.22.4 + '@babel/template': 7.21.9 + '@babel/traverse': 7.22.4 + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.21.9': + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + + '@babel/generator@7.22.3': + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.18.6': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-annotate-as-pure@7.22.5': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.3': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-compilation-targets@7.22.1(@babel/core@7.21.8)': + dependencies: + '@babel/compat-data': 7.22.3 + '@babel/core': 7.21.8 '@babel/helper-validator-option': 7.22.5 browserslist: 4.21.7 lru-cache: 5.1.1 semver: 6.3.0 - dev: true - /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1): - resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1)': dependencies: '@babel/compat-data': 7.22.3 '@babel/core': 7.22.1 @@ -1253,11 +9742,7 @@ packages: lru-cache: 5.1.1 semver: 6.3.0 - /@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.21.8): - resolution: {integrity: sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-annotate-as-pure': 7.22.5 @@ -1271,13 +9756,8 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.22.1): - resolution: {integrity: sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 @@ -1292,33 +9772,21 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-create-regexp-features-plugin@7.22.1(@babel/core@7.21.8): - resolution: {integrity: sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.22.1(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.0 - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.1(@babel/core@7.22.1): - resolution: {integrity: sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.22.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.0 - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.8): - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} - peerDependencies: - '@babel/core': ^7.4.0-0 + '@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.21.8) @@ -1329,12 +9797,8 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/helper-define-polyfill-provider@0.4.0(@babel/core@7.22.1): - resolution: {integrity: sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==} - peerDependencies: - '@babel/core': ^7.4.0-0 + '@babel/helper-define-polyfill-provider@0.4.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) @@ -1346,44 +9810,30 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-environment-visitor@7.22.1: - resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==} - engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.22.1': {} - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.21.0': dependencies: '@babel/template': 7.21.9 '@babel/types': 7.22.5 - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.18.6': dependencies: '@babel/types': 7.22.5 - /@babel/helper-member-expression-to-functions@7.22.3: - resolution: {integrity: sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==} - engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.22.3': dependencies: '@babel/types': 7.22.5 - /@babel/helper-module-imports@7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.18.6': dependencies: '@babel/types': 7.22.5 - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.22.5': dependencies: '@babel/types': 7.22.5 - /@babel/helper-module-transforms@7.22.1: - resolution: {integrity: sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.22.1': dependencies: '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-module-imports': 7.22.5 @@ -1396,29 +9846,17 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-optimise-call-expression@7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} - engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@7.18.6': dependencies: '@babel/types': 7.22.5 - /@babel/helper-plugin-utils@7.10.4: - resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} - dev: false + '@babel/helper-plugin-utils@7.10.4': {} - /@babel/helper-plugin-utils@7.21.5: - resolution: {integrity: sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.21.5': {} - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.22.5': {} - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.8): - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-annotate-as-pure': 7.22.5 @@ -1427,13 +9865,8 @@ packages: '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.22.1): - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 @@ -1443,9 +9876,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-replace-supers@7.22.1: - resolution: {integrity: sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.22.1': dependencies: '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-member-expression-to-functions': 7.22.3 @@ -1456,39 +9887,25 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-simple-access@7.21.5: - resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.21.5': dependencies: '@babel/types': 7.22.5 - /@babel/helper-skip-transparent-expression-wrappers@7.20.0: - resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} - engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.20.0': dependencies: '@babel/types': 7.22.5 - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.18.6': dependencies: '@babel/types': 7.22.5 - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.22.5': {} - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.5': {} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.22.5': {} - /@babel/helper-wrap-function@7.20.5: - resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.20.5': dependencies: '@babel/helper-function-name': 7.21.0 '@babel/template': 7.21.9 @@ -1497,9 +9914,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helpers@7.22.3: - resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.22.3': dependencies: '@babel/template': 7.21.9 '@babel/traverse': 7.22.4 @@ -1507,76 +9922,45 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.18.6': dependencies: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.21.9: - resolution: {integrity: sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.21.9': dependencies: '@babel/types': 7.22.5 - dev: true - /@babel/parser@7.22.4: - resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.22.4': dependencies: '@babel/types': 7.22.5 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3(@babel/core@7.21.8): - resolution: {integrity: sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-transform-optional-chaining': 7.22.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-transform-optional-chaining': 7.22.3(@babel/core@7.22.1) - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.8): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-environment-visitor': 7.22.1 @@ -1585,39 +9969,24 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.8) transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.8): - resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.21.8) @@ -1625,101 +9994,57 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.8) transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.8): - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.8): - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1) - dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): - resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.12.9) - dev: false - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.8): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.8)': dependencies: '@babel/compat-data': 7.22.3 '@babel/core': 7.21.8 @@ -1727,61 +10052,36 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.8) '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.8): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.1): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1) - dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.8): - resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-annotate-as-pure': 7.18.6 @@ -1790,13 +10090,8 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.8) transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.22.1): - resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.18.6 @@ -1806,405 +10101,230 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.8): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.1): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.8): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.1): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.8): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.1): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.8): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.1): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.8): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.1): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-flow@7.21.4(@babel/core@7.22.1): - resolution: {integrity: sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-flow@7.21.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.8): - resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.22.1): - resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-attributes@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.8): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.1): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.8): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.1): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9): - resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.1): - resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.8): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.1): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.8): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.1): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.8): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.1): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.8): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.1): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.8): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.1): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.8): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.1): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.8): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.1): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.8): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.1): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.1): - resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.22.1): - resolution: {integrity: sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-generator-functions@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-environment-visitor': 7.22.1 @@ -2214,11 +10334,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.8): - resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-module-imports': 7.22.5 @@ -2226,13 +10342,8 @@ packages: '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.8) transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.22.1): - resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-module-imports': 7.22.5 @@ -2241,49 +10352,27 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.8): - resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.22.1): - resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) @@ -2291,11 +10380,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-class-static-block@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@babel/plugin-transform-class-static-block@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) @@ -2304,11 +10389,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.8): - resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-annotate-as-pure': 7.22.5 @@ -2322,13 +10403,8 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-classes@7.21.0(@babel/core@7.22.1): - resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-classes@7.21.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 @@ -2343,256 +10419,145 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.21.9 - dev: true - /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.22.1): - resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.21.9 - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.8): - resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.22.1): - resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.8): - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.22.1): - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.22.1(@babel/core@7.22.1): - resolution: {integrity: sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dynamic-import@7.22.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.1) - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.3 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.3 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-export-namespace-from@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.1) - /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.22.1): - resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.22.1) - dev: true - /@babel/plugin-transform-for-of@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-for-of@7.21.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-for-of@7.21.5(@babel/core@7.22.1): - resolution: {integrity: sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-for-of@7.21.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.8): - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.21.8) '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.22.1): - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-function-name@7.18.9(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-json-strings@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1) - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.8): - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.22.1): - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-literals@7.18.9(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-logical-assignment-operators@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1) - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.8): - resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-module-transforms': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.22.1): - resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-module-transforms': 7.22.1 @@ -2600,11 +10565,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-module-transforms': 7.22.1 @@ -2612,13 +10573,8 @@ packages: '@babel/helper-simple-access': 7.21.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.22.1): - resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-module-transforms': 7.22.1 @@ -2627,11 +10583,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs@7.22.3(@babel/core@7.21.8): - resolution: {integrity: sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-systemjs@7.22.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-hoist-variables': 7.18.6 @@ -2640,13 +10592,8 @@ packages: '@babel/helper-validator-identifier': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-modules-systemjs@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-systemjs@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-hoist-variables': 7.18.6 @@ -2656,24 +10603,15 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-module-transforms': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-module-transforms': 7.22.1 @@ -2681,71 +10619,41 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-named-capturing-groups-regex@7.22.3(@babel/core@7.21.8): - resolution: {integrity: sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-named-capturing-groups-regex@7.22.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-named-capturing-groups-regex@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.22.3(@babel/core@7.21.8): - resolution: {integrity: sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-new-target@7.22.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-new-target@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-new-target@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-nullish-coalescing-operator@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1) - /@babel/plugin-transform-numeric-separator@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-numeric-separator@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1) - /@babel/plugin-transform-object-rest-spread@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-rest-spread@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/compat-data': 7.22.3 '@babel/core': 7.22.1 @@ -2754,24 +10662,15 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1) '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1) - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-super@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 @@ -2779,73 +10678,42 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-optional-catch-binding@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-catch-binding@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1) - /@babel/plugin-transform-optional-chaining@7.22.3(@babel/core@7.21.8): - resolution: {integrity: sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-chaining@7.22.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.8) - dev: true - /@babel/plugin-transform-optional-chaining@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-chaining@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1) - /@babel/plugin-transform-parameters@7.22.3(@babel/core@7.12.9): - resolution: {integrity: sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-parameters@7.22.3(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-parameters@7.22.3(@babel/core@7.21.8): - resolution: {integrity: sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-parameters@7.22.3(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-parameters@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-parameters@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-methods@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) @@ -2853,11 +10721,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-private-property-in-object@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-property-in-object@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 @@ -2867,60 +10731,32 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.1) - dev: false - /@babel/plugin-transform-react-jsx@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 @@ -2928,13 +10764,8 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.1) '@babel/types': 7.22.5 - dev: true - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 @@ -2942,64 +10773,36 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.1) '@babel/types': 7.22.5 - dev: false - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.1 - dev: true - /@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.22.1): - resolution: {integrity: sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.1 - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-runtime@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-module-imports': 7.22.5 @@ -3010,110 +10813,60 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.8): - resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - dev: true - /@babel/plugin-transform-spread@7.20.7(@babel/core@7.22.1): - resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-spread@7.20.7(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.8): - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.22.1): - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.8): - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.22.1): - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typescript@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.22.5 @@ -3123,71 +10876,41 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.22.1): - resolution: {integrity: sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-property-regex@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.8): - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.22.1): - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex@7.22.3(@babel/core@7.22.1): - resolution: {integrity: sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-unicode-sets-regex@7.22.3(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.21.5(@babel/core@7.21.8)': dependencies: '@babel/compat-data': 7.22.3 '@babel/core': 7.21.8 @@ -3268,13 +10991,8 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/preset-env@7.22.4(@babel/core@7.22.1): - resolution: {integrity: sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.22.4(@babel/core@7.22.1)': dependencies: '@babel/compat-data': 7.22.3 '@babel/core': 7.22.1 @@ -3360,22 +11078,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-flow@7.21.4(@babel/core@7.22.1): - resolution: {integrity: sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-flow@7.21.4(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.22.1) - dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.21.8): - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-modules@0.1.5(@babel/core@7.21.8)': dependencies: '@babel/core': 7.21.8 '@babel/helper-plugin-utils': 7.22.5 @@ -3383,12 +11093,8 @@ packages: '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.8) '@babel/types': 7.22.5 esutils: 2.0.3 - dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.22.1): - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-modules@0.1.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 @@ -3397,11 +11103,7 @@ packages: '@babel/types': 7.22.5 esutils: 2.0.3 - /@babel/preset-react@7.22.5(@babel/core@7.22.1): - resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-react@7.22.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 @@ -3410,13 +11112,8 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.1) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.22.1) '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.22.1) - dev: false - /@babel/preset-typescript@7.21.5(@babel/core@7.22.1): - resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.21.5(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@babel/helper-plugin-utils': 7.22.5 @@ -3427,11 +11124,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/register@7.21.0(@babel/core@7.22.1): - resolution: {integrity: sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/register@7.21.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 clone-deep: 4.0.1 @@ -3439,36 +11132,25 @@ packages: make-dir: 2.1.0 pirates: 4.0.5 source-map-support: 0.5.21 - dev: true - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + '@babel/regjsgen@0.8.0': {} - /@babel/runtime-corejs3@7.22.5: - resolution: {integrity: sha512-TNPDN6aBFaUox2Lu+H/Y1dKKQgr4ucz/FGyCz67RVYLsBpVpUFf1dDngzg+Od8aqbrqwyztkaZjtWCZEUOT8zA==} - engines: {node: '>=6.9.0'} + '@babel/runtime-corejs3@7.22.5': dependencies: core-js-pure: 3.31.0 regenerator-runtime: 0.13.11 - dev: false - /@babel/runtime@7.22.3: - resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.22.3': dependencies: regenerator-runtime: 0.13.11 - - /@babel/template@7.21.9: - resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} - engines: {node: '>=6.9.0'} + + '@babel/template@7.21.9': dependencies: '@babel/code-frame': 7.21.4 '@babel/parser': 7.22.4 '@babel/types': 7.22.5 - /@babel/traverse@7.21.5: - resolution: {integrity: sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.21.5': dependencies: '@babel/code-frame': 7.21.4 '@babel/generator': 7.22.3 @@ -3482,11 +11164,8 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/traverse@7.22.4: - resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.22.4': dependencies: '@babel/code-frame': 7.21.4 '@babel/generator': 7.22.3 @@ -3501,50 +11180,26 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.21.5: - resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} - engines: {node: '>=6.9.0'} + '@babel/types@7.21.5': dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - dev: true - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} - engines: {node: '>=6.9.0'} + '@babel/types@7.22.5': dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true + '@colors/colors@1.5.0': optional: true - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + '@discoveryjs/json-ext@0.5.7': {} - /@docsearch/css@3.5.1: - resolution: {integrity: sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==} - dev: false + '@docsearch/css@3.5.1': {} - /@docsearch/react@3.5.1(@algolia/client-search@4.18.0)(react-dom@17.0.2)(react@17.0.2)(search-insights@2.6.0): - resolution: {integrity: sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true + '@docsearch/react@3.5.1(@algolia/client-search@4.18.0)(react-dom@17.0.2)(react@17.0.2)(search-insights@2.6.0)': dependencies: '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.6.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) @@ -3555,15 +11210,8 @@ packages: transitivePeerDependencies: - '@algolia/client-search' - search-insights - dev: false - /@docusaurus/core@2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==} - engines: {node: '>=16.14'} - hasBin: true - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/core@2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@babel/core': 7.22.1 '@babel/generator': 7.22.3 @@ -3619,7 +11267,7 @@ packages: react-dev-utils: 12.0.1(eslint@7.32.0)(typescript@4.9.4)(webpack@5.88.0) react-dom: 17.0.2(react@17.0.2) react-helmet-async: 1.3.0(react-dom@17.0.2)(react@17.0.2) - react-loadable: /@docusaurus/react-loadable@5.5.2(react@17.0.2) + react-loadable: '@docusaurus/react-loadable@5.5.2(react@17.0.2)' react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.0) react-router: 5.3.4(react@17.0.2) react-router-config: 5.1.1(react-router@5.3.4)(react@17.0.2) @@ -3655,32 +11303,20 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/cssnano-preset@2.4.1: - resolution: {integrity: sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==} - engines: {node: '>=16.14'} + '@docusaurus/cssnano-preset@2.4.1': dependencies: cssnano-preset-advanced: 5.3.10(postcss@8.4.24) postcss: 8.4.24 postcss-sort-media-queries: 4.4.1(postcss@8.4.24) tslib: 2.6.2 - dev: false - /@docusaurus/logger@2.4.1: - resolution: {integrity: sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==} - engines: {node: '>=16.14'} + '@docusaurus/logger@2.4.1': dependencies: chalk: 4.1.2 tslib: 2.6.2 - dev: false - /@docusaurus/mdx-loader@2.4.1(@docusaurus/types@2.4.1)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/mdx-loader@2.4.1(@docusaurus/types@2.4.1)(react-dom@17.0.2)(react@17.0.2)': dependencies: '@babel/parser': 7.22.4 '@babel/traverse': 7.22.4 @@ -3708,13 +11344,8 @@ packages: - supports-color - uglify-js - webpack-cli - dev: false - /@docusaurus/module-type-aliases@2.4.1(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==} - peerDependencies: - react: '*' - react-dom: '*' + '@docusaurus/module-type-aliases@2.4.1(react-dom@17.0.2)(react@17.0.2)': dependencies: '@docusaurus/react-loadable': 5.5.2(react@17.0.2) '@docusaurus/types': 2.4.1(react-dom@17.0.2)(react@17.0.2) @@ -3725,19 +11356,14 @@ packages: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) react-helmet-async: 1.3.0(react-dom@17.0.2)(react@17.0.2) - react-loadable: /@docusaurus/react-loadable@5.5.2(react@17.0.2) + react-loadable: '@docusaurus/react-loadable@5.5.2(react@17.0.2)' transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli - /@docusaurus/plugin-content-blog@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-content-blog@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/logger': 2.4.1 @@ -3773,14 +11399,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/plugin-content-docs@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-content-docs@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/logger': 2.4.1 @@ -3816,14 +11436,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/plugin-content-pages@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-content-pages@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/mdx-loader': 2.4.1(@docusaurus/types@2.4.1)(react-dom@17.0.2)(react@17.0.2) @@ -3851,14 +11465,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/plugin-debug@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-debug@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/types': 2.4.1(react-dom@17.0.2)(react@17.0.2) @@ -3886,14 +11494,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/plugin-google-analytics@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-google-analytics@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/types': 2.4.1(react-dom@17.0.2)(react@17.0.2) @@ -3917,14 +11519,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/plugin-google-gtag@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-google-gtag@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/types': 2.4.1(react-dom@17.0.2)(react@17.0.2) @@ -3948,14 +11544,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/plugin-google-tag-manager@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-google-tag-manager@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/types': 2.4.1(react-dom@17.0.2)(react@17.0.2) @@ -3979,14 +11569,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/plugin-sitemap@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/plugin-sitemap@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/logger': 2.4.1 @@ -4015,14 +11599,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/preset-classic@2.4.1(@algolia/client-search@4.18.0)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(search-insights@2.6.0)(typescript@4.9.4): - resolution: {integrity: sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/preset-classic@2.4.1(@algolia/client-search@4.18.0)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(search-insights@2.6.0)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/plugin-content-blog': 2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) @@ -4059,23 +11637,14 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/react-loadable@5.5.2(react@17.0.2): - resolution: {integrity: sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==} - peerDependencies: - react: '*' + '@docusaurus/react-loadable@5.5.2(react@17.0.2)': dependencies: '@types/react': 18.2.15 prop-types: 15.8.1 react: 17.0.2 - /@docusaurus/theme-classic@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/theme-classic@2.4.1(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) '@docusaurus/mdx-loader': 2.4.1(@docusaurus/types@2.4.1)(react-dom@17.0.2)(react@17.0.2) @@ -4120,14 +11689,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/theme-common@2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): - resolution: {integrity: sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/theme-common@2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4)': dependencies: '@docusaurus/mdx-loader': 2.4.1(@docusaurus/types@2.4.1)(react-dom@17.0.2)(react@17.0.2) '@docusaurus/module-type-aliases': 2.4.1(react-dom@17.0.2)(react@17.0.2) @@ -4164,14 +11727,8 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/theme-search-algolia@2.4.1(@algolia/client-search@4.18.0)(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(search-insights@2.6.0)(typescript@4.9.4): - resolution: {integrity: sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==} - engines: {node: '>=16.14'} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/theme-search-algolia@2.4.1(@algolia/client-search@4.18.0)(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(search-insights@2.6.0)(typescript@4.9.4)': dependencies: '@docsearch/react': 3.5.1(@algolia/client-search@4.18.0)(react-dom@17.0.2)(react@17.0.2)(search-insights@2.6.0) '@docusaurus/core': 2.4.1(@docusaurus/types@2.4.1)(eslint@7.32.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) @@ -4211,21 +11768,13 @@ packages: - utf-8-validate - vue-template-compiler - webpack-cli - dev: false - /@docusaurus/theme-translations@2.4.1: - resolution: {integrity: sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==} - engines: {node: '>=16.14'} + '@docusaurus/theme-translations@2.4.1': dependencies: fs-extra: 10.1.0 tslib: 2.6.2 - dev: false - /@docusaurus/types@2.4.1(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 + '@docusaurus/types@2.4.1(react-dom@17.0.2)(react@17.0.2)': dependencies: '@types/history': 4.7.11 '@types/react': 18.2.15 @@ -4243,22 +11792,12 @@ packages: - uglify-js - webpack-cli - /@docusaurus/utils-common@2.4.1(@docusaurus/types@2.4.1): - resolution: {integrity: sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==} - engines: {node: '>=16.14'} - peerDependencies: - '@docusaurus/types': '*' - peerDependenciesMeta: - '@docusaurus/types': - optional: true + '@docusaurus/utils-common@2.4.1(@docusaurus/types@2.4.1)': dependencies: '@docusaurus/types': 2.4.1(react-dom@17.0.2)(react@17.0.2) tslib: 2.6.2 - dev: false - /@docusaurus/utils-validation@2.4.1(@docusaurus/types@2.4.1): - resolution: {integrity: sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==} - engines: {node: '>=16.14'} + '@docusaurus/utils-validation@2.4.1(@docusaurus/types@2.4.1)': dependencies: '@docusaurus/logger': 2.4.1 '@docusaurus/utils': 2.4.1(@docusaurus/types@2.4.1) @@ -4272,16 +11811,8 @@ packages: - supports-color - uglify-js - webpack-cli - dev: false - /@docusaurus/utils@2.4.1(@docusaurus/types@2.4.1): - resolution: {integrity: sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==} - engines: {node: '>=16.14'} - peerDependencies: - '@docusaurus/types': '*' - peerDependenciesMeta: - '@docusaurus/types': - optional: true + '@docusaurus/utils@2.4.1(@docusaurus/types@2.4.1)': dependencies: '@docusaurus/logger': 2.4.1 '@docusaurus/types': 2.4.1(react-dom@17.0.2)(react@17.0.2) @@ -4306,417 +11837,154 @@ packages: - supports-color - uglify-js - webpack-cli - dev: false - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': dependencies: react: 18.2.0 - dev: true - - /@esbuild/android-arm64@0.16.10: - resolution: {integrity: sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true + '@esbuild/android-arm64@0.16.10': optional: true - /@esbuild/android-arm@0.16.10: - resolution: {integrity: sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm64@0.17.19': optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true + '@esbuild/android-arm@0.16.10': optional: true - /@esbuild/android-x64@0.16.10: - resolution: {integrity: sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm@0.17.19': optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true + '@esbuild/android-x64@0.16.10': optional: true - /@esbuild/darwin-arm64@0.16.10: - resolution: {integrity: sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/android-x64@0.17.19': optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true + '@esbuild/darwin-arm64@0.16.10': optional: true - /@esbuild/darwin-x64@0.16.10: - resolution: {integrity: sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/darwin-arm64@0.17.19': optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true + '@esbuild/darwin-x64@0.16.10': optional: true - /@esbuild/freebsd-arm64@0.16.10: - resolution: {integrity: sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/darwin-x64@0.17.19': optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true + '@esbuild/freebsd-arm64@0.16.10': optional: true - /@esbuild/freebsd-x64@0.16.10: - resolution: {integrity: sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/freebsd-arm64@0.17.19': optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true + '@esbuild/freebsd-x64@0.16.10': optional: true - /@esbuild/linux-arm64@0.16.10: - resolution: {integrity: sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/freebsd-x64@0.17.19': optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@esbuild/linux-arm64@0.16.10': optional: true - /@esbuild/linux-arm@0.16.10: - resolution: {integrity: sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm64@0.17.19': optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true + '@esbuild/linux-arm@0.16.10': optional: true - /@esbuild/linux-ia32@0.16.10: - resolution: {integrity: sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm@0.17.19': optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true + '@esbuild/linux-ia32@0.16.10': optional: true - /@esbuild/linux-loong64@0.14.54: - resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ia32@0.17.19': optional: true - /@esbuild/linux-loong64@0.16.10: - resolution: {integrity: sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-loong64@0.14.54': optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true + '@esbuild/linux-loong64@0.16.10': optional: true - /@esbuild/linux-mips64el@0.16.10: - resolution: {integrity: sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-loong64@0.17.19': optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true + '@esbuild/linux-mips64el@0.16.10': optional: true - /@esbuild/linux-ppc64@0.16.10: - resolution: {integrity: sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-mips64el@0.17.19': optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true + '@esbuild/linux-ppc64@0.16.10': optional: true - /@esbuild/linux-riscv64@0.16.10: - resolution: {integrity: sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-ppc64@0.17.19': optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true + '@esbuild/linux-riscv64@0.16.10': optional: true - - /@esbuild/linux-s390x@0.16.10: - resolution: {integrity: sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false + + '@esbuild/linux-riscv64@0.17.19': optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true + '@esbuild/linux-s390x@0.16.10': optional: true - /@esbuild/linux-x64@0.16.10: - resolution: {integrity: sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-s390x@0.17.19': optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true + '@esbuild/linux-x64@0.16.10': optional: true - /@esbuild/netbsd-x64@0.16.10: - resolution: {integrity: sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false + '@esbuild/linux-x64@0.17.19': optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true + '@esbuild/netbsd-x64@0.16.10': optional: true - /@esbuild/openbsd-x64@0.16.10: - resolution: {integrity: sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false + '@esbuild/netbsd-x64@0.17.19': optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true + '@esbuild/openbsd-x64@0.16.10': optional: true - /@esbuild/sunos-x64@0.16.10: - resolution: {integrity: sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false + '@esbuild/openbsd-x64@0.17.19': optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true + '@esbuild/sunos-x64@0.16.10': optional: true - /@esbuild/win32-arm64@0.16.10: - resolution: {integrity: sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/sunos-x64@0.17.19': optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true + '@esbuild/win32-arm64@0.16.10': optional: true - /@esbuild/win32-ia32@0.16.10: - resolution: {integrity: sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-arm64@0.17.19': optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true + '@esbuild/win32-ia32@0.16.10': optional: true - /@esbuild/win32-x64@0.16.10: - resolution: {integrity: sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-ia32@0.17.19': optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true + '@esbuild/win32-x64@0.16.10': optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@esbuild/win32-x64@0.17.19': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.45.0)': dependencies: eslint: 8.45.0 eslint-visitor-keys: 3.4.1 - dev: false - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: false + '@eslint-community/regexpp@4.5.1': {} - /@eslint/eslintrc@0.4.3: - resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} - engines: {node: ^10.12.0 || >=12.0.0} + '@eslint/eslintrc@0.4.3': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -4730,9 +11998,7 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.0': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -4745,51 +12011,32 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: false - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + '@eslint/js@8.44.0': {} - /@fal-works/esbuild-plugin-global-externals@2.1.2: - resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - dev: true + '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + '@hapi/hoek@9.3.0': {} - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 - /@headlessui/react@1.7.15(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 + '@headlessui/react@1.7.15(react-dom@18.2.0)(react@18.2.0)': dependencies: client-only: 0.0.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.10': dependencies: '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: false - /@humanwhocodes/config-array@0.5.0: - resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.5.0': dependencies: '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.4 @@ -4797,39 +12044,25 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: false + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + '@humanwhocodes/object-schema@1.2.1': {} - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + '@istanbuljs/schema@0.1.3': {} - /@jest/schemas@29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.4.3': dependencies: '@sinclair/typebox': 0.25.24 - /@jest/transform@29.5.0: - resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@29.5.0': dependencies: '@babel/core': 7.22.1 '@jest/types': 29.5.0 @@ -4848,11 +12081,8 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /@jest/types@29.5.0: - resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.5.0': dependencies: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 @@ -4861,59 +12091,41 @@ packages: '@types/yargs': 17.0.24 chalk: 4.1.2 - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.18 - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.0': {} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.1.2': {} - /@jridgewell/source-map@0.3.3: - resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + '@jridgewell/source-map@0.3.3': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + '@jridgewell/sourcemap-codec@1.4.14': {} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + '@jridgewell/trace-mapping@0.3.18': dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 - /@juggle/resize-observer@3.4.0: - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - dev: true + '@juggle/resize-observer@3.4.0': {} - /@leichtgewicht/ip-codec@2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: false + '@leichtgewicht/ip-codec@2.0.4': {} - /@lit-labs/ssr-dom-shim@1.1.1: - resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + '@lit-labs/ssr-dom-shim@1.1.1': {} - /@lit/reactive-element@1.6.2: - resolution: {integrity: sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==} + '@lit/reactive-element@1.6.2': dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 - /@mapbox/node-pre-gyp@1.0.10: - resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} - hasBin: true + '@mapbox/node-pre-gyp@1.0.10': dependencies: detect-libc: 2.0.1 https-proxy-agent: 5.0.1 @@ -4928,8 +12140,7 @@ packages: - encoding - supports-color - /@mdx-js/mdx@1.6.22: - resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} + '@mdx-js/mdx@1.6.22': dependencies: '@babel/core': 7.12.9 '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) @@ -4952,45 +12163,28 @@ packages: unist-util-visit: 2.0.3 transitivePeerDependencies: - supports-color - dev: false - /@mdx-js/react@1.6.22(react@17.0.2): - resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} - peerDependencies: - react: ^16.13.1 || ^17.0.0 + '@mdx-js/react@1.6.22(react@17.0.2)': dependencies: react: 17.0.2 - dev: false - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' + '@mdx-js/react@2.3.0(react@18.2.0)': dependencies: '@types/mdx': 2.0.5 '@types/react': 18.2.15 react: 18.2.0 - dev: true - /@mdx-js/util@1.6.22: - resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} - dev: false + '@mdx-js/util@1.6.22': {} - /@mysten/bcs@0.7.3: - resolution: {integrity: sha512-fbusBfsyc2MpTACi72H5edWJ670T84va+qn9jSPpb5BzZ+pzUM1Q0ApPrF5OT+mB1o5Ng+mxPQpBCZQkfiV2TA==} + '@mysten/bcs@0.7.3': dependencies: bs58: 5.0.0 - dev: false - /@mysten/bcs@0.7.4: - resolution: {integrity: sha512-6DKzM4L10Au3Og5EJRBqJZmXWZ7hS/clVjbVUH4sA0aFtS3AZo2xc+r5fUFfdJbaWZUxVaDiQ8BNiEZWkAnEOw==} + '@mysten/bcs@0.7.4': dependencies: bs58: 5.0.0 - dev: false - /@mysten/sui.js@0.40.0: - resolution: {integrity: sha512-PEGdMe+QgpIdDIpyO4/yb+CK4x3Hki+kYPbQ5n3DVsWyb2ztFwB+5oYdc7qG3QkniO1lnCrlSHqZ5mN+x3RzrQ==} - engines: {node: '>=16'} + '@mysten/sui.js@0.40.0': dependencies: '@mysten/bcs': 0.7.3 '@noble/curves': 1.1.0 @@ -5006,11 +12200,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@mysten/sui.js@0.42.0: - resolution: {integrity: sha512-khYpfrWTRNk7WTuDWJx/KCbleqY1B40gVRt1DttqlNkD2lvg134xZn7F/r94jxgnUETbK+hVoQvBY7F36MsfRw==} - engines: {node: '>=16'} + '@mysten/sui.js@0.42.0': dependencies: '@mysten/bcs': 0.7.4 '@noble/curves': 1.1.0 @@ -5026,11 +12217,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@mysten/wallet-adapter-base@0.9.0: - resolution: {integrity: sha512-Obcfd30AC0Tcyvqc9+h0vvjrRB6Td2PNWhxRlTq/hSxDY66M3XqTLgoO8wDBtz+91oga4obAYvM02m7xV7X0Zw==} - deprecated: Wallet adapters have been deprecated in favor of the Wallet Standard. Please upgrade to the latest Wallet Kit versions. + '@mysten/wallet-adapter-base@0.9.0': dependencies: '@mysten/sui.js': 0.40.0 '@mysten/wallet-standard': 0.6.0 @@ -5038,11 +12226,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@mysten/wallet-adapter-wallet-standard@0.8.0: - resolution: {integrity: sha512-WPQSQTUvQCX2PPuVU8NHEzXg+mMCzIKqMG6llt0tLxc4enTtFHw9Do4i298NyZ00zWWzHdx9MXjBOl1OuybURg==} - deprecated: Wallet adapters have been deprecated in favor of the Wallet Standard. Please upgrade to the latest Wallet Kit versions. + '@mysten/wallet-adapter-wallet-standard@0.8.0': dependencies: '@mysten/sui.js': 0.40.0 '@mysten/wallet-adapter-base': 0.9.0 @@ -5052,10 +12237,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@mysten/wallet-kit-core@0.6.3: - resolution: {integrity: sha512-Crm18bHFecxqDI6ZGhHCAOB8CpLQ84NB3RFpvYnyk0yDGzNcYahjaG37ns+M7cHp0jbg64ySRV/ETzOaGPfRIw==} + '@mysten/wallet-kit-core@0.6.3': dependencies: '@mysten/sui.js': 0.42.0 '@mysten/wallet-standard': 0.8.0 @@ -5063,13 +12246,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@mysten/wallet-kit@0.7.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wkmVny9Cqu2AiLf7FW3wq11+XNOoCi/gQ6ZiKcMsRmTWT8uoP7BG89lsIkP98lOARUa/GaWjTItESiHBNYXcZw==} - peerDependencies: - react: '*' - react-dom: '*' + '@mysten/wallet-kit@0.7.3(react-dom@18.2.0)(react@18.2.0)': dependencies: '@headlessui/react': 1.7.15(react-dom@18.2.0)(react@18.2.0) '@mysten/sui.js': 0.42.0 @@ -5082,10 +12260,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@mysten/wallet-standard@0.6.0: - resolution: {integrity: sha512-xE/OijN9zIPoTjTWuxlYMHtp7kXPcAR8dDAbxOIH5h7EZCTk+G6p+SzDp8jV5magf50VcYP0cVjS4CQLx1wQuQ==} + '@mysten/wallet-standard@0.6.0': dependencies: '@mysten/sui.js': 0.40.0 '@wallet-standard/core': 1.0.3 @@ -5093,10 +12269,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@mysten/wallet-standard@0.8.0: - resolution: {integrity: sha512-kFh1iybKxaY+lchN+rtVBT5+UL1IHorZ81Ktg9200tcLeUqLB3V/K1PRqkj2dk0eUGDaLEH+yWjBF9hnyH4rgQ==} + '@mysten/wallet-standard@0.8.0': dependencies: '@mysten/sui.js': 0.42.0 '@wallet-standard/core': 1.0.3 @@ -5104,109 +12278,47 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@ndelangen/get-tarball@3.0.9: - resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} + '@ndelangen/get-tarball@3.0.9': dependencies: gunzip-maybe: 1.4.2 pump: 3.0.0 tar-fs: 2.1.1 - dev: true - /@next/env@13.4.10: - resolution: {integrity: sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==} - dev: false + '@next/env@13.4.10': {} - /@next/eslint-plugin-next@13.4.10: - resolution: {integrity: sha512-YJqyq6vk39JQfvaNtN83t/p5Jy45+bazRL+V4QI8FPd3FBqFYMEsULiwRLgSJMgFqkk4t4JbeZurz+gILEAFpA==} + '@next/eslint-plugin-next@13.4.10': dependencies: glob: 7.1.7 - dev: false - /@next/swc-darwin-arm64@13.4.10: - resolution: {integrity: sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-arm64@13.4.10': optional: true - /@next/swc-darwin-x64@13.4.10: - resolution: {integrity: sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-x64@13.4.10': optional: true - /@next/swc-linux-arm64-gnu@13.4.10: - resolution: {integrity: sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-gnu@13.4.10': optional: true - /@next/swc-linux-arm64-musl@13.4.10: - resolution: {integrity: sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-musl@13.4.10': optional: true - /@next/swc-linux-x64-gnu@13.4.10: - resolution: {integrity: sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-gnu@13.4.10': optional: true - /@next/swc-linux-x64-musl@13.4.10: - resolution: {integrity: sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-musl@13.4.10': optional: true - /@next/swc-win32-arm64-msvc@13.4.10: - resolution: {integrity: sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-arm64-msvc@13.4.10': optional: true - /@next/swc-win32-ia32-msvc@13.4.10: - resolution: {integrity: sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-ia32-msvc@13.4.10': optional: true - /@next/swc-win32-x64-msvc@13.4.10: - resolution: {integrity: sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-x64-msvc@13.4.10': optional: true - /@nightlylabs/nightly-connect-base@0.0.27: - resolution: {integrity: sha512-aDpQJicIjL7S+EzwBgUzMEY/L/HtFalfhf4APE3GaDqK9JqtLJDO9d2RmUQDinTtb1mG9MsHpWBtU6fjYo+PHw==} + '@nightlylabs/nightly-connect-base@0.0.27': dependencies: cross-fetch: 3.1.6 eventemitter3: 5.0.1 @@ -5218,10 +12330,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@nightlylabs/nightly-connect-polkadot@0.0.15: - resolution: {integrity: sha512-WCsumvHwhPipbxPQoswKCwHykwJ48Dffwb9hCf7zjCgEysIBCnA6Dzj/2G80drLqYYpS285nMa8z+3NaXVu2dA==} + '@nightlylabs/nightly-connect-polkadot@0.0.15': dependencies: '@nightlylabs/nightly-connect-base': 0.0.27 '@polkadot/api': 10.10.1 @@ -5236,10 +12346,8 @@ packages: - encoding - supports-color - utf-8-validate - dev: false - /@nightlylabs/nightly-connect-solana@0.0.28: - resolution: {integrity: sha512-8PBkmuXzWZNPqu6SGT2tsGK4DgD3yswQsUVb3L+GgFGCdQI7eUqyHd2ofWFWzEgj4a1XuixA29ZcSyw20ajgzw==} + '@nightlylabs/nightly-connect-solana@0.0.28': dependencies: '@nightlylabs/nightly-connect-base': 0.0.27 '@solana/web3.js': 1.77.2 @@ -5250,10 +12358,8 @@ packages: - encoding - supports-color - utf-8-validate - dev: false - /@nightlylabs/nightly-connect-sui@0.0.28: - resolution: {integrity: sha512-2+4YFTN+86J3kGYQMKiurThU5J+3g1+IDtCnv9+JSXvagU1bU9Kfps5NGCYASGlZ9Ut6duAoMiw8IBwr0Rd0mQ==} + '@nightlylabs/nightly-connect-sui@0.0.28': dependencies: '@mysten/sui.js': 0.42.0 '@mysten/wallet-standard': 0.8.0 @@ -5265,16 +12371,12 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@nightlylabs/qr-code@2.0.4: - resolution: {integrity: sha512-GU8u8Cm1Q5YnoB/kikM4whFQhJ7ZWKaazBm4wiZK9Qi64Ht9tyRVzASBbZRpeOZVzxwi7Mml5sz0hUKPEFMpdA==} + '@nightlylabs/qr-code@2.0.4': dependencies: qrcode-generator: 1.4.4 - dev: false - /@nightlylabs/wallet-selector-base@0.2.4: - resolution: {integrity: sha512-r5WktkwgsNz6SFgEXnWYKdxmQMU2+0emckxyJqGgi9bnV5TnohWmXMaRHukB202ptYUI++37tbZa7P3DXm+BqQ==} + '@nightlylabs/wallet-selector-base@0.2.4': dependencies: '@nightlylabs/nightly-connect-base': 0.0.27 '@nightlylabs/wallet-selector-modal': 0.1.2 @@ -5286,10 +12388,8 @@ packages: - supports-color - ts-node - utf-8-validate - dev: false - /@nightlylabs/wallet-selector-modal@0.1.2: - resolution: {integrity: sha512-vxy9S2dEf3NARW6LDq2ZKpWMlk5JJFIuwUfSxkuJlgUg2OVSlnDS7vdho3h4DmluRU5GM9vVhaXUGHAVp5sDQg==} + '@nightlylabs/wallet-selector-modal@0.1.2': dependencies: '@nightlylabs/qr-code': 2.0.4 autoprefixer: 10.4.14(postcss@8.4.24) @@ -5300,10 +12400,8 @@ packages: transitivePeerDependencies: - supports-color - ts-node - dev: false - /@nightlylabs/wallet-selector-solana@0.2.6(bs58@4.0.1)(react@18.2.0): - resolution: {integrity: sha512-cVTKk+c6tGv4GeSQMlUaZ2si4A6ySKj41emkGJ8OtuwmtzwUym4Xuh3chXZYgGrMQgvPrX5+erIR4oq2GmGIPg==} + '@nightlylabs/wallet-selector-solana@0.2.6(bs58@4.0.1)(react@18.2.0)': dependencies: '@nightlylabs/nightly-connect-solana': 0.0.28 '@nightlylabs/wallet-selector-base': 0.2.4 @@ -5319,10 +12417,8 @@ packages: - supports-color - ts-node - utf-8-validate - dev: false - /@nightlylabs/wallet-selector-sui@0.2.6: - resolution: {integrity: sha512-FlFPbNo64leFM2qrH3obYH7UiXdyFjYtaojbuOqJW+a0+5LSwY3Wvjj5UEP4m968FCRXuTYkEliDiTm7c+4Hbg==} + '@nightlylabs/wallet-selector-sui@0.2.6': dependencies: '@mysten/sui.js': 0.42.0 '@mysten/wallet-adapter-base': 0.9.0 @@ -5339,69 +12435,44 @@ packages: - supports-color - ts-node - utf-8-validate - dev: false - /@noble/curves@1.0.0: - resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} + '@noble/curves@1.0.0': dependencies: '@noble/hashes': 1.3.0 - dev: false - /@noble/curves@1.1.0: - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + '@noble/curves@1.1.0': dependencies: '@noble/hashes': 1.3.1 - dev: false - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/curves@1.3.0': dependencies: '@noble/hashes': 1.3.3 - dev: false - /@noble/hashes@1.3.0: - resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} - dev: false + '@noble/hashes@1.3.0': {} - /@noble/hashes@1.3.1: - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} - dev: false + '@noble/hashes@1.3.1': {} - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + '@noble/hashes@1.3.2': {} - /@noble/hashes@1.3.3: - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - dev: false + '@noble/hashes@1.3.3': {} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 - /@open-rpc/client-js@1.8.1: - resolution: {integrity: sha512-vV+Hetl688nY/oWI9IFY0iKDrWuLdYhf7OIKI6U1DcnJV7r4gAgwRJjEr1QVYszUc0gjkHoQJzqevmXMGLyA0g==} + '@open-rpc/client-js@1.8.1': dependencies: isomorphic-fetch: 3.0.0 isomorphic-ws: 5.0.0(ws@7.5.9) @@ -5411,11 +12482,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: false - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/utils@2.4.2': dependencies: cross-spawn: 7.0.3 fast-glob: 3.3.0 @@ -5423,14 +12491,10 @@ packages: open: 9.1.0 picocolors: 1.0.0 tslib: 2.6.2 - dev: false - /@polka/url@1.0.0-next.21: - resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + '@polka/url@1.0.0-next.21': {} - /@polkadot/api-augment@10.10.1: - resolution: {integrity: sha512-J0r1DT1M5y75iO1iwcpUBokKD3q6b22kWlPfiHEDNFydVw5vm7OTRBk9Njjl8rOnlSzcW/Ya8qWfV/wkrqHxUQ==} - engines: {node: '>=16'} + '@polkadot/api-augment@10.10.1': dependencies: '@polkadot/api-base': 10.10.1 '@polkadot/rpc-augment': 10.10.1 @@ -5443,11 +12507,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/api-base@10.10.1: - resolution: {integrity: sha512-joH2Ywxnn+AStkw+JWAdF3i3WJy4NcBYp0SWJM/WqGafWR/FuHnati2pcj/MHzkHT8JkBippmSSJFvsqRhlwcQ==} - engines: {node: '>=16'} + '@polkadot/api-base@10.10.1': dependencies: '@polkadot/rpc-core': 10.10.1 '@polkadot/types': 10.10.1 @@ -5458,11 +12519,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/api-derive@10.10.1: - resolution: {integrity: sha512-Q9Ibs4eRPqdV8qnRzFPD3dlWNbLHxRqMqNTNPmNQwKPo5m6fcQbZ0UZy3yJ+PI9S4AQHGhsWtfoi5qW8006GHQ==} - engines: {node: '>=16'} + '@polkadot/api-derive@10.10.1': dependencies: '@polkadot/api': 10.10.1 '@polkadot/api-augment': 10.10.1 @@ -5478,11 +12536,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/api@10.10.1: - resolution: {integrity: sha512-YHVkmNvjGF4Eg3thAbVhj9UX3SXx+Yxk6yVuzsEcckEudIRHzL2ikIWGCfUprfzSeFNpUCKdJIi1tsxVHtA7Tg==} - engines: {node: '>=16'} + '@polkadot/api@10.10.1': dependencies: '@polkadot/api-augment': 10.10.1 '@polkadot/api-base': 10.10.1 @@ -5505,14 +12560,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/extension-inject@0.46.5(@polkadot/api@10.10.1)(@polkadot/util@12.5.1): - resolution: {integrity: sha512-QcpkCMuv7iFbWjufkw14JRozpEYFyjP0H8KOJ8IsHGfPd2DPiismQ0NXr+AS7f6U+0I+Rhv9E4dnXxtJPROVMQ==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/api': '*' - '@polkadot/util': '*' + '@polkadot/extension-inject@0.46.5(@polkadot/api@10.10.1)(@polkadot/util@12.5.1)': dependencies: '@polkadot/api': 10.10.1 '@polkadot/rpc-provider': 10.9.1 @@ -5525,39 +12574,26 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/keyring@12.5.1(@polkadot/util-crypto@12.5.1)(@polkadot/util@12.5.1): - resolution: {integrity: sha512-u6b+Q7wI6WY/vwmJS9uUHy/5hKZ226nTlVNmxjkj9GvrRsQvUSwS94163yHPJwiZJiIv5xK5m0rwCMyoYu+wjA==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': 12.5.1 - '@polkadot/util-crypto': 12.5.1 + '@polkadot/keyring@12.5.1(@polkadot/util-crypto@12.5.1)(@polkadot/util@12.5.1)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/util-crypto': 12.5.1(@polkadot/util@12.5.1) tslib: 2.6.2 - /@polkadot/networks@12.3.2: - resolution: {integrity: sha512-uCkyybKoeEm1daKr0uT/9oNDHDDzCy2/ZdVl346hQqfdR1Ct3BaxMjxqvdmb5N8aCw0cBWSfgsxAYtw8ESmllQ==} - engines: {node: '>=16'} + '@polkadot/networks@12.3.2': dependencies: '@polkadot/util': 12.3.2 '@substrate/ss58-registry': 1.43.0 tslib: 2.6.2 - dev: false - /@polkadot/networks@12.5.1: - resolution: {integrity: sha512-PP6UUdzz6iHHZH4q96cUEhTcydHj16+61sqeaYEJSF6Q9iY+5WVWQ26+rdjmre/EBdrMQkSS/CKy73mO5z/JkQ==} - engines: {node: '>=16'} + '@polkadot/networks@12.5.1': dependencies: '@polkadot/util': 12.5.1 '@substrate/ss58-registry': 1.43.0 tslib: 2.6.2 - /@polkadot/rpc-augment@10.10.1: - resolution: {integrity: sha512-PcvsX8DNV8BNDXXnY2K8F4mE7cWz7fKg8ykXNZTN8XUN6MrI4k/ohv7itYic7X5LaP25ZmQt5UiGyjKDGIELow==} - engines: {node: '>=16'} + '@polkadot/rpc-augment@10.10.1': dependencies: '@polkadot/rpc-core': 10.10.1 '@polkadot/types': 10.10.1 @@ -5568,11 +12604,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/rpc-core@10.10.1: - resolution: {integrity: sha512-awfFfJYsVF6W4DrqTj5RP00SSDRNB770FIoe1QE1Op4NcSrfeLpwh54HUJS716f4l5mOSYuvMp+zCbKzt8zKow==} - engines: {node: '>=16'} + '@polkadot/rpc-core@10.10.1': dependencies: '@polkadot/rpc-augment': 10.10.1 '@polkadot/rpc-provider': 10.10.1 @@ -5584,11 +12617,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/rpc-provider@10.10.1: - resolution: {integrity: sha512-VMDWoJgx6/mPHAOT66Sq+Jf2lJABfV/ZUIXtT2k8HjOndbm6oKrFqGEOSSLvB2q4olDee3FkFFxkyW1s6k4JaQ==} - engines: {node: '>=16'} + '@polkadot/rpc-provider@10.10.1': dependencies: '@polkadot/keyring': 12.5.1(@polkadot/util-crypto@12.5.1)(@polkadot/util@12.5.1) '@polkadot/types': 10.10.1 @@ -5608,11 +12638,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/rpc-provider@10.9.1: - resolution: {integrity: sha512-4QzT2QzD+320+eT6b79sGAA85Tt3Bb8fQvse4r5Mom2iiBd2SO81vOhxSAOaIe4GUsw25VzFJmsbe7+OObItdg==} - engines: {node: '>=16'} + '@polkadot/rpc-provider@10.9.1': dependencies: '@polkadot/keyring': 12.5.1(@polkadot/util-crypto@12.5.1)(@polkadot/util@12.5.1) '@polkadot/types': 10.9.1 @@ -5632,67 +12659,46 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /@polkadot/types-augment@10.10.1: - resolution: {integrity: sha512-XRHE75IocXfFE6EADYov3pqXCyBk5SWbiHoZ0+4WYWP9SwMuzsBaAy84NlhLBlkG3+ehIqi0HpAd/qrljJGZbg==} - engines: {node: '>=16'} + '@polkadot/types-augment@10.10.1': dependencies: '@polkadot/types': 10.10.1 '@polkadot/types-codec': 10.10.1 '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-augment@10.9.1: - resolution: {integrity: sha512-OY9/jTMFRFqYdkUnfcGwqMLC64A0Q25bjvCuVQCVjsPFKE3wl0Kt5rNT01eV2UmLXrR6fY0xWbR2w80bLA7CIQ==} - engines: {node: '>=16'} + '@polkadot/types-augment@10.9.1': dependencies: '@polkadot/types': 10.9.1 '@polkadot/types-codec': 10.9.1 '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-codec@10.10.1: - resolution: {integrity: sha512-ETPG0wzWzt/bDKRQmYbO7CLe/0lUt8VrG6/bECdv+Kye+8Qedba2LZyTWm/9f2ngms8TZ82yI8mPv/mozdtfnw==} - engines: {node: '>=16'} + '@polkadot/types-codec@10.10.1': dependencies: '@polkadot/util': 12.5.1 '@polkadot/x-bigint': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-codec@10.9.1: - resolution: {integrity: sha512-mJ5OegKGraY1FLvEa8FopRCr3pQrhDkcn5RNOjmgJQozENVeRaxhk0NwxYz7IojFvSDnKnc6lNQfKaaSe5pLHg==} - engines: {node: '>=16'} + '@polkadot/types-codec@10.9.1': dependencies: '@polkadot/util': 12.5.1 '@polkadot/x-bigint': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-create@10.10.1: - resolution: {integrity: sha512-7OiLzd+Ter5zrpjP7fDwA1m89kd38VvMVixfOSv8x7ld2pDT+yyyKl14TCwRSWrKWCMtIb6M3iasPhq5cUa7cw==} - engines: {node: '>=16'} + '@polkadot/types-create@10.10.1': dependencies: '@polkadot/types-codec': 10.10.1 '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-create@10.9.1: - resolution: {integrity: sha512-OVz50MGTTuiuVnRP/zAx4CTuLioc0hsiwNwqN2lNhmIJGtnQ4Vy/7mQRsIWehiYz6g0Vzzm5B3qWkTXO1NSN5w==} - engines: {node: '>=16'} + '@polkadot/types-create@10.9.1': dependencies: '@polkadot/types-codec': 10.9.1 '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-known@10.10.1: - resolution: {integrity: sha512-yRa1lbDRqg3V/zoa0vSwdGOiYTIWktILW8OfkaLDExTu0GZBSbVHZlLAta52XVpA9Zww7mrUUC9+iernOwk//w==} - engines: {node: '>=16'} + '@polkadot/types-known@10.10.1': dependencies: '@polkadot/networks': 12.5.1 '@polkadot/types': 10.10.1 @@ -5700,27 +12706,18 @@ packages: '@polkadot/types-create': 10.10.1 '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-support@10.10.1: - resolution: {integrity: sha512-Cd2mwk9RG6LlX8X3H0bRY7wCTbZPqU3z38CMFhvNkFDAyjqKjtn8hpS4n8mMrZK2EwCs/MjQH1wb7rtFkaWmJw==} - engines: {node: '>=16'} + '@polkadot/types-support@10.10.1': dependencies: '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types-support@10.9.1: - resolution: {integrity: sha512-XsieuLDsszvMZQlleacQBfx07i/JkwQV/UxH9q8Hz7Okmaz9pEVEW1h3ka2/cPuC7a4l32JhaORBUYshBZNdJg==} - engines: {node: '>=16'} + '@polkadot/types-support@10.9.1': dependencies: '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/types@10.10.1: - resolution: {integrity: sha512-Ben62P1tjYEhKag34GBGcLX6NqcFR1VD5nNbWaxgr+t36Jl/tlHs6P9DlbFqQP7Tt9FmGrAYY0m3oTkhjG1NzA==} - engines: {node: '>=16'} + '@polkadot/types@10.10.1': dependencies: '@polkadot/keyring': 12.5.1(@polkadot/util-crypto@12.5.1)(@polkadot/util@12.5.1) '@polkadot/types-augment': 10.10.1 @@ -5730,11 +12727,8 @@ packages: '@polkadot/util-crypto': 12.5.1(@polkadot/util@12.5.1) rxjs: 7.8.1 tslib: 2.6.2 - dev: false - /@polkadot/types@10.9.1: - resolution: {integrity: sha512-AG33i2ZGGfq7u+5rkAdGrXAQHHl844/Yv+junH5ZzX69xiCoWO1bH/yzDUNBdpki2GlACWvF9nLYh3F2tVF93w==} - engines: {node: '>=16'} + '@polkadot/types@10.9.1': dependencies: '@polkadot/keyring': 12.5.1(@polkadot/util-crypto@12.5.1)(@polkadot/util@12.5.1) '@polkadot/types-augment': 10.9.1 @@ -5744,13 +12738,8 @@ packages: '@polkadot/util-crypto': 12.5.1(@polkadot/util@12.5.1) rxjs: 7.8.1 tslib: 2.6.2 - dev: false - /@polkadot/util-crypto@12.3.2(@polkadot/util@12.5.1): - resolution: {integrity: sha512-pTpx+YxolY0BDT4RcGmgeKbHHD/dI6Ll9xRsqmVdIjpcVVY20uDNTyXs81ZNtfKgyod1y9JQkfNv2Dz9iEpTkQ==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': 12.3.2 + '@polkadot/util-crypto@12.3.2(@polkadot/util@12.5.1)': dependencies: '@noble/curves': 1.1.0 '@noble/hashes': 1.3.1 @@ -5762,13 +12751,8 @@ packages: '@polkadot/x-randomvalues': 12.3.2(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.1) '@scure/base': 1.1.1 tslib: 2.6.2 - dev: false - /@polkadot/util-crypto@12.5.1(@polkadot/util@12.5.1): - resolution: {integrity: sha512-Y8ORbMcsM/VOqSG3DgqutRGQ8XXK+X9M3C8oOEI2Tji65ZsXbh9Yh+ryPLM0oBp/9vqOXjkLgZJbbVuQceOw0A==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': 12.5.1 + '@polkadot/util-crypto@12.5.1(@polkadot/util@12.5.1)': dependencies: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 @@ -5781,9 +12765,7 @@ packages: '@scure/base': 1.1.3 tslib: 2.6.2 - /@polkadot/util@12.3.2: - resolution: {integrity: sha512-y/JShcGyOamCUiSIg++XZuLHt1ktSKBaSH2K5Nw5NXlgP0+7am+GZzqPB8fQ4qhYLruEOv+YRiz0GC1Zr9S+wg==} - engines: {node: '>=16'} + '@polkadot/util@12.3.2': dependencies: '@polkadot/x-bigint': 12.3.2 '@polkadot/x-global': 12.3.2 @@ -5792,11 +12774,8 @@ packages: '@types/bn.js': 5.1.1 bn.js: 5.2.1 tslib: 2.6.2 - dev: false - /@polkadot/util@12.5.1: - resolution: {integrity: sha512-fDBZL7D4/baMG09Qowseo884m3QBzErGkRWNBId1UjWR99kyex+cIY9fOSzmuQxo6nLdJlLHw1Nz2caN3+Bq0A==} - engines: {node: '>=16'} + '@polkadot/util@12.5.1': dependencies: '@polkadot/x-bigint': 12.5.1 '@polkadot/x-global': 12.5.1 @@ -5806,56 +12785,31 @@ packages: bn.js: 5.2.1 tslib: 2.6.2 - /@polkadot/wasm-bridge@7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2): - resolution: {integrity: sha512-uV/LHREDBGBbHrrv7HTki+Klw0PYZzFomagFWII4lp6Toj/VCvRh5WMzooVC+g/XsBGosAwrvBhoModabyHx+A==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' - '@polkadot/x-randomvalues': '*' + '@polkadot/wasm-bridge@7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-util': 7.2.1(@polkadot/util@12.5.1) '@polkadot/x-randomvalues': 12.3.2(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.1) tslib: 2.6.2 - dev: false - /@polkadot/wasm-bridge@7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1): - resolution: {integrity: sha512-CgNENd65DVYtackOVXXRA0D1RPoCv5+77IdBCf7kNqu6LeAnR4nfTI6qjaApUdN1xRweUsQjSH7tu7VjkMOA0A==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' - '@polkadot/x-randomvalues': '*' + '@polkadot/wasm-bridge@7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-util': 7.2.2(@polkadot/util@12.5.1) '@polkadot/x-randomvalues': 12.5.1(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.2) tslib: 2.6.2 - /@polkadot/wasm-crypto-asmjs@7.2.1(@polkadot/util@12.5.1): - resolution: {integrity: sha512-z/d21bmxyVfkzGsKef/FWswKX02x5lK97f4NPBZ9XBeiFkmzlXhdSnu58/+b1sKsRAGdW/Rn/rTNRDhW0GqCAg==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' + '@polkadot/wasm-crypto-asmjs@7.2.1(@polkadot/util@12.5.1)': dependencies: '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/wasm-crypto-asmjs@7.2.2(@polkadot/util@12.5.1): - resolution: {integrity: sha512-wKg+cpsWQCTSVhjlHuNeB/184rxKqY3vaklacbLOMbUXieIfuDBav5PJdzS3yeiVE60TpYaHW4iX/5OYHS82gg==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' + '@polkadot/wasm-crypto-asmjs@7.2.2(@polkadot/util@12.5.1)': dependencies: '@polkadot/util': 12.5.1 tslib: 2.6.2 - /@polkadot/wasm-crypto-init@7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2): - resolution: {integrity: sha512-GcEXtwN9LcSf32V9zSaYjHImFw16hCyo2Xzg4GLLDPPeaAAfbFr2oQMgwyDbvBrBjLKHVHjsPZyGhXae831amw==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' - '@polkadot/x-randomvalues': '*' + '@polkadot/wasm-crypto-init@7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-bridge': 7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2) @@ -5864,14 +12818,8 @@ packages: '@polkadot/wasm-util': 7.2.1(@polkadot/util@12.5.1) '@polkadot/x-randomvalues': 12.3.2(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.1) tslib: 2.6.2 - dev: false - /@polkadot/wasm-crypto-init@7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1): - resolution: {integrity: sha512-vD4iPIp9x+SssUIWUenxWLPw4BVIwhXHNMpsV81egK990tvpyIxL205/EF5QRb1mKn8WfWcNFm5tYwwh9NdnnA==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' - '@polkadot/x-randomvalues': '*' + '@polkadot/wasm-crypto-init@7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-bridge': 7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1) @@ -5881,33 +12829,19 @@ packages: '@polkadot/x-randomvalues': 12.5.1(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.2) tslib: 2.6.2 - /@polkadot/wasm-crypto-wasm@7.2.1(@polkadot/util@12.5.1): - resolution: {integrity: sha512-DqyXE4rSD0CVlLIw88B58+HHNyrvm+JAnYyuEDYZwCvzUWOCNos/DDg9wi/K39VAIsCCKDmwKqkkfIofuOj/lA==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' + '@polkadot/wasm-crypto-wasm@7.2.1(@polkadot/util@12.5.1)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-util': 7.2.1(@polkadot/util@12.5.1) tslib: 2.6.2 - dev: false - /@polkadot/wasm-crypto-wasm@7.2.2(@polkadot/util@12.5.1): - resolution: {integrity: sha512-3efoIB6jA3Hhv6k0YIBwCtlC8gCSWCk+R296yIXRLLr3cGN415KM/PO/d1JIXYI64lbrRzWRmZRhllw3jf6Atg==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' + '@polkadot/wasm-crypto-wasm@7.2.2(@polkadot/util@12.5.1)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-util': 7.2.2(@polkadot/util@12.5.1) tslib: 2.6.2 - /@polkadot/wasm-crypto@7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2): - resolution: {integrity: sha512-SA2+33S9TAwGhniKgztVN6pxUKpGfN4Tre/eUZGUfpgRkT92wIUT2GpGWQE+fCCqGQgADrNiBcwt6XwdPqMQ4Q==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' - '@polkadot/x-randomvalues': '*' + '@polkadot/wasm-crypto@7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-bridge': 7.2.1(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.3.2) @@ -5917,14 +12851,8 @@ packages: '@polkadot/wasm-util': 7.2.1(@polkadot/util@12.5.1) '@polkadot/x-randomvalues': 12.3.2(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.1) tslib: 2.6.2 - dev: false - /@polkadot/wasm-crypto@7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1): - resolution: {integrity: sha512-1ZY1rxUTawYm0m1zylvBMFovNIHYgG2v/XoASNp/EMG5c8FQIxCbhJRaTBA983GVq4lN/IAKREKEp9ZbLLqssA==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' - '@polkadot/x-randomvalues': '*' + '@polkadot/wasm-crypto@7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-bridge': 7.2.2(@polkadot/util@12.5.1)(@polkadot/x-randomvalues@12.5.1) @@ -5935,129 +12863,81 @@ packages: '@polkadot/x-randomvalues': 12.5.1(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.2) tslib: 2.6.2 - /@polkadot/wasm-util@7.2.1(@polkadot/util@12.5.1): - resolution: {integrity: sha512-FBSn/3aYJzhN0sYAYhHB8y9JL8mVgxLy4M1kUXYbyo+8GLRQEN5rns8Vcb8TAlIzBWgVTOOptYBvxo0oj0h7Og==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' + '@polkadot/wasm-util@7.2.1(@polkadot/util@12.5.1)': dependencies: '@polkadot/util': 12.5.1 tslib: 2.6.2 - dev: false - /@polkadot/wasm-util@7.2.2(@polkadot/util@12.5.1): - resolution: {integrity: sha512-N/25960ifCc56sBlJZ2h5UBpEPvxBmMLgwYsl7CUuT+ea2LuJW9Xh8VHDN/guYXwmm92/KvuendYkEUykpm/JQ==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': '*' + '@polkadot/wasm-util@7.2.2(@polkadot/util@12.5.1)': dependencies: '@polkadot/util': 12.5.1 tslib: 2.6.2 - /@polkadot/x-bigint@12.3.2: - resolution: {integrity: sha512-JLqLgfGXe/x+hZJETd5ZqfpVsbwyMsH5Nn1Q20ineMMjXN/ig+kVR8Mc15LXBMuw4g7LldFW6UUrotWnuMI8Yw==} - engines: {node: '>=16'} + '@polkadot/x-bigint@12.3.2': dependencies: '@polkadot/x-global': 12.3.2 tslib: 2.6.2 - dev: false - /@polkadot/x-bigint@12.5.1: - resolution: {integrity: sha512-Fw39eoN9v0sqxSzfSC5awaDVdzojIiE7d1hRSQgVSrES+8whWvtbYMR0qwbVhTuW7DvogHmye41P9xKMlXZysg==} - engines: {node: '>=16'} + '@polkadot/x-bigint@12.5.1': dependencies: '@polkadot/x-global': 12.5.1 tslib: 2.6.2 - /@polkadot/x-fetch@12.3.2: - resolution: {integrity: sha512-3IEuZ5S+RI/t33NsdPLIIa5COfDCfpUW2sbaByEczn75aD1jLqJZSEDwiBniJ2osyNd4uUxBf6e5jw7LAZeZJg==} - engines: {node: '>=16'} + '@polkadot/x-fetch@12.3.2': dependencies: '@polkadot/x-global': 12.3.2 node-fetch: 3.3.2 tslib: 2.6.2 - dev: false - /@polkadot/x-fetch@12.5.1: - resolution: {integrity: sha512-Bc019lOKCoQJrthiS+H3LwCahGtl5tNnb2HK7xe3DBQIUx9r2HsF/uEngNfMRUFkUYg5TPCLFbEWU8NIREBS1A==} - engines: {node: '>=16'} + '@polkadot/x-fetch@12.5.1': dependencies: '@polkadot/x-global': 12.5.1 node-fetch: 3.3.2 tslib: 2.6.2 - dev: false - /@polkadot/x-global@12.3.2: - resolution: {integrity: sha512-yVZq6oIegjlyh5rUZiTklgu+fL+W/DG1ypEa02683tUCB3avV5cA3PAHKptMSlb6FpweHu37lKKrqfAWrraDxg==} - engines: {node: '>=16'} + '@polkadot/x-global@12.3.2': dependencies: tslib: 2.6.2 - dev: false - /@polkadot/x-global@12.5.1: - resolution: {integrity: sha512-6K0YtWEg0eXInDOihU5aSzeb1t9TiDdX9ZuRly+58ALSqw5kPZYmQLbzE1d8HWzyXRXK+YH65GtLzfMGqfYHmw==} - engines: {node: '>=16'} + '@polkadot/x-global@12.5.1': dependencies: tslib: 2.6.2 - /@polkadot/x-randomvalues@12.3.2(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.1): - resolution: {integrity: sha512-ywjIs8CWpvOGmq+3cGCNPOHxAjPHdBUiXyDccftx5BRVdmtbt36gK/V84bKr6Xs73FGu0jprUAOSRRsLZX/3dg==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': 12.3.2 - '@polkadot/wasm-util': '*' + '@polkadot/x-randomvalues@12.3.2(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.1)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-util': 7.2.1(@polkadot/util@12.5.1) '@polkadot/x-global': 12.3.2 tslib: 2.6.2 - dev: false - /@polkadot/x-randomvalues@12.5.1(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.2): - resolution: {integrity: sha512-UsMb1d+77EPNjW78BpHjZLIm4TaIpfqq89OhZP/6gDIoS2V9iE/AK3jOWKm1G7Y2F8XIoX1qzQpuMakjfagFoQ==} - engines: {node: '>=16'} - peerDependencies: - '@polkadot/util': 12.5.1 - '@polkadot/wasm-util': '*' + '@polkadot/x-randomvalues@12.5.1(@polkadot/util@12.5.1)(@polkadot/wasm-util@7.2.2)': dependencies: '@polkadot/util': 12.5.1 '@polkadot/wasm-util': 7.2.2(@polkadot/util@12.5.1) '@polkadot/x-global': 12.5.1 tslib: 2.6.2 - /@polkadot/x-textdecoder@12.3.2: - resolution: {integrity: sha512-lY5bfA5xArJRWEJlYOlQQMJeTjWD8s0yMhchirVgf5xj8Id9vPGeUoneH+VFDEwgXxrqBvDFJ4smN4T/r6a/fg==} - engines: {node: '>=16'} + '@polkadot/x-textdecoder@12.3.2': dependencies: '@polkadot/x-global': 12.3.2 tslib: 2.6.2 - dev: false - /@polkadot/x-textdecoder@12.5.1: - resolution: {integrity: sha512-j2YZGWfwhMC8nHW3BXq10fAPY02ObLL/qoTjCMJ1Cmc/OGq18Ep7k9cXXbjFAq3wf3tUUewt/u/hStKCk3IvfQ==} - engines: {node: '>=16'} + '@polkadot/x-textdecoder@12.5.1': dependencies: '@polkadot/x-global': 12.5.1 tslib: 2.6.2 - /@polkadot/x-textencoder@12.3.2: - resolution: {integrity: sha512-iP3qEBiHzBckQ9zeY7ZHRWuu7mCEg5SMpOugs6UODRk8sx6KHzGQYlghBbWLit0uppPDVE0ifEwZ2n73djJHWQ==} - engines: {node: '>=16'} + '@polkadot/x-textencoder@12.3.2': dependencies: '@polkadot/x-global': 12.3.2 tslib: 2.6.2 - dev: false - /@polkadot/x-textencoder@12.5.1: - resolution: {integrity: sha512-1JNNpOGb4wD+c7zFuOqjibl49LPnHNr4rj4s3WflLUIZvOMY6euoDuN3ISjQSHCLlVSoH0sOCWA3qXZU4bCTDQ==} - engines: {node: '>=16'} + '@polkadot/x-textencoder@12.5.1': dependencies: '@polkadot/x-global': 12.5.1 tslib: 2.6.2 - /@polkadot/x-ws@12.3.2: - resolution: {integrity: sha512-yM9Z64pLNlHpJE43+Xtr+iUXmYpFFY5u5hrke2PJt13O48H8f9Vb9cRaIh94appLyICoS0aekGhDkGH+MCspBA==} - engines: {node: '>=16'} + '@polkadot/x-ws@12.3.2': dependencies: '@polkadot/x-global': 12.3.2 tslib: 2.6.2 @@ -6065,11 +12945,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@polkadot/x-ws@12.5.1: - resolution: {integrity: sha512-efNMhB3Lh6pW2iTipMkqwrjpuUtb3EwR/jYZftiIGo5tDPB7rqoMOp9s6KRFJEIUfZkLnMUtbkZ5fHzUJaCjmQ==} - engines: {node: '>=16'} + '@polkadot/x-ws@12.5.1': dependencies: '@polkadot/x-global': 12.5.1 tslib: 2.6.2 @@ -6077,23 +12954,13 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@pwrs/lit-css@2.0.0: - resolution: {integrity: sha512-Yb2Q+7ZlCfdCbQ4tvlpQ9uzwB2yc340fdEoeUu2FdO3w6z4+YLPQAPerV1XA8uFxQtSn88nCW4kH+J0TVL3Iyg==} + '@pwrs/lit-css@2.0.0': dependencies: string-to-template-literal: 2.0.0 uglifycss: 0.0.29 - dev: true - /@rollup/plugin-commonjs@24.1.0(rollup@3.23.1): - resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-commonjs@24.1.0(rollup@3.23.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) commondir: 1.0.1 @@ -6103,14 +12970,7 @@ packages: magic-string: 0.27.0 rollup: 3.23.1 - /@rollup/plugin-commonjs@25.0.0(rollup@3.23.1): - resolution: {integrity: sha512-hoho2Kay9TZrLu0bnDsTTCaj4Npa+THk9snajP/XDNb9a9mmjTjh52EQM9sKl3HD1LsnihX7js+eA2sd2uKAhw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-commonjs@25.0.0(rollup@3.23.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) commondir: 1.0.1 @@ -6119,39 +12979,19 @@ packages: is-reference: 1.2.1 magic-string: 0.27.0 rollup: 3.23.1 - dev: true - /@rollup/plugin-image@3.0.2(rollup@3.23.1): - resolution: {integrity: sha512-eGVrD6lummWH5ENo9LWX3JY62uBb9okUNQ2htXkugrG6WjACrMUVhWvss+0wW3fwJWmFYpoEny3yL4spEdh15g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-image@3.0.2(rollup@3.23.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) mini-svg-data-uri: 1.4.4 rollup: 3.23.1 - dev: true - /@rollup/plugin-json@6.0.0(rollup@3.23.1): - resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-json@6.0.0(rollup@3.23.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) rollup: 3.23.1 - /@rollup/plugin-node-resolve@13.3.0(rollup@3.23.1): - resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} - engines: {node: '>= 10.0.0'} - peerDependencies: - rollup: ^2.42.0 + '@rollup/plugin-node-resolve@13.3.0(rollup@3.23.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@3.23.1) '@types/resolve': 1.17.1 @@ -6161,14 +13001,7 @@ packages: resolve: 1.22.2 rollup: 3.23.1 - /@rollup/plugin-node-resolve@15.1.0(rollup@3.23.1): - resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-node-resolve@15.1.0(rollup@3.23.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) '@types/resolve': 1.20.2 @@ -6178,14 +13011,7 @@ packages: resolve: 1.22.2 rollup: 3.23.1 - /@rollup/plugin-node-resolve@15.2.1(rollup@3.23.1): - resolution: {integrity: sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-node-resolve@15.2.1(rollup@3.23.1)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) '@types/resolve': 1.20.2 @@ -6194,264 +13020,143 @@ packages: is-module: 1.0.0 resolve: 1.22.2 rollup: 3.23.1 - dev: true - /@rollup/plugin-terser@0.4.3(rollup@3.23.1): - resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.x || ^3.x - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-terser@0.4.3(rollup@3.23.1)': dependencies: rollup: 3.23.1 serialize-javascript: 6.0.1 smob: 1.4.0 terser: 5.17.7 - dev: true - /@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.5.3)(typescript@5.0.2): - resolution: {integrity: sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true + '@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.5.3)(typescript@5.0.2)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) resolve: 1.22.2 rollup: 3.23.1 tslib: 2.5.3 typescript: 5.0.2 - dev: true - /@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.5.3)(typescript@5.1.3): - resolution: {integrity: sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true + '@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.5.3)(typescript@5.1.3)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) resolve: 1.22.2 rollup: 3.23.1 tslib: 2.5.3 typescript: 5.1.3 - dev: true - /@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.5.3)(typescript@5.1.6): - resolution: {integrity: sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true + '@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.5.3)(typescript@5.1.6)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) resolve: 1.22.2 rollup: 3.23.1 tslib: 2.5.3 typescript: 5.1.6 - dev: true - /@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.6.2)(typescript@5.1.6): - resolution: {integrity: sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true + '@rollup/plugin-typescript@11.1.1(rollup@3.23.1)(tslib@2.6.2)(typescript@5.1.6)': dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) resolve: 1.22.2 rollup: 3.23.1 tslib: 2.6.2 typescript: 5.1.6 - dev: true - /@rollup/pluginutils@3.1.0(rollup@3.23.1): - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/pluginutils@3.1.0(rollup@3.23.1)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 3.23.1 - /@rollup/pluginutils@4.2.1: - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - /@rollup/pluginutils@5.0.2(rollup@3.23.1): - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.0.2(rollup@3.23.1)': dependencies: '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.23.1 - /@rushstack/eslint-patch@1.3.2: - resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} - dev: false + '@rushstack/eslint-patch@1.3.2': {} - /@scure/base@1.1.1: - resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} - dev: false + '@scure/base@1.1.1': {} - /@scure/base@1.1.3: - resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + '@scure/base@1.1.3': {} - /@scure/base@1.1.5: - resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} - dev: false + '@scure/base@1.1.5': {} - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + '@scure/bip32@1.3.2': dependencies: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 - dev: false - /@scure/bip32@1.3.3: - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@scure/bip32@1.3.3': dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 - dev: false - /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + '@scure/bip39@1.2.1': dependencies: '@noble/hashes': 1.3.3 '@scure/base': 1.1.5 - dev: false - /@sideway/address@4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + '@sideway/address@4.1.4': dependencies: '@hapi/hoek': 9.3.0 - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + '@sideway/formula@3.0.1': {} - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sideway/pinpoint@2.0.0': {} - /@sinclair/typebox@0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + '@sinclair/typebox@0.25.24': {} - /@sindresorhus/is@0.14.0: - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - dev: false + '@sindresorhus/is@0.14.0': {} - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: false + '@sindresorhus/is@4.6.0': {} - /@slorber/static-site-generator-webpack-plugin@4.0.7: - resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} - engines: {node: '>=14'} + '@slorber/static-site-generator-webpack-plugin@4.0.7': dependencies: eval: 0.1.8 p-map: 4.0.0 webpack-sources: 3.2.3 - dev: false - /@solana/buffer-layout@4.0.1: - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} + '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 - dev: false - /@solana/wallet-adapter-base@0.9.22(@solana/web3.js@1.77.2): - resolution: {integrity: sha512-xbLEZPGSJFvgTeldG9D55evhl7QK/3e/F7vhvcA97mEt1eieTgeKMnGlmmjs3yivI3/gtZNZeSk1XZLnhKcQvw==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.58.0 + '@solana/wallet-adapter-base@0.9.22(@solana/web3.js@1.77.2)': dependencies: '@solana/wallet-standard-features': 1.0.1 '@solana/web3.js': 1.77.2 '@wallet-standard/base': 1.0.1 '@wallet-standard/features': 1.0.3 eventemitter3: 4.0.7 - dev: false - /@solana/wallet-standard-chains@1.0.0: - resolution: {integrity: sha512-kr3+JAo7mEBhVCH9cYzjn/vXeUiZeYfB4BF6E8u3U2jq3KlZA/KB+YM976+zGumTfN0NmMXUm066pTTG9kJsNQ==} - engines: {node: '>=16'} + '@solana/wallet-standard-chains@1.0.0': dependencies: '@wallet-standard/base': 1.0.1 - dev: false - /@solana/wallet-standard-core@1.0.0: - resolution: {integrity: sha512-58wYbx2FpV1lE+rsIfme6FhzwQcBQAy4dcLqDJJ5HSI3OCBdeyv8PytDuYi3CSDo3u0UFynvHCYTsn1FeBx4tw==} - engines: {node: '>=16'} + '@solana/wallet-standard-core@1.0.0': dependencies: '@solana/wallet-standard-chains': 1.0.0 '@solana/wallet-standard-features': 1.0.1 '@solana/wallet-standard-util': 1.0.0 - dev: false - /@solana/wallet-standard-features@1.0.1: - resolution: {integrity: sha512-SUfx7KtBJ55XIj0qAhhVcC1I6MklAXqWFEz9hDHW+6YcJIyvfix/EilBhaBik1FJ2JT0zukpOfFv8zpuAbFRbw==} - engines: {node: '>=16'} + '@solana/wallet-standard-features@1.0.1': dependencies: '@wallet-standard/base': 1.0.1 '@wallet-standard/features': 1.0.3 - dev: false - /@solana/wallet-standard-util@1.0.0: - resolution: {integrity: sha512-qRAOBXnN7dwvtgzTtxIHsSeJAMbGNZdSWs57TT8pCyBrKL5dVxaK2u95Dm17SRSzwfKl/EByV1lTjOxXyKWS+g==} - engines: {node: '>=16'} + '@solana/wallet-standard-util@1.0.0': dependencies: - '@solana/wallet-standard-chains': 1.0.0 - '@solana/wallet-standard-features': 1.0.1 - dev: false - - /@solana/wallet-standard-wallet-adapter-base@1.0.2(@solana/web3.js@1.77.2)(bs58@4.0.1): - resolution: {integrity: sha512-QqkupdWvWuihX87W6ijt174u6ZdP5OSFlNhZhuhoMlIdyI/sj7MhGsdppuRlMh65oVO2WNWTL9y2bO5Pbx+dfg==} - engines: {node: '>=16'} - peerDependencies: - '@solana/web3.js': ^1.58.0 - bs58: ^4.0.1 + '@solana/wallet-standard-chains': 1.0.0 + '@solana/wallet-standard-features': 1.0.1 + + '@solana/wallet-standard-wallet-adapter-base@1.0.2(@solana/web3.js@1.77.2)(bs58@4.0.1)': dependencies: '@solana/wallet-adapter-base': 0.9.22(@solana/web3.js@1.77.2) '@solana/wallet-standard-chains': 1.0.0 @@ -6463,14 +13168,8 @@ packages: '@wallet-standard/features': 1.0.3 '@wallet-standard/wallet': 1.0.1 bs58: 4.0.1 - dev: false - /@solana/wallet-standard-wallet-adapter-react@1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0): - resolution: {integrity: sha512-0YTPUnjiSG5ajDP2hK8EipxkeHhO3+nCtXeF1eS/ZP2QcFAgS/4luywrn/6CdfzQ2cQYPCFdnG/QculpUp6bBg==} - engines: {node: '>=16'} - peerDependencies: - '@solana/wallet-adapter-base': '*' - react: '*' + '@solana/wallet-standard-wallet-adapter-react@1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0)': dependencies: '@solana/wallet-adapter-base': 0.9.22(@solana/web3.js@1.77.2) '@solana/wallet-standard-wallet-adapter-base': 1.0.2(@solana/web3.js@1.77.2)(bs58@4.0.1) @@ -6480,11 +13179,8 @@ packages: transitivePeerDependencies: - '@solana/web3.js' - bs58 - dev: false - /@solana/wallet-standard-wallet-adapter@1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0): - resolution: {integrity: sha512-xVMIr/+Be4ftmNXJ5QJWSinIeUPYShWFeR5i7c2TBRkc1WFK+pRgNUl0mPhBo5hZU/oyrwo+g8NTb8mS9a1Shw==} - engines: {node: '>=16'} + '@solana/wallet-standard-wallet-adapter@1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0)': dependencies: '@solana/wallet-standard-wallet-adapter-base': 1.0.2(@solana/web3.js@1.77.2)(bs58@4.0.1) '@solana/wallet-standard-wallet-adapter-react': 1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0) @@ -6493,11 +13189,8 @@ packages: - '@solana/web3.js' - bs58 - react - dev: false - /@solana/wallet-standard@1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0): - resolution: {integrity: sha512-bv3qJng+Uyy9okCdsrfrMVJjnmbhj4/EzOhCQVKX9VY0nW6gXXjV6uwu7GPdRwYNxBP+lgNejrDI8QPfE9W45g==} - engines: {node: '>=16'} + '@solana/wallet-standard@1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0)': dependencies: '@solana/wallet-standard-core': 1.0.0 '@solana/wallet-standard-wallet-adapter': 1.0.2(@solana/wallet-adapter-base@0.9.22)(@solana/web3.js@1.77.2)(bs58@4.0.1)(react@18.2.0) @@ -6506,11 +13199,8 @@ packages: - '@solana/web3.js' - bs58 - react - dev: false - /@solana/web3.js@1.77.2: - resolution: {integrity: sha512-pKu9S21NGAi6Nsayz2KEdhqOlPUJIr3L911bgQvPg2Dbk/U4gJsk41XGdxyfsfnwKPEI/KbitcByterst4VQ3g==} - deprecated: This build contains a bad TypeScript definition for getProgramAccounts + '@solana/web3.js@1.77.2': dependencies: '@babel/runtime': 7.22.3 '@noble/curves': 1.0.0 @@ -6532,40 +13222,20 @@ packages: - encoding - supports-color - utf-8-validate - dev: false - /@solidjs/meta@0.28.2(solid-js@1.7.2): - resolution: {integrity: sha512-avlLgBPdk4KVxzRGFlYp/MIJo8B5jVgXPgk6OUnUP8km21Z+ovO+DUd7ZPA7ejv8PBdWi9GE3zCzw8RU2YuV2Q==} - peerDependencies: - solid-js: '>=1.4.0' + '@solidjs/meta@0.28.2(solid-js@1.7.2)': dependencies: solid-js: 1.7.2 - /@solidjs/router@0.8.2(solid-js@1.7.2): - resolution: {integrity: sha512-gUKW+LZqxtX6y/Aw6JKyy4gQ9E7dLqp513oB9pSYJR1HM5c56Pf7eijzyXX+b3WuXig18Cxqah4tMtF0YGu80w==} - peerDependencies: - solid-js: ^1.5.3 + '@solidjs/router@0.8.2(solid-js@1.7.2)': dependencies: solid-js: 1.7.2 - /@stitches/react@1.2.8(react@18.2.0): - resolution: {integrity: sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==} - peerDependencies: - react: '>= 16.3.0' + '@stitches/react@1.2.8(react@18.2.0)': dependencies: react: 18.2.0 - dev: false - /@storybook/addon-actions@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3M5AU/ZD79YP88vKlFezIJbIoG/II7wCixUBTmwiC3BeQZDuVsqPNl8eiP6MGT70xwyx7a993lSM5f5N5W93vg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-actions@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/components': 7.0.18(react-dom@18.2.0)(react@18.2.0) @@ -6585,18 +13255,8 @@ packages: telejson: 7.1.0 ts-dedent: 2.2.0 uuid: 9.0.0 - dev: true - /@storybook/addon-backgrounds@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cPQy1Ot7Urf4hQz+xnF1YKrqSyR0DRwozBmF+sGzceACWmueFl0CifYZC8RSmaiIyVh0RyWPxZ9F/eT67NX2lA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-backgrounds@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/components': 7.0.18(react-dom@18.2.0)(react@18.2.0) @@ -6610,18 +13270,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 - dev: true - /@storybook/addon-controls@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-mD6DE52CCMKugXk2Uab0QxwgfE76kFJroxASmnePnXUNWfP9EZJpJXYE3cyyBbmZuxa46VHDGGEGXQWRl4+Eog==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-controls@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/blocks': 7.0.18(react-dom@18.2.0)(react@18.2.0) '@storybook/client-logger': 7.0.18 @@ -6638,13 +13288,8 @@ packages: ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/addon-docs@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-oq+ZN5809gIRdTZQIpeK1F8BJtL1/VWo9rWvl6ymVOL/Xzdgd7AOfKf9Y99X35RcxAGysRIHLGJjF4bgLoY1Aw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/addon-docs@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@babel/core': 7.22.1 '@babel/plugin-transform-react-jsx': 7.22.3(@babel/core@7.22.1) @@ -6671,13 +13316,8 @@ packages: ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/addon-essentials@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0XXu7xhtRefA1WxxorKk6BWeeB+7gQ+r2+bG1zQEfBgDYPR06YbPw4H79IZ8JiR97aJRsZBK5UUhOZMDrc5zcQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/addon-essentials@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/addon-actions': 7.0.18(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-backgrounds': 7.0.18(react-dom@18.2.0)(react@18.2.0) @@ -6697,26 +13337,14 @@ packages: ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/addon-highlight@7.0.18: - resolution: {integrity: sha512-a3nfUhbu6whoDclIZSV/fzLj132tNNjV05ENTpuN3JpLoMd3+obDUWzeQUs9TetK4RBRN3ewM7sIMEI4oBpgmg==} + '@storybook/addon-highlight@7.0.18': dependencies: '@storybook/core-events': 7.0.18 '@storybook/global': 5.0.0 '@storybook/preview-api': 7.0.18 - dev: true - /@storybook/addon-links@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xEwflt7bp9FRoZVeqPGb6d3s2Gh+/jaSmnyIxMxrBy2oovKIqu9ptolqz1AhjFOXfaLs9c2RAmJUuFZJtETLxA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-links@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/core-events': 7.0.18 @@ -6730,18 +13358,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 - dev: true - /@storybook/addon-measure@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-iu8vQpGOA+CFYbWR6QNshj20o33OQ/xcTbp5P4U6xGYDUliUBbwJ2KLxcKlmIeBanBrBdz0jPFtHwY4dM1ZdKw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-measure@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/components': 7.0.18(react-dom@18.2.0)(react@18.2.0) @@ -6752,18 +13370,8 @@ packages: '@storybook/types': 7.0.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/addon-outline@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3vNWO7ezo6GIvidbz8JxFrKtfVEoTQN7tnZx+wpqmCF8ihBORewkpeMUnvgb9ZKjD0X7gE8eQvvG8KKWcyHDBQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-outline@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/components': 7.0.18(react-dom@18.2.0)(react@18.2.0) @@ -6775,18 +13383,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 - dev: true - /@storybook/addon-toolbars@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-mwhq962o0WloHAeFjJ6BXO2nzdTo5KE2fqawPpqcB2lwXP6tvaA2tDWwgntjPCHejqWTS+ZTdO4/1xrMhWYt/g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-toolbars@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/components': 7.0.18(react-dom@18.2.0)(react@18.2.0) @@ -6795,18 +13393,8 @@ packages: '@storybook/theming': 7.0.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/addon-viewport@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-aVVLBsWXfGDX3z1pc93LWWdG5RUoJbGL/JJPMZGwXdwWpP8V3OBl8D8bgPymyg+MgwhSRZZDDGgnJaVGGwZ6bQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-viewport@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/components': 7.0.18(react-dom@18.2.0)(react@18.2.0) @@ -6819,13 +13407,8 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/blocks@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HLsuzmUdVIeFXEP5v5vyjnEePRNYjzltwTjCKQhHAlt8/aQZmREiIMOfoMoAa1Rd+On8Ib2DUd2cN10VS18H8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/blocks@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/channels': 7.0.18 '@storybook/client-logger': 7.0.18 @@ -6853,10 +13436,8 @@ packages: util-deprecate: 1.0.2 transitivePeerDependencies: - supports-color - dev: true - /@storybook/builder-manager@7.0.18: - resolution: {integrity: sha512-yFMm3xuYkyg2hS1uz3CkvyvLzK7qJsDPVEh7lew8GiJK1Xx8cc+FnAOlRTjWNxvhfiT296wAMCTPWv7LeoSgqQ==} + '@storybook/builder-manager@7.0.18': dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 '@storybook/core-common': 7.0.18 @@ -6876,22 +13457,8 @@ packages: util: 0.12.5 transitivePeerDependencies: - supports-color - dev: true - /@storybook/builder-vite@7.0.18(typescript@5.0.2)(vite@4.3.9): - resolution: {integrity: sha512-Qze6/PwUJq+z776dBoG5uinAEVZyPalZIaU/VOWpTrN8L9FQbL0+HDrZU2E/BMNW+ZfnSjF3V2USLyiutsC1Tw==} - peerDependencies: - '@preact/preset-vite': '*' - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 - vite-plugin-glimmerx: '*' - peerDependenciesMeta: - '@preact/preset-vite': - optional: true - typescript: - optional: true - vite-plugin-glimmerx: - optional: true + '@storybook/builder-vite@7.0.18(typescript@5.0.2)(vite@4.3.9)': dependencies: '@storybook/channel-postmessage': 7.0.18 '@storybook/channel-websocket': 7.0.18 @@ -6917,10 +13484,8 @@ packages: vite: 4.3.9(@types/node@20.9.0) transitivePeerDependencies: - supports-color - dev: true - /@storybook/channel-postmessage@7.0.18: - resolution: {integrity: sha512-rpwBH5ANdPnugS6+7xG9qHSoS+aPSEnBxDKsONWFubfMTTXQuFkf/793rBbxGkoINdqh8kSdKOM2rIty6e9cmQ==} + '@storybook/channel-postmessage@7.0.18': dependencies: '@storybook/channels': 7.0.18 '@storybook/client-logger': 7.0.18 @@ -6928,10 +13493,8 @@ packages: '@storybook/global': 5.0.0 qs: 6.11.2 telejson: 7.1.0 - dev: true - /@storybook/channel-postmessage@7.0.26: - resolution: {integrity: sha512-ZvFLr/tUD9dWIjQtIn1JXHjqrbOP/uEEOqzwpKSVj0Cl4Vgc12s8hecbzBufkOF7fwLsFvfieSi7ENOmjoncdQ==} + '@storybook/channel-postmessage@7.0.26': dependencies: '@storybook/channels': 7.0.26 '@storybook/client-logger': 7.0.26 @@ -6939,28 +13502,19 @@ packages: '@storybook/global': 5.0.0 qs: 6.11.2 telejson: 7.1.0 - dev: true - /@storybook/channel-websocket@7.0.18: - resolution: {integrity: sha512-QYsZIfe23NN4i+oIdPKHaYBehk3a/HYk57a+M2oR3Frmv8IOqc/e31uH+xx5NxnjHrTJj7Y80ZJw6EKB682S6w==} + '@storybook/channel-websocket@7.0.18': dependencies: '@storybook/channels': 7.0.18 '@storybook/client-logger': 7.0.18 '@storybook/global': 5.0.0 telejson: 7.1.0 - dev: true - /@storybook/channels@7.0.18: - resolution: {integrity: sha512-rkA7ea0M3+dWS+71iHJdiZ5R2QuIdiVg0CgyLJHDagc1qej7pEVNhMWtppeq+X5Pwp9nkz8ZTQ7aCjTf6th0/A==} - dev: true + '@storybook/channels@7.0.18': {} - /@storybook/channels@7.0.26: - resolution: {integrity: sha512-Br3XILhrtuL5Sdp91I04kKjJzSqU/N8gGL6B6nIfnuaHUvGMDuMCHAB+g7aoiyH5dnpDZ6yBVGNwtYAyJA+0Og==} - dev: true + '@storybook/channels@7.0.26': {} - /@storybook/cli@7.0.18: - resolution: {integrity: sha512-9n4J4thiCUsGSXiRc6ZysqYUaCMCrpu0/qgC+5ngfFRuMmZgUV0y5+0fmaOhT2XjsonTTgucizO82i7+ottCVg==} - hasBin: true + '@storybook/cli@7.0.18': dependencies: '@babel/core': 7.22.1 '@babel/preset-env': 7.22.4(@babel/core@7.22.1) @@ -7006,29 +13560,21 @@ packages: - encoding - supports-color - utf-8-validate - dev: true - /@storybook/client-api@7.0.26: - resolution: {integrity: sha512-55Oy5Es8ACABWT01iddUJHt8oT4VnuCvec/FUC4iN7ITiOGjk7YzZB3NftmD6C5+pVQC99buspuwg7IFxmj+Aw==} + '@storybook/client-api@7.0.26': dependencies: '@storybook/client-logger': 7.0.26 '@storybook/preview-api': 7.0.26 - dev: true - /@storybook/client-logger@7.0.18: - resolution: {integrity: sha512-uKgFdVedYoRDZBVrE1IBdWNHDFln1IxWEeI+7ZiNSQwREG9swHpU5Fa8DceclM/oLjJRuzG1jFzv+XZY8894+Q==} + '@storybook/client-logger@7.0.18': dependencies: '@storybook/global': 5.0.0 - dev: true - /@storybook/client-logger@7.0.26: - resolution: {integrity: sha512-OMVLbgceoeuM8sWOfTX/9a4zCrH78G32hg7x8yXLZnRJ9OLaHJHzUM0Onc4MLudqVUdaKH0c8ejpBXUyIr1rJQ==} + '@storybook/client-logger@7.0.26': dependencies: '@storybook/global': 5.0.0 - dev: true - /@storybook/codemod@7.0.18: - resolution: {integrity: sha512-+9XFns29e8FpPLsqA8ZCQ3mNnIIKD3QnqGYkbkCVKi/G1fomvVQsIfsnkrYv5SobTbz29B4aNWxAaeSnO7/OGg==} + '@storybook/codemod@7.0.18': dependencies: '@babel/core': 7.21.8 '@babel/preset-env': 7.21.5(@babel/core@7.21.8) @@ -7045,13 +13591,8 @@ packages: recast: 0.23.2 transitivePeerDependencies: - supports-color - dev: true - /@storybook/components@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Jn1CbF9UAKt8BVaZtuhmthpcZ02VMaCFXR0ISfDXCpiMKnylmpP0+WfXcoKLzz6yS+EW8EW5S9+Qq8xgQY8H7A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/components@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/csf': 0.1.1 @@ -7063,17 +13604,13 @@ packages: react-dom: 18.2.0(react@18.2.0) use-resize-observer: 9.1.0(react-dom@18.2.0)(react@18.2.0) util-deprecate: 1.0.2 - dev: true - /@storybook/core-client@7.0.18: - resolution: {integrity: sha512-ueExRZx6fd9LRssgdhDJ0bL4Ir2RrbXzJz/kjIT2KgYY3l7jkhe0dpT3bOgGKjQt0f7XMFU24t/r7aDLGMB+2Q==} + '@storybook/core-client@7.0.18': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/preview-api': 7.0.18 - dev: true - /@storybook/core-common@7.0.18: - resolution: {integrity: sha512-HZAB1NIK/Yv0x9poyzqYcue2tx39+MAF1mbHgGy+JJZRerO2fRShgo8f8VPH9ChbFCoJ7isL5wNhgGdg9kp2kA==} + '@storybook/core-common@7.0.18': dependencies: '@storybook/node-logger': 7.0.18 '@storybook/types': 7.0.18 @@ -7096,18 +13633,12 @@ packages: ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/core-events@7.0.18: - resolution: {integrity: sha512-7gxHBQDezdKOeq/u1LL80Bwjfcwsv7XOS3yWQElcgqp+gLaYB6OwwgtkCB2yV6a6l4nep9IdPWE8G3TxIzn9xw==} - dev: true + '@storybook/core-events@7.0.18': {} - /@storybook/core-events@7.0.26: - resolution: {integrity: sha512-ckZszphEAYs9wp8tPVhayEMzk8JxCiQfzbq0S45sbdqdTrl40PmsOjv5iPNaUYElI/Stfz+v4gDCEUfOsxyC+w==} - dev: true + '@storybook/core-events@7.0.26': {} - /@storybook/core-server@7.0.18: - resolution: {integrity: sha512-zGSGYSoCaSXM28OYKW7zsmpo8VU1icubXLRgdF21fbMhFN1WVS+bPA5+gSkAMf8acq5RNM8uSKskh7E2YDVEqA==} + '@storybook/core-server@7.0.18': dependencies: '@aw-web-design/x-default-browser': 1.4.88 '@discoveryjs/json-ext': 0.5.7 @@ -7156,19 +13687,15 @@ packages: - encoding - supports-color - utf-8-validate - dev: true - /@storybook/csf-plugin@7.0.18: - resolution: {integrity: sha512-Cr/Qr4/H4JIYgbbmDjQIYuqjp6nOaZga73R3KZcuClk27B90sI2ADegMYvORgbFgSkwweNQjgak6hLoOyogAhw==} + '@storybook/csf-plugin@7.0.18': dependencies: '@storybook/csf-tools': 7.0.18 unplugin: 0.10.2 transitivePeerDependencies: - supports-color - dev: true - /@storybook/csf-tools@7.0.18: - resolution: {integrity: sha512-0IJ2qdrxleTl67FUzsEvGcy96CY0OKyERE33tAsLNbvWcabdJKpLHP+rJwbsCw4z6IlS+kkmEffeFf5qRPTwkQ==} + '@storybook/csf-tools@7.0.18': dependencies: '@babel/generator': 7.21.9 '@babel/parser': 7.21.9 @@ -7181,20 +13708,14 @@ packages: ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/csf@0.1.1: - resolution: {integrity: sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg==} + '@storybook/csf@0.1.1': dependencies: type-fest: 2.19.0 - dev: true - /@storybook/docs-mdx@0.1.0: - resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} - dev: true + '@storybook/docs-mdx@0.1.0': {} - /@storybook/docs-tools@7.0.18: - resolution: {integrity: sha512-H95dW2DquGQ75ZVrFjvznPdCxT0eW6esDnemzLJB61KitcYZrWRavfrZzFtUcpzIa84OgY5pllFYt636v11LHQ==} + '@storybook/docs-tools@7.0.18': dependencies: '@babel/core': 7.22.1 '@storybook/core-common': 7.0.18 @@ -7205,17 +13726,10 @@ packages: lodash: 4.17.21 transitivePeerDependencies: - supports-color - dev: true - /@storybook/global@5.0.0: - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - dev: true + '@storybook/global@5.0.0': {} - /@storybook/manager-api@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-anQkm09twL96YkKGXHa+LI0+yMaY6Jxs1lRaetHdMlIqN4VHBHhizHaMgtGfH6xCTuO3WdrKTN7cZii5RH7PBQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/manager-api@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/channels': 7.0.18 '@storybook/client-logger': 7.0.18 @@ -7234,31 +13748,21 @@ packages: store2: 2.14.2 telejson: 7.1.0 ts-dedent: 2.2.0 - dev: true - /@storybook/manager@7.0.18: - resolution: {integrity: sha512-hasb8XDmkT9lyX2cwb3Xg0ngcNQ1QCNHKurl2YJtXowb1CvawGKokhnVUTso15NCnurolDyw/Wqka1sagfm+Mg==} - dev: true + '@storybook/manager@7.0.18': {} - /@storybook/mdx2-csf@1.1.0: - resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} - dev: true + '@storybook/mdx2-csf@1.1.0': {} - /@storybook/node-logger@7.0.18: - resolution: {integrity: sha512-cIeKEBvELtoVP/5UeQ01GJWZ7wM69/9Q+R5uOtNQBlwWFcCD6AVFWMRqq7ObMvdJG/okhXSF+sDetb+BF3zvdw==} + '@storybook/node-logger@7.0.18': dependencies: '@types/npmlog': 4.1.4 chalk: 4.1.2 npmlog: 5.0.1 pretty-hrtime: 1.0.3 - dev: true - /@storybook/postinstall@7.0.18: - resolution: {integrity: sha512-ObIwAK2UiYhXN/7UifISQgBoH5jnyxh6T8kvCw83YhC78SDOPNgIGjToJECizJ7iubtqAWtCfCT5TrGEpyLGbg==} - dev: true + '@storybook/postinstall@7.0.18': {} - /@storybook/preview-api@7.0.18: - resolution: {integrity: sha512-xxtC0gPGMn/DbwvS4ZuJaBwfFNsjUCf0yLYHFrNe6fxncbvcLZ550RuyUwYuIRfsiKrlgfa3QmmCa4JM/JesHQ==} + '@storybook/preview-api@7.0.18': dependencies: '@storybook/channel-postmessage': 7.0.18 '@storybook/channels': 7.0.18 @@ -7275,10 +13779,8 @@ packages: synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - dev: true - /@storybook/preview-api@7.0.26: - resolution: {integrity: sha512-uJwA4errBOZOoDF2T7Z2oLqjAYvvjMr31sTsOoT0niJtWr29RQp8yS6VoSrsuh+y3FAVqBEl5pS+DX3IGLjvxw==} + '@storybook/preview-api@7.0.26': dependencies: '@storybook/channel-postmessage': 7.0.26 '@storybook/channels': 7.0.26 @@ -7295,37 +13797,23 @@ packages: synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - dev: true - /@storybook/preview@7.0.18: - resolution: {integrity: sha512-L53p2eo8G12U6tp7hD3mk5tdWFXLvdEyV9e7a1x9bw1LfH15K/bp8lO6U/W1kkpse7+rqWBqoTjJC1Ktm5Sxog==} - dev: true + '@storybook/preview@7.0.18': {} - /@storybook/react-dom-shim@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-O1FRypR8q1katjbznnxI+NtALd2gaWa7KnTwbIDf+ddZltXHMZ8xMiEGEtAMrfXlIuqIr9UvmLRfKZC/ysuA+g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/react-dom-shim@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/router@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Mue4s/BnKgdYcsiW9yuvW3qL9k3AgYn5HIhnkBExAteyiUGdAca4IJFhArmGgFktgeLc4ecBQ7sgaCljApnbgg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/router@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 memoizerific: 1.11.3 qs: 6.11.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/telemetry@7.0.18: - resolution: {integrity: sha512-JP5Z7lGU+oKjNmz2cZW5J7EerwyWBBPOU+NvvooZsymIx02ZvJ4ClmFtolJnBM7m4KoAy50JxV5NQWi+q8PicQ==} + '@storybook/telemetry@7.0.18': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/core-common': 7.0.18 @@ -7339,13 +13827,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/theming@7.0.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-P1gMKa/mKQHIMq0sxBIwTzAcF6v/6hrc62YmkuV62vXu+8zNV2YWbRwywqm3Q6faZEadmb/bL9+z8whaKhCL/g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/theming@7.0.18(react-dom@18.2.0)(react@18.2.0)': dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@storybook/client-logger': 7.0.18 @@ -7353,32 +13836,22 @@ packages: memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/types@7.0.18: - resolution: {integrity: sha512-qPop2CbvmX42/BX29YT9jIzW2TlMcMjAE+KCpcKLBiD1oT5DJ1fhMzpe6RW9HkMegkBxjWx54iamN4oHM/pwcQ==} + '@storybook/types@7.0.18': dependencies: '@storybook/channels': 7.0.18 '@types/babel__core': 7.20.1 '@types/express': 4.17.17 file-system-cache: 2.3.0 - dev: true - /@storybook/types@7.0.26: - resolution: {integrity: sha512-5RBi6agtDglNXdffmw4+Fyv2dUdlIdeOdUj0O5+JRYajTxfHdurZd9r/42z4OstN+ORDkLA/svt8Q9JyRpIb6Q==} + '@storybook/types@7.0.26': dependencies: '@storybook/channels': 7.0.26 '@types/babel__core': 7.20.1 '@types/express': 4.17.17 file-system-cache: 2.3.0 - dev: true - /@storybook/web-components-vite@7.0.18(lit@2.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.2)(vite@4.3.9): - resolution: {integrity: sha512-OQbaSnwNHikC9nfz3dSZIvD1RhrDT5AIst+ZYxGbYLkgxlmZv/SBmEt+XH4nX1XLhR9gFu6Qd3b+r/4xT2b/WA==} - engines: {node: ^14.18 || >=16} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/web-components-vite@7.0.18(lit@2.7.2)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.2)(vite@4.3.9)': dependencies: '@storybook/builder-vite': 7.0.18(typescript@5.0.2)(vite@4.3.9) '@storybook/core-server': 7.0.18 @@ -7397,13 +13870,8 @@ packages: - utf-8-validate - vite - vite-plugin-glimmerx - dev: true - /@storybook/web-components@7.0.18(lit@2.7.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nDs9AuRd9vvAXg2E7M/pN1ChQcUHKkmqqvswT8KUlr0o0qoZnAtUloeFVH+4X06s/OZco7ROkHn1CQp1vbH5Sw==} - engines: {node: '>=16.0.0'} - peerDependencies: - lit: ^2.0.0 + '@storybook/web-components@7.0.18(lit@2.7.2)(react-dom@18.2.0)(react@18.2.0)': dependencies: '@storybook/client-logger': 7.0.18 '@storybook/core-client': 7.0.18 @@ -7418,17 +13886,11 @@ packages: - react - react-dom - supports-color - dev: true - /@substrate/connect-extension-protocol@1.0.1: - resolution: {integrity: sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==} - requiresBuild: true - dev: false + '@substrate/connect-extension-protocol@1.0.1': optional: true - /@substrate/connect@0.7.26: - resolution: {integrity: sha512-uuGSiroGuKWj1+38n1kY5HReer5iL9bRwPCzuoLtqAOmI1fGI0hsSI2LlNQMAbfRgr7VRHXOk5MTuQf5ulsFRw==} - requiresBuild: true + '@substrate/connect@0.7.26': dependencies: '@substrate/connect-extension-protocol': 1.0.1 eventemitter3: 4.0.7 @@ -7436,105 +13898,54 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false optional: true - /@substrate/connect@0.7.33: - resolution: {integrity: sha512-1B984/bmXVQvTT9oV3c3b7215lvWmulP9rfP3T3Ri+OU3uIsyCzYw0A+XG6J8/jgO2FnroeNIBWlgoLaUM1uzw==} - requiresBuild: true + '@substrate/connect@0.7.33': dependencies: '@substrate/connect-extension-protocol': 1.0.1 smoldot: 2.0.1 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false optional: true - /@substrate/ss58-registry@1.43.0: - resolution: {integrity: sha512-USEkXA46P9sqClL7PZv0QFsit4S8Im97wchKG0/H/9q3AT/S76r40UHfCr4Un7eBJPE23f7fU9BZ0ITpP9MCsA==} + '@substrate/ss58-registry@1.43.0': {} - /@suchipi/femver@1.0.0: - resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} - dev: false + '@suchipi/femver@1.0.0': {} - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.22.1): - resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} - engines: {node: '>=10'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.22.1): - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.22.1): - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.22.1): - resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} - engines: {node: '>=10'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.22.1): - resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} - engines: {node: '>=10'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.22.1): - resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} - engines: {node: '>=10'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.22.1): - resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} - engines: {node: '>=10'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.22.1): - resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} - engines: {node: '>=12'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 - dev: false - /@svgr/babel-preset@6.5.1(@babel/core@7.22.1): - resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} - engines: {node: '>=10'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@svgr/babel-preset@6.5.1(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.22.1) @@ -7545,11 +13956,8 @@ packages: '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.22.1) '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.22.1) '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.22.1) - dev: false - /@svgr/core@6.5.1: - resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} - engines: {node: '>=10'} + '@svgr/core@6.5.1': dependencies: '@babel/core': 7.22.1 '@svgr/babel-preset': 6.5.1(@babel/core@7.22.1) @@ -7558,21 +13966,13 @@ packages: cosmiconfig: 7.1.0 transitivePeerDependencies: - supports-color - dev: false - /@svgr/hast-util-to-babel-ast@6.5.1: - resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} - engines: {node: '>=10'} + '@svgr/hast-util-to-babel-ast@6.5.1': dependencies: '@babel/types': 7.22.5 entities: 4.5.0 - dev: false - /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): - resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} - engines: {node: '>=10'} - peerDependencies: - '@svgr/core': ^6.0.0 + '@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1)': dependencies: '@babel/core': 7.22.1 '@svgr/babel-preset': 6.5.1(@babel/core@7.22.1) @@ -7581,23 +13981,15 @@ packages: svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - dev: false - /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1): - resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} - engines: {node: '>=10'} - peerDependencies: - '@svgr/core': '*' + '@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1)': dependencies: '@svgr/core': 6.5.1 cosmiconfig: 7.1.0 deepmerge: 4.3.1 svgo: 2.8.0 - dev: false - /@svgr/webpack@6.5.1: - resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} - engines: {node: '>=10'} + '@svgr/webpack@6.5.1': dependencies: '@babel/core': 7.22.1 '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.22.1) @@ -7609,38 +14001,24 @@ packages: '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) transitivePeerDependencies: - supports-color - dev: false - /@swc/helpers@0.5.1: - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + '@swc/helpers@0.5.1': dependencies: tslib: 2.6.2 - dev: false - /@szmarczak/http-timer@1.1.2: - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} + '@szmarczak/http-timer@1.1.2': dependencies: defer-to-connect: 1.1.3 - dev: false - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - dev: false - /@trysound/sax@0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + '@trysound/sax@0.2.0': {} - /@tsconfig/docusaurus@1.0.5: - resolution: {integrity: sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg==} - dev: true + '@tsconfig/docusaurus@1.0.5': {} - /@types/babel__core@7.20.1: - resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + '@types/babel__core@7.20.1': dependencies: '@babel/parser': 7.22.4 '@babel/types': 7.22.5 @@ -7648,440 +14026,301 @@ packages: '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.20.1 - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + '@types/babel__generator@7.6.4': dependencies: '@babel/types': 7.22.5 - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + '@types/babel__template@7.4.1': dependencies: '@babel/parser': 7.22.4 '@babel/types': 7.22.5 - /@types/babel__traverse@7.20.1: - resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + '@types/babel__traverse@7.20.1': dependencies: '@babel/types': 7.22.5 - /@types/bn.js@5.1.1: - resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} + '@types/bn.js@5.1.1': dependencies: '@types/node': 20.9.0 - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + '@types/body-parser@1.19.2': dependencies: '@types/connect': 3.4.35 '@types/node': 20.9.0 - /@types/bonjour@3.5.10: - resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} + '@types/bonjour@3.5.10': dependencies: '@types/node': 20.9.0 - dev: false - /@types/bs58@4.0.1: - resolution: {integrity: sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA==} + '@types/bs58@4.0.1': dependencies: base-x: 3.0.9 - dev: true - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 '@types/node': 20.9.0 '@types/responselike': 1.0.0 - dev: false - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + '@types/chai-subset@1.3.3': dependencies: '@types/chai': 4.3.5 - /@types/chai@4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + '@types/chai@4.3.5': {} - /@types/clean-css@4.2.6: - resolution: {integrity: sha512-Ze1tf+LnGPmG6hBFMi0B4TEB0mhF7EiMM5oyjLDNPE9hxrPU0W+5+bHvO+eFPA+bt0iC1zkQMoU/iGdRVjcRbw==} + '@types/clean-css@4.2.6': dependencies: '@types/node': 20.9.0 source-map: 0.6.1 - dev: true - /@types/connect-history-api-fallback@1.5.0: - resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} + '@types/connect-history-api-fallback@1.5.0': dependencies: '@types/express-serve-static-core': 4.17.35 '@types/node': 20.9.0 - dev: false - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@types/connect@3.4.35': dependencies: '@types/node': 20.9.0 - /@types/cookie@0.5.1: - resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} + '@types/cookie@0.5.1': {} - /@types/cssnano@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-ikR+18UpFGgvaWSur4og6SJYF/6QEYHXvrIt36dp81p1MG3cAPTYDMBJGeyWa3LCnqEbgNMHKRb+FP0NrXtoWQ==} - deprecated: This is a stub types definition. cssnano provides its own type definitions, so you do not need this installed. + '@types/cssnano@5.1.0(postcss@8.4.24)': dependencies: cssnano: 5.1.15(postcss@8.4.24) transitivePeerDependencies: - postcss - dev: true - /@types/detect-port@1.3.3: - resolution: {integrity: sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==} - dev: true + '@types/detect-port@1.3.3': {} - /@types/doctrine@0.0.3: - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - dev: true + '@types/doctrine@0.0.3': {} - /@types/ejs@3.1.2: - resolution: {integrity: sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==} - dev: true + '@types/ejs@3.1.2': {} - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + '@types/eslint-scope@3.7.4': dependencies: '@types/eslint': 8.40.2 '@types/estree': 1.0.1 - /@types/eslint@8.40.2: - resolution: {integrity: sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==} + '@types/eslint@8.40.2': dependencies: '@types/estree': 1.0.1 '@types/json-schema': 7.0.11 - /@types/estree@0.0.39: - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@types/estree@0.0.39': {} - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + '@types/estree@1.0.1': {} - /@types/express-serve-static-core@4.17.35: - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + '@types/express-serve-static-core@4.17.35': dependencies: '@types/node': 20.9.0 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + '@types/express@4.17.17': dependencies: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 '@types/serve-static': 1.15.1 - /@types/find-cache-dir@3.2.1: - resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - dev: true + '@types/find-cache-dir@3.2.1': {} - /@types/glob@8.1.0: - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 '@types/node': 20.9.0 - dev: true - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + '@types/graceful-fs@4.1.6': dependencies: '@types/node': 20.9.0 - dev: true - /@types/hast@2.3.4: - resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + '@types/hast@2.3.4': dependencies: '@types/unist': 2.0.6 - dev: false - /@types/history@4.7.11: - resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + '@types/history@4.7.11': {} - /@types/html-minifier-terser@6.1.0: - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - dev: false + '@types/html-minifier-terser@6.1.0': {} - /@types/html-minifier@3.5.3: - resolution: {integrity: sha512-j1P/4PcWVVCPEy5lofcHnQ6BtXz9tHGiFPWzqm7TtGuWZEfCHEP446HlkSNc9fQgNJaJZ6ewPtp2aaFla/Uerg==} + '@types/html-minifier@3.5.3': dependencies: '@types/clean-css': 4.2.6 '@types/relateurl': 0.2.29 '@types/uglify-js': 3.17.1 - dev: true - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: false + '@types/http-cache-semantics@4.0.4': {} - /@types/http-proxy@1.17.11: - resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} + '@types/http-proxy@1.17.11': dependencies: '@types/node': 20.9.0 - dev: false - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + '@types/istanbul-lib-coverage@2.0.4': {} - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + '@types/istanbul-lib-report@3.0.0': dependencies: '@types/istanbul-lib-coverage': 2.0.4 - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + '@types/istanbul-reports@3.0.1': dependencies: '@types/istanbul-lib-report': 3.0.0 - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + '@types/json-schema@7.0.11': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: false + '@types/json5@0.0.29': {} - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/keyv@3.1.4': dependencies: '@types/node': 20.9.0 - dev: false - /@types/lodash@4.14.195: - resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} - dev: true + '@types/lodash@4.14.195': {} - /@types/mdast@3.0.11: - resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} + '@types/mdast@3.0.11': dependencies: '@types/unist': 2.0.6 - dev: false - /@types/mdx@2.0.5: - resolution: {integrity: sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==} - dev: true + '@types/mdx@2.0.5': {} - /@types/mime-types@2.1.1: - resolution: {integrity: sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==} - dev: true + '@types/mime-types@2.1.1': {} - /@types/mime@1.3.2: - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + '@types/mime@1.3.2': {} - /@types/mime@3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + '@types/mime@3.0.1': {} - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true + '@types/minimatch@5.1.2': {} - /@types/node-fetch@2.6.4: - resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + '@types/node-fetch@2.6.4': dependencies: '@types/node': 20.9.0 form-data: 3.0.1 - dev: true - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false + '@types/node@12.20.55': {} - /@types/node@16.18.34: - resolution: {integrity: sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==} - dev: true + '@types/node@16.18.34': {} - /@types/node@17.0.45: - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - dev: false + '@types/node@17.0.45': {} - /@types/node@18.11.18: - resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + '@types/node@18.11.18': {} - /@types/node@20.4.2: - resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} - dev: false + '@types/node@20.4.2': {} - /@types/node@20.9.0: - resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} + '@types/node@20.9.0': dependencies: undici-types: 5.26.5 - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true + '@types/normalize-package-data@2.4.1': {} - /@types/npmlog@4.1.4: - resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} - dev: true + '@types/npmlog@4.1.4': {} - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + '@types/parse-json@4.0.0': {} - /@types/parse5@5.0.3: - resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} - dev: false + '@types/parse5@5.0.3': {} - /@types/pretty-hrtime@1.0.1: - resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} - dev: true + '@types/pretty-hrtime@1.0.1': {} - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + '@types/prop-types@15.7.5': {} - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + '@types/qs@6.9.7': {} - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@types/range-parser@1.2.4': {} - /@types/react-dom@18.2.7: - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + '@types/react-dom@18.2.7': dependencies: '@types/react': 18.2.15 - dev: false - /@types/react-router-config@5.0.7: - resolution: {integrity: sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w==} + '@types/react-router-config@5.0.7': dependencies: '@types/history': 4.7.11 '@types/react': 18.2.15 '@types/react-router': 5.1.20 - /@types/react-router-dom@5.3.3: - resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 '@types/react': 18.2.15 '@types/react-router': 5.1.20 - /@types/react-router@5.1.20: - resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 '@types/react': 18.2.15 - /@types/react@18.2.15: - resolution: {integrity: sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==} + '@types/react@18.2.15': dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 csstype: 3.1.2 - /@types/react@18.2.8: - resolution: {integrity: sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==} + '@types/react@18.2.8': dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 csstype: 3.1.2 - /@types/relateurl@0.2.29: - resolution: {integrity: sha512-QSvevZ+IRww2ldtfv1QskYsqVVVwCKQf1XbwtcyyoRvLIQzfyPhj/C+3+PKzSDRdiyejaiLgnq//XTkleorpLg==} - dev: true + '@types/relateurl@0.2.29': {} - /@types/resolve@1.17.1: - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + '@types/resolve@1.17.1': dependencies: '@types/node': 20.9.0 - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/resolve@1.20.2': {} - /@types/responselike@1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + '@types/responselike@1.0.0': dependencies: '@types/node': 20.9.0 - dev: false - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: false + '@types/retry@0.12.0': {} - /@types/sax@1.2.4: - resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + '@types/sax@1.2.4': dependencies: '@types/node': 20.9.0 - dev: false - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + '@types/scheduler@0.16.3': {} - /@types/semver@7.3.13: - resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + '@types/semver@7.3.13': {} - /@types/send@0.17.1: - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + '@types/send@0.17.1': dependencies: '@types/mime': 1.3.2 '@types/node': 20.9.0 - /@types/serve-index@1.9.1: - resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} + '@types/serve-index@1.9.1': dependencies: '@types/express': 4.17.17 - dev: false - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + '@types/serve-static@1.15.1': dependencies: '@types/mime': 3.0.1 '@types/node': 20.9.0 - /@types/sockjs@0.3.33: - resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + '@types/sockjs@0.3.33': dependencies: '@types/node': 20.9.0 - dev: false - /@types/trusted-types@2.0.3: - resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + '@types/trusted-types@2.0.3': {} - /@types/uglify-js@3.17.1: - resolution: {integrity: sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==} + '@types/uglify-js@3.17.1': dependencies: source-map: 0.6.1 - dev: true - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + '@types/unist@2.0.6': {} - /@types/ws@7.4.7: - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@7.4.7': dependencies: '@types/node': 20.9.0 - dev: false - /@types/ws@8.5.5: - resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} + '@types/ws@8.5.5': dependencies: '@types/node': 20.9.0 - dev: false - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + '@types/yargs-parser@21.0.0': {} - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + '@types/yargs@17.0.24': dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.4): - resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.4)': dependencies: '@typescript-eslint/parser': 5.44.0(eslint@7.32.0)(typescript@4.9.4) '@typescript-eslint/scope-manager': 5.44.0 @@ -8097,17 +14336,8 @@ packages: typescript: 4.9.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/parser@5.44.0(eslint@7.32.0)(typescript@4.9.4): - resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@5.44.0(eslint@7.32.0)(typescript@4.9.4)': dependencies: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 @@ -8117,17 +14347,8 @@ packages: typescript: 4.9.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/parser@5.44.0(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@5.44.0(eslint@8.45.0)(typescript@5.1.6)': dependencies: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 @@ -8137,25 +14358,13 @@ packages: typescript: 5.1.6 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/scope-manager@5.44.0: - resolution: {integrity: sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@5.44.0': dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 - dev: false - /@typescript-eslint/type-utils@5.44.0(eslint@7.32.0)(typescript@4.9.4): - resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@5.44.0(eslint@7.32.0)(typescript@4.9.4)': dependencies: '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.4) '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.4) @@ -8165,21 +14374,10 @@ packages: typescript: 4.9.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/types@5.44.0: - resolution: {integrity: sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + '@typescript-eslint/types@5.44.0': {} - /@typescript-eslint/typescript-estree@5.44.0(typescript@4.9.4): - resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@5.44.0(typescript@4.9.4)': dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 @@ -8191,16 +14389,8 @@ packages: typescript: 4.9.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/typescript-estree@5.44.0(typescript@5.1.6): - resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@5.44.0(typescript@5.1.6)': dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 @@ -8212,13 +14402,8 @@ packages: typescript: 5.1.6 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/utils@5.44.0(eslint@7.32.0)(typescript@4.9.4): - resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@5.44.0(eslint@7.32.0)(typescript@4.9.4)': dependencies: '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 @@ -8232,20 +14417,13 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: false - /@typescript-eslint/visitor-keys@5.44.0: - resolution: {integrity: sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@5.44.0': dependencies: '@typescript-eslint/types': 5.44.0 eslint-visitor-keys: 3.4.1 - dev: false - /@vercel/nft@0.22.6: - resolution: {integrity: sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==} - engines: {node: '>=14'} - hasBin: true + '@vercel/nft@0.22.6': dependencies: '@mapbox/node-pre-gyp': 1.0.10 '@rollup/pluginutils': 4.2.1 @@ -8262,37 +14440,30 @@ packages: - encoding - supports-color - /@vitest/expect@0.31.1: - resolution: {integrity: sha512-BV1LyNvhnX+eNYzJxlHIGPWZpwJFZaCcOIzp2CNG0P+bbetenTupk6EO0LANm4QFt0TTit+yqx7Rxd1qxi/SQA==} + '@vitest/expect@0.31.1': dependencies: '@vitest/spy': 0.31.1 '@vitest/utils': 0.31.1 chai: 4.3.7 - /@vitest/runner@0.31.1: - resolution: {integrity: sha512-imWuc82ngOtxdCUpXwtEzZIuc1KMr+VlQ3Ondph45VhWoQWit5yvG/fFcldbnCi8DUuFi+NmNx5ehMUw/cGLUw==} + '@vitest/runner@0.31.1': dependencies: '@vitest/utils': 0.31.1 concordance: 5.0.4 p-limit: 4.0.0 pathe: 1.1.0 - /@vitest/snapshot@0.31.1: - resolution: {integrity: sha512-L3w5uU9bMe6asrNzJ8WZzN+jUTX4KSgCinEJPXyny0o90fG4FPQMV0OWsq7vrCWfQlAilMjDnOF9nP8lidsJ+g==} + '@vitest/snapshot@0.31.1': dependencies: magic-string: 0.30.0 pathe: 1.1.0 pretty-format: 27.5.1 - /@vitest/spy@0.31.1: - resolution: {integrity: sha512-1cTpt2m9mdo3hRLDyCG2hDQvRrePTDgEJBFQQNz1ydHHZy03EiA6EpFxY+7ODaY7vMRCie+WlFZBZ0/dQWyssQ==} + '@vitest/spy@0.31.1': dependencies: tinyspy: 2.1.0 - /@vitest/ui@0.31.1(vitest@0.31.1): - resolution: {integrity: sha512-+JJ2+rvRPAVxFLNE+WJOMzOjxqYPn7V2hl00uNwid6kquD+UHTa716Z7szfNeZMLnHOHv+fxq1UgLCymvVpE5w==} - peerDependencies: - vitest: '>=0.30.1 <1' + '@vitest/ui@0.31.1(vitest@0.31.1)': dependencies: '@vitest/utils': 0.31.1 fast-glob: 3.3.0 @@ -8303,97 +14474,70 @@ packages: sirv: 2.0.3 vitest: 0.31.1(@vitest/ui@0.31.1) - /@vitest/utils@0.31.1: - resolution: {integrity: sha512-yFyRD5ilwojsZfo3E0BnH72pSVSuLg2356cN1tCEe/0RtDzxTPYwOomIC+eQbot7m6DRy4tPZw+09mB7NkbMmA==} + '@vitest/utils@0.31.1': dependencies: concordance: 5.0.4 loupe: 2.3.6 pretty-format: 27.5.1 - /@wallet-standard/app@1.0.1: - resolution: {integrity: sha512-LnLYq2Vy2guTZ8GQKKSXQK3+FRGPil75XEdkZqE6fiLixJhZJoJa5hT7lXxwe0ykVTt9LEThdTbOpT7KadS26Q==} - engines: {node: '>=16'} + '@wallet-standard/app@1.0.1': dependencies: '@wallet-standard/base': 1.0.1 - dev: false - /@wallet-standard/base@1.0.1: - resolution: {integrity: sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==} - engines: {node: '>=16'} - dev: false + '@wallet-standard/base@1.0.1': {} - /@wallet-standard/core@1.0.3: - resolution: {integrity: sha512-Jb33IIjC1wM1HoKkYD7xQ6d6PZ8EmMZvyc8R7dFgX66n/xkvksVTW04g9yLvQXrLFbcIjHrCxW6TXMhvpsAAzg==} - engines: {node: '>=16'} + '@wallet-standard/core@1.0.3': dependencies: '@wallet-standard/app': 1.0.1 '@wallet-standard/base': 1.0.1 '@wallet-standard/features': 1.0.3 '@wallet-standard/wallet': 1.0.1 - dev: false - /@wallet-standard/features@1.0.3: - resolution: {integrity: sha512-m8475I6W5LTatTZuUz5JJNK42wFRgkJTB0I9tkruMwfqBF2UN2eomkYNVf9RbrsROelCRzSFmugqjKZBFaubsA==} - engines: {node: '>=16'} + '@wallet-standard/features@1.0.3': dependencies: '@wallet-standard/base': 1.0.1 - dev: false - /@wallet-standard/wallet@1.0.1: - resolution: {integrity: sha512-qkhJeuQU2afQTZ02yMZE5SFc91Fo3hyFjFkpQglHudENNyiSG0oUKcIjky8X32xVSaumgTZSQUAzpXnCTWHzKQ==} - engines: {node: '>=16'} + '@wallet-standard/wallet@1.0.1': dependencies: '@wallet-standard/base': 1.0.1 - dev: false - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@webassemblyjs/ast@1.11.6': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + '@webassemblyjs/helper-buffer@1.11.6': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + '@webassemblyjs/helper-wasm-section@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + '@webassemblyjs/wasm-edit@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 @@ -8404,8 +14548,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + '@webassemblyjs/wasm-gen@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -8413,16 +14556,14 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + '@webassemblyjs/wasm-opt@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + '@webassemblyjs/wasm-parser@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 @@ -8431,176 +14572,108 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + '@webassemblyjs/wast-printer@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@xtuc/long@4.2.2': {} - /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.17.19): - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: '>=0.10.0' + '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.17.19)': dependencies: esbuild: 0.17.19 tslib: 2.6.2 - dev: true - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: false - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abbrev@1.1.1: {} - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-assertions@1.9.0(acorn@8.10.0): dependencies: acorn: 8.10.0 - /acorn-jsx@5.3.2(acorn@7.4.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.10.0): dependencies: acorn: 8.10.0 - dev: false - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + acorn-walk@8.2.0: {} - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@7.4.1: {} - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.10.0: {} - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.8.2: {} - /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} + address@1.2.2: {} - /agent-base@5.1.1: - resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} - engines: {node: '>= 6.0.0'} - dev: true + agent-base@5.1.1: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.3.0: dependencies: debug: 4.3.4 depd: 2.0.0 humanize-ms: 1.2.1 transitivePeerDependencies: - supports-color - dev: false - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - /ajv-formats@2.1.1(ajv@8.11.2): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + ajv-formats@2.1.1(ajv@8.11.2): dependencies: ajv: 8.11.2 - dev: false - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - /ajv-keywords@5.1.0(ajv@8.11.2): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 + ajv-keywords@5.1.0(ajv@8.11.2): dependencies: ajv: 8.11.2 fast-deep-equal: 3.1.3 - dev: false - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.11.2: - resolution: {integrity: sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==} + ajv@8.11.2: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - /algoliasearch-helper@3.13.3(algoliasearch@4.18.0): - resolution: {integrity: sha512-jhbbuYZ+fheXpaJlqdJdFa1jOsrTWKmRRTYDM3oVTto5VodZzM7tT+BHzslAotaJf/81CKrm6yLRQn8WIr/K4A==} - peerDependencies: - algoliasearch: '>= 3.1 < 6' + algoliasearch-helper@3.13.3(algoliasearch@4.18.0): dependencies: '@algolia/events': 4.0.1 algoliasearch: 4.18.0 - dev: false - /algoliasearch@4.18.0: - resolution: {integrity: sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==} + algoliasearch@4.18.0: dependencies: '@algolia/cache-browser-local-storage': 4.18.0 '@algolia/cache-common': 4.18.0 @@ -8616,160 +14689,101 @@ packages: '@algolia/requester-common': 4.18.0 '@algolia/requester-node-http': 4.18.0 '@algolia/transporter': 4.18.0 - dev: false - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + ansi-colors@4.1.3: {} - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: false + ansi-html-community@0.0.8: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: false + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - requiresBuild: true + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: false + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - dev: true + app-root-dir@1.0.2: {} - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + aproba@2.0.0: {} - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false + arg@5.0.2: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false + argparse@2.0.1: {} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: false - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 - dev: false - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-flatten@1.1.1: {} - /array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: false + array-flatten@2.1.2: {} - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} + array-includes@3.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 get-intrinsic: 1.2.1 is-string: 1.0.7 - dev: false - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + array-union@2.1.0: {} - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - dev: false - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - dev: false - /array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + array.prototype.tosorted@1.1.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 - dev: false - /arraybuffer.prototype.slice@1.0.1: - resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.1: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 @@ -8777,71 +14791,41 @@ packages: get-intrinsic: 1.2.1 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: false - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: false + asap@2.0.6: {} - /assert@2.0.0: - resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + assert@2.0.0: dependencies: es6-object-assign: 1.1.0 is-nan: 1.3.2 object-is: 1.1.5 util: 0.12.5 - dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@1.1.0: {} - /ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: false + ast-types-flow@0.0.7: {} - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} + ast-types@0.15.2: dependencies: tslib: 2.6.2 - dev: true - /ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + ast-types@0.16.1: dependencies: tslib: 2.6.2 - dev: true - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + astral-regex@2.0.0: {} - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: true + async-limiter@1.0.1: {} - /async-sema@3.1.1: - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + async-sema@3.1.1: {} - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true + async@3.2.4: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + asynckit@0.4.0: {} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: false + at-least-node@1.0.0: {} - /autoprefixer@10.4.14(postcss@8.4.24): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.14(postcss@8.4.24): dependencies: browserslist: 4.21.7 caniuse-lite: 1.0.30001492 @@ -8850,54 +14834,34 @@ packages: picocolors: 1.0.0 postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.5: {} - /axe-core@4.7.2: - resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} - engines: {node: '>=4'} - dev: false + axe-core@4.7.2: {} - /axios@0.25.0(debug@4.3.4): - resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} + axios@0.25.0(debug@4.3.4): dependencies: follow-redirects: 1.15.2(debug@4.3.4) transitivePeerDependencies: - debug - /axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + axios@1.6.2: dependencies: follow-redirects: 1.15.2(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@3.2.1: dependencies: dequal: 2.0.3 - dev: false - /babel-core@7.0.0-bridge.0(@babel/core@7.22.1): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-core@7.0.0-bridge.0(@babel/core@7.22.1): dependencies: '@babel/core': 7.22.1 - dev: true - /babel-loader@8.3.0(@babel/core@7.22.1)(webpack@5.88.0): - resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' + babel-loader@8.3.0(@babel/core@7.22.1)(webpack@5.88.0): dependencies: '@babel/core': 7.22.1 find-cache-dir: 3.3.2 @@ -8905,33 +14869,22 @@ packages: make-dir: 3.1.0 schema-utils: 2.7.1 webpack: 5.88.0 - dev: false - /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): - resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} - peerDependencies: - '@babel/core': ^7.11.6 + babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.10.4 '@mdx-js/util': 1.6.22 - dev: false - /babel-plugin-dynamic-import-node@2.3.3: - resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + babel-plugin-dynamic-import-node@2.3.3: dependencies: object.assign: 4.1.4 - dev: false - /babel-plugin-extract-import-names@1.6.22: - resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==} + babel-plugin-extract-import-names@1.6.22: dependencies: '@babel/helper-plugin-utils': 7.10.4 - dev: false - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 @@ -8940,12 +14893,8 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-jsx-dom-expressions@0.36.10(@babel/core@7.22.1): - resolution: {integrity: sha512-QA2k/14WGw+RgcGGnEuLWwnu4em6CGhjeXtjvgOYyFHYS2a+CzPeaVQHDOlfuiBcjq/3hWMspHMIMnPEOIzdBg==} - peerDependencies: - '@babel/core': ^7.20.12 + babel-plugin-jsx-dom-expressions@0.36.10(@babel/core@7.22.1): dependencies: '@babel/core': 7.22.1 '@babel/helper-module-imports': 7.18.6 @@ -8954,10 +14903,7 @@ packages: html-entities: 2.3.3 validate-html-nesting: 1.2.2 - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.8): - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.8): dependencies: '@babel/compat-data': 7.22.3 '@babel/core': 7.21.8 @@ -8965,12 +14911,8 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs2@0.4.3(@babel/core@7.22.1): - resolution: {integrity: sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-corejs2@0.4.3(@babel/core@7.22.1): dependencies: '@babel/compat-data': 7.22.3 '@babel/core': 7.22.1 @@ -8979,22 +14921,15 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.8): - resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.8): dependencies: '@babel/core': 7.21.8 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.8) core-js-compat: 3.30.2 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs3@0.8.1(@babel/core@7.22.1): - resolution: {integrity: sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-corejs3@0.8.1(@babel/core@7.22.1): dependencies: '@babel/core': 7.22.1 '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1) @@ -9002,110 +14937,70 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.8): - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.8): dependencies: '@babel/core': 7.21.8 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.8) transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-regenerator@0.5.0(@babel/core@7.22.1): - resolution: {integrity: sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-plugin-polyfill-regenerator@0.5.0(@babel/core@7.22.1): dependencies: '@babel/core': 7.22.1 '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1) transitivePeerDependencies: - supports-color - /babel-preset-solid@1.7.4(@babel/core@7.22.1): - resolution: {integrity: sha512-0mbHNYkbOVYhH6L95VlHVkBEVQjOXSzUqLDiFxUcsg/tU4yTM/qx7FI8C+kmos9LHckQBSm3wtwoe1BZLNJR1w==} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-solid@1.7.4(@babel/core@7.22.1): dependencies: '@babel/core': 7.22.1 babel-plugin-jsx-dom-expressions: 0.36.10(@babel/core@7.22.1) - /bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - dev: false + bail@1.0.5: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + base-x@3.0.9: dependencies: safe-buffer: 5.2.1 - /base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + base-x@4.0.0: {} - /base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} - dev: false + base16@1.0.0: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: false + batch@0.6.1: {} - /better-opn@2.1.1: - resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} - engines: {node: '>8.0.0'} + better-opn@2.1.1: dependencies: open: 7.4.2 - dev: true - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} + big-integer@1.6.51: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: false + big.js@5.2.2: {} - /bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - requiresBuild: true + bigint-buffer@1.1.5: dependencies: bindings: 1.5.0 - dev: false - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + binary-extensions@2.2.0: {} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + blueimp-md5@2.19.0: {} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + bn.js@5.2.1: {} - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -9122,29 +15017,22 @@ packages: transitivePeerDependencies: - supports-color - /bonjour-service@1.1.1: - resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + bonjour-service@1.1.1: dependencies: array-flatten: 2.1.2 dns-equal: 1.0.0 fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 - dev: false - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boolbase@1.0.0: {} - /borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + borsh@0.7.0: dependencies: bn.js: 5.2.1 bs58: 4.0.1 text-encoding-utf-8: 1.0.2 - dev: false - /boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} + boxen@5.1.2: dependencies: ansi-align: 3.0.1 camelcase: 6.3.0 @@ -9155,9 +15043,7 @@ packages: widest-line: 3.1.0 wrap-ansi: 7.0.0 - /boxen@6.2.1: - resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + boxen@6.2.1: dependencies: ansi-align: 3.0.1 camelcase: 6.3.0 @@ -9167,132 +15053,86 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: false - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.51 - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - dev: true + browser-assert@1.2.1: {} - /browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + browserify-zlib@0.1.4: dependencies: pako: 0.2.9 - dev: true - /browserslist@4.21.7: - resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.21.7: dependencies: caniuse-lite: 1.0.30001492 electron-to-chromium: 1.4.417 node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.7) - /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + bs58@4.0.1: dependencies: base-x: 3.0.9 - dev: false - /bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + bs58@5.0.0: dependencies: base-x: 4.0.0 - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - dev: true - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true + buffer-crc32@0.2.13: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false - /bufferutil@4.0.7: - resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} - engines: {node: '>=6.14.2'} - requiresBuild: true + bufferutil@4.0.7: dependencies: node-gyp-build: 4.6.0 - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + builtin-modules@3.3.0: {} - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} + bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} + bytes@3.0.0: {} - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + bytes@3.1.2: {} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + cac@6.7.14: {} - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: false + cacheable-lookup@5.0.4: {} - /cacheable-request@6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} - engines: {node: '>=8'} + cacheable-request@6.1.0: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 @@ -9301,11 +15141,8 @@ packages: lowercase-keys: 2.0.0 normalize-url: 4.5.1 responselike: 1.0.2 - dev: false - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} + cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 @@ -9314,64 +15151,42 @@ packages: lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - dev: false - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bind@1.0.2: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + camel-case@3.0.0: dependencies: no-case: 2.3.2 upper-case: 1.1.3 - dev: true - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.6.2 - dev: false - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: false + camelcase-css@2.0.1: {} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + camelcase@6.3.0: {} - /caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-api@3.0.0: dependencies: browserslist: 4.21.7 caniuse-lite: 1.0.30001492 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - /caniuse-lite@1.0.30001492: - resolution: {integrity: sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==} + caniuse-lite@1.0.30001492: {} - /ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - dev: false + ccount@1.1.0: {} - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} + chai@4.3.7: dependencies: assertion-error: 1.1.0 check-error: 1.0.2 @@ -9381,39 +15196,26 @@ packages: pathval: 1.1.1 type-detect: 4.0.8 - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - requiresBuild: true + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: false + character-entities-legacy@1.1.4: {} - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: false + character-entities@1.2.4: {} - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: false + character-reference-invalid@1.1.4: {} - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + check-error@1.0.2: {} - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 css-select: 5.1.0 @@ -9421,11 +15223,8 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 - dev: false - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + cheerio@1.0.0-rc.12: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 @@ -9434,11 +15233,8 @@ packages: htmlparser2: 8.0.2 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 - dev: false - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -9450,195 +15246,111 @@ packages: optionalDependencies: fsevents: 2.3.2 - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true + chownr@1.1.4: {} - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@2.0.0: {} - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} + chrome-trace-event@1.0.3: {} - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: false + ci-info@2.0.0: {} - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} + ci-info@3.8.0: {} - /clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} + clean-css@4.2.4: dependencies: source-map: 0.6.1 - dev: true - /clean-css@5.3.2: - resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} - engines: {node: '>= 10.0'} + clean-css@5.3.2: dependencies: source-map: 0.6.1 - dev: false - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + clean-stack@2.2.0: {} - /cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} + cli-boxes@2.2.1: {} - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: false + cli-boxes@3.0.0: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.0: {} - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} + cli-table3@0.6.3: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + client-only@0.0.1: {} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone-response@1.0.3: dependencies: mimic-response: 1.0.1 - dev: false - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false + clsx@1.2.1: {} - /collapse-white-space@1.0.6: - resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} - dev: false + collapse-white-space@1.0.6: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - requiresBuild: true + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - requiresBuild: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true + color-support@1.1.3: {} - /colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colord@2.9.3: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorette@2.0.20: {} - /combine-promises@1.1.0: - resolution: {integrity: sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==} - engines: {node: '>=10'} - dev: false + combine-promises@1.1.0: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - /comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - dev: false + comma-separated-tokens@1.0.8: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false + commander@4.1.1: {} - /commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} + commander@5.1.0: {} - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: true + commander@6.2.1: {} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + commander@7.2.0: {} - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: false + commander@8.3.0: {} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + commondir@1.0.1: {} - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: mime-db: 1.52.0 - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + compression@1.7.4: dependencies: accepts: 1.3.8 bytes: 3.0.0 @@ -9650,22 +15362,16 @@ packages: transitivePeerDependencies: - supports-color - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: true - /concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + concordance@5.0.4: dependencies: date-time: 3.1.0 esutils: 2.0.3 @@ -9676,9 +15382,7 @@ packages: semver: 7.3.8 well-known-symbols: 2.0.0 - /configstore@5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} + configstore@5.0.1: dependencies: dot-prop: 5.3.0 graceful-fs: 4.2.11 @@ -9686,16 +15390,10 @@ packages: unique-string: 2.0.0 write-file-atomic: 3.0.3 xdg-basedir: 4.0.0 - dev: false - /connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - dev: false + connect-history-api-fallback@2.0.0: {} - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} + connect@3.7.0: dependencies: debug: 2.6.9 finalhandler: 1.1.2 @@ -9704,52 +15402,29 @@ packages: transitivePeerDependencies: - supports-color - /consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} - dev: false + consola@2.15.3: {} - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + console-control-strings@1.1.0: {} - /content-disposition@0.5.2: - resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} - engines: {node: '>= 0.6'} - dev: false + content-disposition@0.5.2: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + content-type@1.0.5: {} - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.0.6: {} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + cookie@0.5.0: {} - /copy-text-to-clipboard@3.1.0: - resolution: {integrity: sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==} - engines: {node: '>=12'} - dev: false + copy-text-to-clipboard@3.1.0: {} - /copy-webpack-plugin@11.0.0(webpack@5.88.0): - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.1.0 + copy-webpack-plugin@11.0.0(webpack@5.88.0): dependencies: fast-glob: 3.3.0 glob-parent: 6.0.2 @@ -9758,40 +15433,26 @@ packages: schema-utils: 4.2.0 serialize-javascript: 6.0.1 webpack: 5.88.0 - dev: false - /core-js-compat@3.30.2: - resolution: {integrity: sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==} + core-js-compat@3.30.2: dependencies: browserslist: 4.21.7 - /core-js-pure@3.31.0: - resolution: {integrity: sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg==} - requiresBuild: true - dev: false + core-js-pure@3.31.0: {} - /core-js@3.31.0: - resolution: {integrity: sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==} - requiresBuild: true - dev: false + core-js@3.31.0: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-util-is@1.0.3: {} - /cosmiconfig@6.0.0: - resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} - engines: {node: '>=8'} + cosmiconfig@6.0.0: dependencies: '@types/parse-json': 4.0.0 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: false - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.0 import-fresh: 3.3.0 @@ -9799,48 +15460,32 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cosmiconfig@8.2.0: - resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} - engines: {node: '>=14'} + cosmiconfig@8.2.0: dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - dev: false - /cross-fetch@3.1.6: - resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} + cross-fetch@3.1.6: dependencies: node-fetch: 2.6.11 transitivePeerDependencies: - encoding - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} + crypto-random-string@2.0.0: {} - /css-declaration-sorter@6.4.0(postcss@8.4.24): - resolution: {integrity: sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 + css-declaration-sorter@6.4.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - /css-loader@6.8.1(webpack@5.88.0): - resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + css-loader@6.8.1(webpack@5.88.0): dependencies: icss-utils: 5.1.0(postcss@8.4.24) postcss: 8.4.24 @@ -9851,32 +15496,8 @@ packages: postcss-value-parser: 4.2.0 semver: 7.3.8 webpack: 5.88.0 - dev: false - /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.88.0): - resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@parcel/css': '*' - '@swc/css': '*' - clean-css: '*' - csso: '*' - esbuild: '*' - lightningcss: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@parcel/css': - optional: true - '@swc/css': - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - lightningcss: - optional: true + css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.88.0): dependencies: clean-css: 5.3.2 cssnano: 5.1.15(postcss@8.4.24) @@ -9886,10 +15507,8 @@ packages: serialize-javascript: 6.0.1 source-map: 0.6.1 webpack: 5.88.0 - dev: false - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + css-select@4.3.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 @@ -9897,37 +15516,24 @@ packages: domutils: 2.8.0 nth-check: 2.1.1 - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: false - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + css-tree@1.1.3: dependencies: mdn-data: 2.0.14 source-map: 0.6.1 - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + css-what@6.1.0: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + cssesc@3.0.0: {} - /cssnano-preset-advanced@5.3.10(postcss@8.4.24): - resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + cssnano-preset-advanced@5.3.10(postcss@8.4.24): dependencies: autoprefixer: 10.4.14(postcss@8.4.24) cssnano-preset-default: 5.2.14(postcss@8.4.24) @@ -9936,13 +15542,8 @@ packages: postcss-merge-idents: 5.1.1(postcss@8.4.24) postcss-reduce-idents: 5.2.0(postcss@8.4.24) postcss-zindex: 5.1.0(postcss@8.4.24) - dev: false - /cssnano-preset-default@5.2.14(postcss@8.4.24): - resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + cssnano-preset-default@5.2.14(postcss@8.4.24): dependencies: css-declaration-sorter: 6.4.0(postcss@8.4.24) cssnano-utils: 3.1.0(postcss@8.4.24) @@ -9975,178 +15576,99 @@ packages: postcss-svgo: 5.1.0(postcss@8.4.24) postcss-unique-selectors: 5.1.1(postcss@8.4.24) - /cssnano-utils@3.1.0(postcss@8.4.24): - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + cssnano-utils@3.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - /cssnano@5.1.15(postcss@8.4.24): - resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + cssnano@5.1.15(postcss@8.4.24): dependencies: cssnano-preset-default: 5.2.14(postcss@8.4.24) lilconfig: 2.1.0 postcss: 8.4.24 yaml: 1.10.2 - /csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} + csso@4.2.0: dependencies: css-tree: 1.1.3 - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + csstype@3.1.2: {} - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: false + damerau-levenshtein@1.0.8: {} - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false + data-uri-to-buffer@4.0.1: {} - /date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} + date-time@3.1.0: dependencies: time-zone: 1.0.0 - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: false - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: true + decode-uri-component@0.2.2: {} - /decompress-response@3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} + decompress-response@3.3.0: dependencies: mimic-response: 1.0.1 - dev: false - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: false - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: false + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + deepmerge@4.3.1: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} + default-browser@4.0.0: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 execa: 7.1.1 titleize: 3.0.0 - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + default-gateway@6.0.3: dependencies: execa: 5.1.1 - dev: false - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /defer-to-connect@1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - dev: false + defer-to-connect@1.1.3: {} - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: false + defer-to-connect@2.0.1: {} - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + define-lazy-prop@2.0.0: {} - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + define-lazy-prop@3.0.0: {} - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} + define-properties@1.2.0: dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /defu@6.1.2: - resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} - dev: true + defu@6.1.2: {} - /del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} + del@6.1.1: dependencies: globby: 11.1.0 graceful-fs: 4.2.11 @@ -10157,289 +15679,176 @@ packages: rimraf: 3.0.2 slash: 3.0.0 - /delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - dev: false + delay@5.0.0: {} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + delegates@1.0.0: {} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: false + depd@1.1.2: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + depd@2.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + dequal@2.0.3: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + destroy@1.2.0: {} - /detab@2.0.4: - resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} + detab@2.0.4: dependencies: repeat-string: 1.6.1 - dev: false - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} + detect-libc@2.0.1: {} - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: false + detect-node@2.1.0: {} - /detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} + detect-package-manager@2.0.1: dependencies: execa: 5.1.1 - dev: true - /detect-port-alt@1.1.6: - resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} - engines: {node: '>= 4.2.1'} - hasBin: true + detect-port-alt@1.1.6: dependencies: address: 1.2.2 debug: 2.6.9 transitivePeerDependencies: - supports-color - dev: false - /detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} - hasBin: true + detect-port@1.5.1: dependencies: address: 1.2.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false + didyoumean@1.2.2: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false + dlv@1.1.3: {} - /dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: false + dns-equal@1.0.0: {} - /dns-packet@5.6.0: - resolution: {integrity: sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==} - engines: {node: '>=6'} + dns-packet@5.6.0: dependencies: '@leichtgewicht/ip-codec': 2.0.4 - dev: false - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: false - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - /dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dom-converter@0.2.0: dependencies: utila: 0.4.0 - dev: false - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: false - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domelementtype@2.3.0: {} - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + domhandler@4.3.1: dependencies: domelementtype: 2.3.0 - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: false - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: false - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: false - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + dotenv-expand@10.0.0: {} - /dotenv@16.1.3: - resolution: {integrity: sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==} - engines: {node: '>=12'} + dotenv@16.1.3: {} - /duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - dev: false + duplexer3@0.1.5: {} - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: false + duplexer@0.1.2: {} - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + duplexify@3.7.1: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.1 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false + eastasianwidth@0.2.0: {} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ee-first@1.1.1: {} - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.9: dependencies: jake: 10.8.7 - dev: true - /electron-to-chromium@1.4.417: - resolution: {integrity: sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA==} + electron-to-chromium@1.4.417: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false + emoji-regex@9.2.2: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: false + emojis-list@3.0.0: {} - /emoticon@3.2.0: - resolution: {integrity: sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==} - dev: false + emoticon@3.2.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + encodeurl@1.0.2: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.15.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@2.2.0: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false + entities@4.5.0: {} - /envinfo@7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} - engines: {node: '>=4'} - hasBin: true - dev: true + envinfo@7.8.1: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.22.1: - resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} - engines: {node: '>= 0.4'} + es-abstract@1.22.1: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.1 @@ -10480,206 +15889,86 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.10 - dev: false - /es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - dev: true + es-module-lexer@0.9.3: {} - /es-module-lexer@1.3.0: - resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + es-module-lexer@1.3.0: {} - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.1: dependencies: get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 - dev: false - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + es-shim-unscopables@1.0.0: dependencies: has: 1.0.3 - dev: false - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: false - /es6-object-assign@1.1.0: - resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} - dev: true + es6-object-assign@1.1.0: {} - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false + es6-promise@4.2.8: {} - /es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 - dev: false - /esbuild-android-64@0.14.54: - resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + esbuild-android-64@0.14.54: optional: true - /esbuild-android-arm64@0.14.54: - resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + esbuild-android-arm64@0.14.54: optional: true - - /esbuild-darwin-64@0.14.54: - resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + + esbuild-darwin-64@0.14.54: optional: true - /esbuild-darwin-arm64@0.14.54: - resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + esbuild-darwin-arm64@0.14.54: optional: true - /esbuild-freebsd-64@0.14.54: - resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + esbuild-freebsd-64@0.14.54: optional: true - /esbuild-freebsd-arm64@0.14.54: - resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + esbuild-freebsd-arm64@0.14.54: optional: true - /esbuild-linux-32@0.14.54: - resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-32@0.14.54: optional: true - /esbuild-linux-64@0.14.54: - resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-64@0.14.54: optional: true - /esbuild-linux-arm64@0.14.54: - resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-arm64@0.14.54: optional: true - /esbuild-linux-arm@0.14.54: - resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-arm@0.14.54: optional: true - /esbuild-linux-mips64le@0.14.54: - resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-mips64le@0.14.54: optional: true - /esbuild-linux-ppc64le@0.14.54: - resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-ppc64le@0.14.54: optional: true - /esbuild-linux-riscv64@0.14.54: - resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-riscv64@0.14.54: optional: true - /esbuild-linux-s390x@0.14.54: - resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-s390x@0.14.54: optional: true - /esbuild-netbsd-64@0.14.54: - resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + esbuild-netbsd-64@0.14.54: optional: true - /esbuild-openbsd-64@0.14.54: - resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + esbuild-openbsd-64@0.14.54: optional: true - /esbuild-plugin-alias@0.2.1: - resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} - dev: true + esbuild-plugin-alias@0.2.1: {} - /esbuild-plugin-solid@0.5.0(esbuild@0.17.19)(solid-js@1.7.2): - resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} - peerDependencies: - esbuild: '>=0.12' - solid-js: '>= 1.0' + esbuild-plugin-solid@0.5.0(esbuild@0.17.19)(solid-js@1.7.2): dependencies: '@babel/core': 7.22.1 '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1) @@ -10689,58 +15978,26 @@ packages: transitivePeerDependencies: - supports-color - /esbuild-register@3.4.2(esbuild@0.17.19): - resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==} - peerDependencies: - esbuild: '>=0.12 <1' + esbuild-register@3.4.2(esbuild@0.17.19): dependencies: debug: 4.3.4 esbuild: 0.17.19 transitivePeerDependencies: - supports-color - dev: true - /esbuild-sunos-64@0.14.54: - resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + esbuild-sunos-64@0.14.54: optional: true - /esbuild-windows-32@0.14.54: - resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-32@0.14.54: optional: true - /esbuild-windows-64@0.14.54: - resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-64@0.14.54: optional: true - /esbuild-windows-arm64@0.14.54: - resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-arm64@0.14.54: optional: true - /esbuild@0.14.54: - resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.14.54: optionalDependencies: '@esbuild/linux-loong64': 0.14.54 esbuild-android-64: 0.14.54 @@ -10763,13 +16020,8 @@ packages: esbuild-windows-32: 0.14.54 esbuild-windows-64: 0.14.54 esbuild-windows-arm64: 0.14.54 - dev: true - /esbuild@0.16.10: - resolution: {integrity: sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.16.10: optionalDependencies: '@esbuild/android-arm': 0.16.10 '@esbuild/android-arm64': 0.16.10 @@ -10793,13 +16045,8 @@ packages: '@esbuild/win32-arm64': 0.16.10 '@esbuild/win32-ia32': 0.16.10 '@esbuild/win32-x64': 0.16.10 - dev: false - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 '@esbuild/android-arm64': 0.17.19 @@ -10824,35 +16071,17 @@ packages: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + escalade@3.1.1: {} - /escape-goat@2.1.1: - resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} - engines: {node: '>=8'} - dev: false + escape-goat@2.1.1: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - requiresBuild: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + escape-string-regexp@4.0.0: {} - /eslint-config-next@13.4.10(eslint@8.45.0)(typescript@5.1.6): - resolution: {integrity: sha512-+JjcM6lQmFR5Mw0ORm9o1CR29+z/uajgSfYAPEGIBxOhTHBgCMs7ysuwi72o7LkMmA8E3N7/h09pSGZxs0s85g==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true + eslint-config-next@13.4.10(eslint@8.45.0)(typescript@5.1.6): dependencies: '@next/eslint-plugin-next': 13.4.10 '@rushstack/eslint-patch': 1.3.2 @@ -10868,33 +16097,20 @@ packages: transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-config-prettier@8.5.0(eslint@7.32.0): - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@8.5.0(eslint@7.32.0): dependencies: eslint: 7.32.0 - dev: false - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + eslint-import-resolver-node@0.3.7: dependencies: debug: 3.2.7 is-core-module: 2.11.0 resolve: 1.22.2 transitivePeerDependencies: - supports-color - dev: false - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0): - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 @@ -10911,28 +16127,8 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.0(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): dependencies: '@typescript-eslint/parser': 5.44.0(eslint@8.45.0)(typescript@5.1.6) debug: 3.2.7 @@ -10941,17 +16137,8 @@ packages: eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0) transitivePeerDependencies: - supports-color - dev: false - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.44.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): dependencies: '@typescript-eslint/parser': 5.44.0(eslint@8.45.0)(typescript@5.1.6) array-includes: 3.1.6 @@ -10974,13 +16161,8 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.45.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-jsx-a11y@6.7.1(eslint@8.45.0): dependencies: '@babel/runtime': 7.22.3 aria-query: 5.3.0 @@ -10999,22 +16181,12 @@ packages: object.entries: 1.1.6 object.fromentries: 2.0.6 semver: 6.3.0 - dev: false - /eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.45.0): - resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.45.0): dependencies: eslint: 8.45.0 - dev: false - /eslint-plugin-react@7.32.2(eslint@8.45.0): - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.32.2(eslint@8.45.0): dependencies: array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -11032,55 +16204,33 @@ packages: resolve: 2.0.0-next.4 semver: 6.3.0 string.prototype.matchall: 4.0.8 - dev: false - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.2.1: - resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.1: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: false - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} + eslint-utils@2.1.0: dependencies: eslint-visitor-keys: 1.3.0 - /eslint-utils@3.0.0(eslint@7.32.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' + eslint-utils@3.0.0(eslint@7.32.0): dependencies: eslint: 7.32.0 eslint-visitor-keys: 2.1.0 - dev: false - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} + eslint-visitor-keys@1.3.0: {} - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + eslint-visitor-keys@2.1.0: {} - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + eslint-visitor-keys@3.4.1: {} - /eslint@7.32.0: - resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} - engines: {node: ^10.12.0 || >=12.0.0} + eslint@7.32.0: dependencies: '@babel/code-frame': 7.12.11 '@eslint/eslintrc': 0.4.3 @@ -11125,10 +16275,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint@8.45.0: - resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.45.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) '@eslint-community/regexpp': 4.5.1 @@ -11169,98 +16316,59 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: false - /espree@7.3.1: - resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} - engines: {node: ^10.12.0 || >=12.0.0} + espree@7.3.1: dependencies: acorn: 7.4.1 acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.1 - dev: false - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} - engines: {node: '>=0.10'} + esquery@1.4.0: dependencies: estraverse: 5.3.0 - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: false - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + estraverse@5.3.0: {} - /estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + estree-walker@1.0.1: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@2.0.2: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /eta@2.2.0: - resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} - engines: {node: '>=6.0.0'} - dev: false + eta@2.2.0: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + etag@1.8.1: {} - /eval@0.1.8: - resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} - engines: {node: '>= 0.8'} + eval@0.1.8: dependencies: '@types/node': 20.9.0 require-like: 0.1.2 - dev: false - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@4.0.7: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false + eventemitter3@5.0.1: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + events@3.3.0: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -11272,9 +16380,7 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -11286,9 +16392,7 @@ packages: signal-exit: 3.0.7 strip-final-newline: 3.0.0 - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + express@4.18.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -11324,19 +16428,13 @@ packages: transitivePeerDependencies: - supports-color - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - dev: false - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extend@3.0.2: {} - /extract-zip@1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true + extract-zip@1.7.0: dependencies: concat-stream: 1.6.2 debug: 2.6.9 @@ -11344,22 +16442,14 @@ packages: yauzl: 2.10.0 transitivePeerDependencies: - supports-color - dev: true - /eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - dev: false + eyes@0.1.8: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-diff@1.3.0: {} - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + fast-glob@3.2.12: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -11367,9 +16457,7 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-glob@3.3.0: - resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.0: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -11377,54 +16465,37 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-levenshtein@2.0.6: {} - /fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - dev: false + fast-stable-stringify@1.0.0: {} - /fast-url-parser@1.1.3: - resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + fast-url-parser@1.1.3: dependencies: punycode: 1.4.1 - dev: false - /fastq@1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + fastq@1.13.0: dependencies: reusify: 1.0.4 - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + faye-websocket@0.11.4: dependencies: websocket-driver: 0.7.4 - dev: false - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - dev: true - /fbemitter@3.0.0: - resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + fbemitter@3.0.0: dependencies: fbjs: 3.0.5 transitivePeerDependencies: - encoding - dev: false - /fbjs-css-vars@1.0.2: - resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - dev: false + fbjs-css-vars@1.0.2: {} - /fbjs@3.0.5: - resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fbjs@3.0.5: dependencies: cross-fetch: 3.1.6 fbjs-css-vars: 1.0.2 @@ -11435,88 +16506,54 @@ packages: ua-parser-js: 1.0.35 transitivePeerDependencies: - encoding - dev: false - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 - dev: true - /feed@4.2.2: - resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} - engines: {node: '>=0.4.0'} + feed@4.2.2: dependencies: xml-js: 1.6.11 - dev: false - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 - dev: false - /fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} - dev: true + fetch-retry@5.0.6: {} - /fflate@0.7.4: - resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + fflate@0.7.4: {} - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.0.4 - /file-loader@6.2.0(webpack@5.88.0): - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + file-loader@6.2.0(webpack@5.88.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.88.0 - dev: false - /file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + file-system-cache@2.3.0: dependencies: fs-extra: 11.1.1 ramda: 0.29.0 - dev: true - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + file-uri-to-path@1.0.0: {} - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - dev: true - /filesize@8.0.7: - resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} - engines: {node: '>= 0.4.0'} - dev: false + filesize@8.0.7: {} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - dev: true - - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} + filter-obj@1.1.0: {} + + finalhandler@1.1.2: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -11528,9 +16565,7 @@ packages: transitivePeerDependencies: - supports-color - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -11542,99 +16577,58 @@ packages: transitivePeerDependencies: - supports-color - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} + find-cache-dir@2.1.0: dependencies: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 - dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.0.4: dependencies: flatted: 3.2.7 rimraf: 3.0.2 - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + flatted@3.2.7: {} - /flow-parser@0.207.0: - resolution: {integrity: sha512-s90OlXqzWj1xc4yUtqD1Gr8pGVx0/5rk9gsqPrOYF1kBAPMH4opkmzdWgQ8aNe3Pckqtwr8DlYGbfE2GnW+zsg==} - engines: {node: '>=0.4.0'} - dev: true + flow-parser@0.207.0: {} - /flux@4.0.4(react@17.0.2): - resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} - peerDependencies: - react: ^15.0.2 || ^16.0.0 || ^17.0.0 + flux@4.0.4(react@17.0.2): dependencies: fbemitter: 3.0.0 fbjs: 3.0.5 react: 17.0.2 transitivePeerDependencies: - encoding - dev: false - /follow-redirects@1.15.2(debug@4.3.4): - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + follow-redirects@1.15.2(debug@4.3.4): dependencies: debug: 4.3.4 - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@7.32.0)(typescript@4.9.4)(webpack@5.88.0): - resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} - engines: {node: '>=10', yarn: '>=1.0.0'} - peerDependencies: - eslint: '>= 6' - typescript: '>= 2.7' - vue-template-compiler: '*' - webpack: '>= 4' - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true + fork-ts-checker-webpack-plugin@6.5.3(eslint@7.32.0)(typescript@4.9.4)(webpack@5.88.0): dependencies: '@babel/code-frame': 7.21.4 '@types/json-schema': 7.0.11 @@ -11652,118 +16646,75 @@ packages: tapable: 1.1.3 typescript: 4.9.4 webpack: 5.88.0 - dev: false - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} + form-data@3.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - dev: false - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + forwarded@0.2.0: {} - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: false + fraction.js@4.2.0: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@0.5.2: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true + fs-constants@1.0.0: {} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} + fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - /fs-monkey@1.0.4: - resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} - dev: false + fs-monkey@1.0.4: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.2: optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + function-bind@1.1.1: {} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.5: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 functions-have-names: 1.2.3 - dev: false - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + functional-red-black-tree@1.0.1: {} - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false + functions-have-names@1.2.3: {} - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} + gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -11775,83 +16726,49 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + get-func-name@2.0.0: {} - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + get-intrinsic@1.2.1: dependencies: function-bind: 1.1.1 has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - /get-npm-tarball-url@2.0.3: - resolution: {integrity: sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==} - engines: {node: '>=12.17'} - dev: true + get-npm-tarball-url@2.0.3: {} - /get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: false + get-own-enumerable-property-symbols@3.0.2: {} - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true + get-port@5.1.1: {} - /get-port@6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + get-port@6.1.2: {} - /get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} + get-stream@4.1.0: dependencies: pump: 3.0.0 - dev: false - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: pump: 3.0.0 - dev: false - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-stream@6.0.1: {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - dev: false - /get-tsconfig@4.6.2: - resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} + get-tsconfig@4.6.2: dependencies: resolve-pkg-maps: 1.0.0 - dev: false - /giget@1.1.2: - resolution: {integrity: sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==} - hasBin: true + giget@1.1.2: dependencies: colorette: 2.0.20 defu: 6.1.2 @@ -11862,39 +16779,25 @@ packages: tar: 6.1.15 transitivePeerDependencies: - supports-color - dev: true - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + github-slugger@1.5.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: false - /glob-promise@6.0.2(glob@8.1.0): - resolution: {integrity: sha512-Ni2aDyD1ekD6x8/+K4hDriRDbzzfuK4yKpqSymJ4P7IxbtARiOOuU+k40kbHM0sLIlbf1Qh0qdMkAHMZYE6XJQ==} - engines: {node: '>=16'} - peerDependencies: - glob: ^8.0.3 + glob-promise@6.0.2(glob@8.1.0): dependencies: '@types/glob': 8.1.0 glob: 8.1.0 - dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob-to-regexp@0.4.1: {} - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + glob@7.1.6: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -11902,10 +16805,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -11913,10 +16814,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -11925,9 +16824,7 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -11935,55 +16832,35 @@ packages: minimatch: 5.1.6 once: 1.4.0 - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} + global-dirs@3.0.1: dependencies: ini: 2.0.0 - dev: false - /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - dev: false - /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} + global-prefix@3.0.0: dependencies: ini: 1.3.8 kind-of: 6.0.3 which: 1.3.1 - dev: false - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@13.18.0: - resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==} - engines: {node: '>=8'} + globals@13.18.0: dependencies: type-fest: 0.20.2 - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} + globals@13.20.0: dependencies: type-fest: 0.20.2 - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.0 - dev: false - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -11992,29 +16869,21 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /globby@13.2.0: - resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@13.2.0: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.0 ignore: 5.2.0 merge2: 1.4.1 slash: 4.0.0 - dev: false - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: false + globrex@0.1.2: {} - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.1 - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} + got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 '@szmarczak/http-timer': 4.0.6 @@ -12027,11 +16896,8 @@ packages: lowercase-keys: 2.0.0 p-cancelable: 2.1.1 responselike: 2.0.1 - dev: false - /got@9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} + got@9.6.0: dependencies: '@sindresorhus/is': 0.14.0 '@szmarczak/http-timer': 1.1.2 @@ -12046,28 +16912,19 @@ packages: p-cancelable: 1.1.0 to-readable-stream: 1.0.0 url-parse-lax: 3.0.0 - dev: false - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: false + graphemer@1.4.0: {} - /gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + gray-matter@4.0.3: dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - dev: false - /gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true + gunzip-maybe@1.4.2: dependencies: browserify-zlib: 0.1.4 is-deflate: 1.0.0 @@ -12075,23 +16932,14 @@ packages: peek-stream: 1.1.3 pumpify: 1.5.1 through2: 2.0.5 - dev: true - /gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 - dev: false - /handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: false + handle-thing@2.0.1: {} - /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} - engines: {node: '>=0.4.7'} - hasBin: true + handlebars@4.7.7: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -12099,56 +16947,34 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: false + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - requiresBuild: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + has-property-descriptors@1.0.0: dependencies: get-intrinsic: 1.2.1 - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + has-unicode@2.0.1: {} - /has-yarn@2.1.0: - resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} - engines: {node: '>=8'} - dev: false + has-yarn@2.1.0: {} - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has@1.0.3: dependencies: function-bind: 1.1.1 - /hast-to-hyperscript@9.0.1: - resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + hast-to-hyperscript@9.0.1: dependencies: '@types/unist': 2.0.6 comma-separated-tokens: 1.0.8 @@ -12157,10 +16983,8 @@ packages: style-to-object: 0.3.0 unist-util-is: 4.1.0 web-namespaces: 1.1.4 - dev: false - /hast-util-from-parse5@6.0.1: - resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} + hast-util-from-parse5@6.0.1: dependencies: '@types/parse5': 5.0.3 hastscript: 6.0.0 @@ -12168,14 +16992,10 @@ packages: vfile: 4.2.1 vfile-location: 3.2.0 web-namespaces: 1.1.4 - dev: false - /hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - dev: false + hast-util-parse-selector@2.2.5: {} - /hast-util-raw@6.0.1: - resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} + hast-util-raw@6.0.1: dependencies: '@types/hast': 2.3.4 hast-util-from-parse5: 6.0.1 @@ -12187,34 +17007,26 @@ packages: web-namespaces: 1.1.4 xtend: 4.0.2 zwitch: 1.0.5 - dev: false - /hast-util-to-parse5@6.0.0: - resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} + hast-util-to-parse5@6.0.0: dependencies: hast-to-hyperscript: 9.0.1 property-information: 5.6.0 web-namespaces: 1.1.4 xtend: 4.0.2 zwitch: 1.0.5 - dev: false - /hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + hastscript@6.0.0: dependencies: '@types/hast': 2.3.4 comma-separated-tokens: 1.0.8 hast-util-parse-selector: 2.2.5 property-information: 5.6.0 space-separated-tokens: 1.1.5 - dev: false - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + he@1.2.0: {} - /history@4.10.1: - resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + history@4.10.1: dependencies: '@babel/runtime': 7.22.3 loose-envify: 1.4.0 @@ -12222,34 +17034,23 @@ packages: tiny-invariant: 1.3.1 tiny-warning: 1.0.3 value-equal: 1.0.1 - dev: false - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: false - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + hpack.js@2.1.6: dependencies: inherits: 2.0.4 obuf: 1.1.2 readable-stream: 2.3.8 wbuf: 1.7.3 - dev: false - /html-entities@2.3.3: - resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + html-entities@2.3.3: {} - /html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true + html-minifier-terser@6.1.0: dependencies: camel-case: 4.1.2 clean-css: 5.3.2 @@ -12258,12 +17059,8 @@ packages: param-case: 3.0.4 relateurl: 0.2.7 terser: 5.17.7 - dev: false - /html-minifier@4.0.0: - resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} - engines: {node: '>=6'} - hasBin: true + html-minifier@4.0.0: dependencies: camel-case: 3.0.0 clean-css: 4.2.4 @@ -12272,22 +17069,12 @@ packages: param-case: 2.1.1 relateurl: 0.2.7 uglify-js: 3.17.4 - dev: true - /html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - dev: false + html-tags@3.3.1: {} - /html-void-elements@1.0.5: - resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} - dev: false + html-void-elements@1.0.5: {} - /html-webpack-plugin@5.5.3(webpack@5.88.0): - resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} - engines: {node: '>=10.13.0'} - peerDependencies: - webpack: ^5.20.0 + html-webpack-plugin@5.5.3(webpack@5.88.0): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -12295,47 +17082,33 @@ packages: pretty-error: 4.0.0 tapable: 2.2.1 webpack: 5.88.0 - dev: false - /htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 domutils: 2.8.0 entities: 2.2.0 - dev: false - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: false - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: false + http-cache-semantics@4.1.1: {} - /http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: false + http-deceiver@1.2.7: {} - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + http-errors@1.6.3: dependencies: depd: 1.1.2 inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: false - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -12343,18 +17116,9 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: false + http-parser-js@0.5.8: {} - /http-proxy-middleware@2.0.6(@types/express@4.17.17): - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true + http-proxy-middleware@2.0.6(@types/express@4.17.17): dependencies: '@types/express': 4.17.17 '@types/http-proxy': 1.17.11 @@ -12364,461 +17128,263 @@ packages: micromatch: 4.0.5 transitivePeerDependencies: - debug - dev: false - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 follow-redirects: 1.15.2(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: false - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} + http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: false - /https-proxy-agent@4.0.0: - resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} - engines: {node: '>= 6.0.0'} + https-proxy-agent@4.0.0: dependencies: agent-base: 5.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + human-signals@4.3.1: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: false - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - /icss-utils@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + icss-utils@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ieee754@1.2.1: {} - /ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} + ignore@4.0.6: {} - /ignore@5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} + ignore@5.2.0: {} - /image-size@1.0.2: - resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} - engines: {node: '>=14.0.0'} - hasBin: true + image-size@1.0.2: dependencies: queue: 6.0.2 - dev: false - /immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - dev: false + immer@9.0.21: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - dev: false + import-lazy@2.1.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + indent-string@4.0.0: {} - /infima@0.2.0-alpha.43: - resolution: {integrity: sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==} - engines: {node: '>=12'} - dev: false + infima@0.2.0-alpha.43: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: false - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.3: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false + inherits@2.0.4: {} - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: false + ini@1.3.8: {} - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false + ini@2.0.0: {} - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} + inline-style-parser@0.1.1: {} + + internal-slot@1.0.5: dependencies: get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 - dev: false - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + interpret@1.4.0: {} - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: true + ip@2.0.0: {} - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + ipaddr.js@1.9.1: {} - /ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} - engines: {node: '>= 10'} - dev: false + ipaddr.js@2.1.0: {} - /is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - dev: true + is-absolute-url@3.0.3: {} - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: false + is-alphabetical@1.0.4: {} - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-alphanumerical@1.0.4: dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: false - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.10 - dev: false - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: false - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: false - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false + is-buffer@2.0.5: {} - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} - /is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true + is-ci@2.0.0: dependencies: ci-info: 2.0.0 - dev: false - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + is-core-module@2.11.0: dependencies: has: 1.0.3 - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: false + is-decimal@1.0.4: {} - /is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - dev: true + is-deflate@1.0.0: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true + is-docker@2.2.1: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + is-docker@3.0.0: {} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false + is-extendable@0.1.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - dev: true + is-gzip@1.0.0: {} - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: false + is-hexadecimal@1.0.4: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 is-path-inside: 3.0.3 - dev: false - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-interactive@1.0.0: {} - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-module@1.0.0: {} - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} + is-nan@1.3.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - dev: true - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: false + is-negative-zero@2.0.2: {} - /is-npm@5.0.0: - resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} - engines: {node: '>=10'} - dev: false + is-npm@5.0.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - dev: false + is-obj@1.0.1: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: false + is-obj@2.0.0: {} - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} + is-path-cwd@2.2.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-path-inside@3.0.3: {} - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: false + is-plain-obj@2.1.0: {} - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: false + is-plain-obj@3.0.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - /is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.1 - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: false - /is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - dev: false + is-regexp@1.0.0: {} - /is-root@2.1.0: - resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} - engines: {node: '>=6'} - dev: false + is-root@2.1.0: {} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.2 - dev: false - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: false - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.10: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -12826,117 +17392,69 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: false + is-typedarray@1.0.0: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.2 - dev: false - /is-what@4.1.15: - resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} - engines: {node: '>=12.13'} + is-what@4.1.15: {} - /is-whitespace-character@1.0.4: - resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} - dev: false + is-whitespace-character@1.0.4: {} - /is-word-character@1.0.4: - resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} - dev: false + is-word-character@1.0.4: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - /is-yarn-global@0.3.0: - resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} - dev: false + is-yarn-global@0.3.0: {} - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false + isarray@0.0.1: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + isobject@3.0.1: {} - /isomorphic-fetch@3.0.0: - resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + isomorphic-fetch@3.0.0: dependencies: node-fetch: 2.6.11 whatwg-fetch: 3.6.2 transitivePeerDependencies: - encoding - dev: false - /isomorphic-localstorage@1.0.2: - resolution: {integrity: sha512-FwfdaTRe4ICraQ0JR0C1ibmIN17WPZxCVQDkYx2E134xmDMamdwv/mgRARW5J7exxKy8vmtmOem05vWWUSlVIw==} + isomorphic-localstorage@1.0.2: dependencies: node-localstorage: 2.2.1 - dev: false - /isomorphic-unfetch@3.1.0: - resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + isomorphic-unfetch@3.1.0: dependencies: node-fetch: 2.6.11 unfetch: 4.2.0 transitivePeerDependencies: - encoding - dev: true - /isomorphic-ws@4.0.1(ws@7.5.9): - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' + isomorphic-ws@4.0.1(ws@7.5.9): dependencies: ws: 7.5.9 - dev: false - /isomorphic-ws@5.0.0(ws@7.5.9): - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' + isomorphic-ws@5.0.0(ws@7.5.9): dependencies: ws: 7.5.9 - dev: false - /isomorphic-ws@5.0.0(ws@8.14.2): - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' + isomorphic-ws@5.0.0(ws@8.14.2): dependencies: ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) - dev: false - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true + istanbul-lib-coverage@3.2.0: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.22.1 '@babel/parser': 7.22.4 @@ -12945,23 +17463,15 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true + jake@10.8.7: dependencies: async: 3.2.4 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: true - /jayson@3.7.0: - resolution: {integrity: sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==} - engines: {node: '>=8'} - hasBin: true + jayson@3.7.0: dependencies: '@types/connect': 3.4.35 '@types/node': 12.20.55 @@ -12979,11 +17489,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /jest-haste-map@29.5.0: - resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@29.5.0: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.6 @@ -12998,16 +17505,10 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 - dev: true - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-regex-util@29.4.3: {} - /jest-util@29.5.0: - resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.5.0: dependencies: '@jest/types': 29.5.0 '@types/node': 20.9.0 @@ -13016,30 +17517,22 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 20.9.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest-worker@29.5.0: - resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.5.0: dependencies: '@types/node': 20.9.0 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} - hasBin: true - dev: false + jiti@1.18.2: {} - /joi@17.9.2: - resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} + joi@17.9.2: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -13047,36 +17540,22 @@ packages: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - /js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} - dev: true + js-sha256@0.9.0: {} - /js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} + js-string-escape@1.0.1: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: false - /jscodeshift@0.14.0(@babel/preset-env@7.21.5): - resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 + jscodeshift@0.14.0(@babel/preset-env@7.21.5): dependencies: '@babel/core': 7.22.1 '@babel/parser': 7.22.4 @@ -13100,13 +17579,8 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color - dev: true - /jscodeshift@0.14.0(@babel/preset-env@7.22.4): - resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 + jscodeshift@0.14.0(@babel/preset-env@7.22.4): dependencies: '@babel/core': 7.22.1 '@babel/parser': 7.22.4 @@ -13130,360 +17604,226 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color - dev: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-buffer@3.0.0: - resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} - dev: false + json-buffer@3.0.0: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: false + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false + json-stringify-safe@5.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: false - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.2.0: {} - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + jsonparse@1.3.1: {} - /jsx-ast-utils@3.3.4: - resolution: {integrity: sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.4: dependencies: array-includes: 3.1.6 array.prototype.flat: 1.3.1 object.assign: 4.1.4 object.values: 1.1.6 - dev: false - /keyv@3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + keyv@3.1.0: dependencies: json-buffer: 3.0.0 - dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: false - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + kleur@3.0.3: {} - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: false + language-subtag-registry@0.3.22: {} - /language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + language-tags@1.0.5: dependencies: language-subtag-registry: 0.3.22 - dev: false - /latest-version@5.1.0: - resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} - engines: {node: '>=8'} + latest-version@5.1.0: dependencies: package-json: 6.5.0 - dev: false - /launch-editor@2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + launch-editor@2.6.0: dependencies: picocolors: 1.0.0 shell-quote: 1.8.1 - dev: false - /lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} + lazy-universal-dotenv@4.0.0: dependencies: app-root-dir: 1.0.2 dotenv: 16.1.3 dotenv-expand: 10.0.0 - dev: true - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + leven@3.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + lilconfig@2.1.0: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /lit-element@3.3.2: - resolution: {integrity: sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==} + lit-element@3.3.2: dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 '@lit/reactive-element': 1.6.2 lit-html: 2.7.4 - /lit-html@2.7.4: - resolution: {integrity: sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g==} + lit-html@2.7.4: dependencies: '@types/trusted-types': 2.0.3 - /lit@2.7.2: - resolution: {integrity: sha512-9QnZmG5mIKPRja96cpndMclLSi0Qrz2BXD6EbqNqCKMMjOWVm/BwAeXufFk2jqFsNmY07HOzU8X+8aTSVt3yrA==} + lit@2.7.2: dependencies: '@lit/reactive-element': 1.6.2 lit-element: 3.3.2 lit-html: 2.7.4 - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + loader-runner@4.3.0: {} - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: false - /loader-utils@3.2.1: - resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} - engines: {node: '>= 12.13.0'} - dev: false + loader-utils@3.2.1: {} - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} + local-pkg@0.4.3: {} - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - /lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: false + lodash.curry@4.1.1: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.debounce@4.0.8: {} - /lodash.flow@3.5.0: - resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} - dev: false + lodash.flow@3.5.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.merge@4.6.2: {} - /lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.truncate@4.4.2: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash.uniq@4.5.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 + loupe@2.3.6: dependencies: get-func-name: 2.0.0 - /lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - dev: true + lower-case@1.1.4: {} - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - - /lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - dev: false - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: false + lowercase-keys@1.0.1: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lowercase-keys@2.0.0: {} + + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - dev: true - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} + magic-string@0.27.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} + magic-string@0.30.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.1 - dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.0 - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - dev: true - /map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - dev: true + map-or-similar@1.5.0: {} - /markdown-escapes@1.0.4: - resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} - dev: false + markdown-escapes@1.0.4: {} - /markdown-to-jsx@7.2.0(react@18.2.0): - resolution: {integrity: sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg==} - engines: {node: '>= 10'} - peerDependencies: - react: '>= 0.14.0' + markdown-to-jsx@7.2.0(react@18.2.0): dependencies: react: 18.2.0 - dev: true - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} + md5-hex@3.0.1: dependencies: blueimp-md5: 2.19.0 - /mdast-squeeze-paragraphs@4.0.0: - resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==} + mdast-squeeze-paragraphs@4.0.0: dependencies: unist-util-remove: 2.1.0 - dev: false - /mdast-util-definitions@4.0.0: - resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + mdast-util-definitions@4.0.0: dependencies: unist-util-visit: 2.0.3 - /mdast-util-to-hast@10.0.1: - resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} + mdast-util-to-hast@10.0.1: dependencies: '@types/mdast': 3.0.11 '@types/unist': 2.0.6 @@ -13493,289 +17833,159 @@ packages: unist-util-generated: 1.1.6 unist-util-position: 3.1.0 unist-util-visit: 2.0.3 - dev: false - /mdast-util-to-string@1.1.0: - resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - dev: true + mdast-util-to-string@1.1.0: {} - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - dev: false + mdast-util-to-string@2.0.0: {} - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + mdn-data@2.0.14: {} - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - dev: false + mdurl@1.0.1: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@0.3.0: {} - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + memfs@3.5.3: dependencies: fs-monkey: 1.0.4 - dev: false - /memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + memoizerific@1.11.3: dependencies: map-or-similar: 1.5.0 - dev: true - /merge-anything@5.1.7: - resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} - engines: {node: '>=12.13'} + merge-anything@5.1.7: dependencies: is-what: 4.1.15 - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + methods@1.1.2: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db@1.33.0: - resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} - engines: {node: '>= 0.6'} - dev: false + mime-db@1.33.0: {} - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-types@2.1.18: - resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} - engines: {node: '>= 0.6'} + mime-types@2.1.18: dependencies: mime-db: 1.33.0 - dev: false - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime@1.6.0: {} - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true + mime@2.6.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + mimic-fn@4.0.0: {} - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: false + mimic-response@1.0.1: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false + mimic-response@3.1.0: {} - /mini-css-extract-plugin@2.7.6(webpack@5.88.0): - resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 + mini-css-extract-plugin@2.7.6(webpack@5.88.0): dependencies: schema-utils: 4.2.0 webpack: 5.88.0 - dev: false - /mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} - hasBin: true - dev: true + mini-svg-data-uri@1.4.4: {} - /minify-html-literals@1.3.5: - resolution: {integrity: sha512-p8T8ryePRR8FVfJZLVFmM53WY25FL0moCCTycUDuAu6rf9GMLwy0gNjXBGNin3Yun7Y+tIWd28axOf0t2EpAlQ==} + minify-html-literals@1.3.5: dependencies: '@types/html-minifier': 3.5.3 clean-css: 4.2.4 html-minifier: 4.0.0 magic-string: 0.25.9 parse-literals: 1.2.1 - dev: true - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: false + minimalistic-assert@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@5.0.0: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - /mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - dev: false + mitt@3.0.1: {} - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true + mkdirp-classic@0.5.3: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: true - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + mkdirp@1.0.4: {} - /mlly@1.3.0: - resolution: {integrity: sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==} + mlly@1.3.0: dependencies: acorn: 8.10.0 pathe: 1.1.0 pkg-types: 1.0.3 ufo: 1.1.2 - /mock-socket@9.2.1: - resolution: {integrity: sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag==} - engines: {node: '>= 8'} - dev: false + mock-socket@9.2.1: {} - /mock-socket@9.3.1: - resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==} - engines: {node: '>= 8'} - dev: false + mock-socket@9.3.1: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + mri@1.2.0: {} - /mrmime@1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} + mrmime@1.0.1: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.0.0: {} - /ms@2.1.1: - resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} - dev: true + ms@2.1.1: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.3: {} - /multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true + multicast-dns@7.2.5: dependencies: dns-packet: 5.6.0 thunky: 1.1.0 - dev: false - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanoid@3.3.6: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: false + natural-compare-lite@1.4.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-compare@1.4.0: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neo-async@2.6.2: {} - /next@13.4.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==} - engines: {node: '>=16.8.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - fibers: '>= 3.1.0' - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - fibers: - optional: true - sass: - optional: true + next@13.4.10(react-dom@18.2.0)(react@18.2.0): dependencies: '@next/env': 13.4.10 '@swc/helpers': 0.5.1 @@ -13800,24 +18010,17 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + no-case@2.3.2: dependencies: lower-case: 1.1.4 - dev: true - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: false - /nock@13.3.2: - resolution: {integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==} - engines: {node: '>= 10.13'} + nock@13.3.2: dependencies: debug: 4.3.4 json-stringify-safe: 5.0.1 @@ -13825,11 +18028,8 @@ packages: propagate: 2.0.1 transitivePeerDependencies: - supports-color - dev: false - /nock@13.3.4: - resolution: {integrity: sha512-DDpmn5oLEdCTclEqweOT4U7bEpuoifBMFUXem9sA4turDAZ5tlbrEoWqCorwXey8CaAw44mst5JOQeVNiwtkhw==} - engines: {node: '>= 10.13'} + nock@13.3.4: dependencies: debug: 4.3.4 json-stringify-safe: 5.0.1 @@ -13837,274 +18037,169 @@ packages: propagate: 2.0.1 transitivePeerDependencies: - supports-color - dev: false - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 - dev: true - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false + node-domexception@1.0.0: {} - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - dev: false - /node-fetch-native@1.1.1: - resolution: {integrity: sha512-9VvspTSUp2Sxbl+9vbZTlFGq9lHwE8GDVVekxx6YsNd1YH59sb3Ba8v3Y3cD8PkLNcileGGcA21PFjVl0jzDaw==} - dev: true + node-fetch-native@1.1.1: {} - /node-fetch@2.6.11: - resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.6.11: dependencies: whatwg-url: 5.0.0 - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - dev: false - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: false + node-forge@1.3.1: {} - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - hasBin: true + node-gyp-build@4.6.0: {} - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true + node-int64@0.4.0: {} - /node-localstorage@2.2.1: - resolution: {integrity: sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==} - engines: {node: '>=0.12'} + node-localstorage@2.2.1: dependencies: write-file-atomic: 1.3.4 - dev: false - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + node-releases@2.0.12: {} - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + nopt@5.0.0: dependencies: abbrev: 1.1.1 - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.2 semver: 5.7.1 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false + normalize-range@0.1.2: {} - /normalize-url@4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - dev: false + normalize-url@4.5.1: {} - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + normalize-url@6.1.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.1.0: dependencies: path-key: 4.0.0 - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - /nprogress@0.2.0: - resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} - dev: false + nprogress@0.2.0: {} - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: false + object-hash@3.0.0: {} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + object-inspect@1.12.3: {} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} + object-is@1.1.5: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - dev: true - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + object-keys@1.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.4: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: false - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} - engines: {node: '>= 0.4'} + object.entries@1.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: false - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: false - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + object.hasown@1.1.2: dependencies: define-properties: 1.2.0 es-abstract: 1.22.1 - dev: false - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} + object.values@1.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: false - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: false + obuf@1.1.2: {} - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + on-headers@1.0.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - /open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} + open@7.4.2: dependencies: is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@9.1.0: dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - /opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - dev: false + opener@1.5.2: {} - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} + optionator@0.9.1: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -14113,9 +18208,7 @@ packages: type-check: 0.4.0 word-wrap: 1.2.3 - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -14123,11 +18216,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: false - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -14138,133 +18228,83 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /p-cancelable@1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - dev: false + p-cancelable@1.1.0: {} - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: false + p-cancelable@2.1.1: {} - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true + p-finally@1.0.0: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} + p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 - dev: true - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + p-retry@4.6.2: dependencies: '@types/retry': 0.12.0 retry: 0.13.1 - dev: false - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-try@2.2.0: {} - /package-json@6.5.0: - resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} - engines: {node: '>=8'} + package-json@6.5.0: dependencies: got: 9.6.0 registry-auth-token: 4.2.2 registry-url: 5.1.0 semver: 6.3.0 - dev: false - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: true + pako@0.2.9: {} - /pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - requiresBuild: true - dev: false + pako@2.1.0: optional: true - /param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + param-case@2.1.1: dependencies: no-case: 2.3.2 - dev: true - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -14272,203 +18312,124 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: false - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.21.4 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-literals@1.2.1: - resolution: {integrity: sha512-Ml0w104Ph2wwzuRdxrg9booVWsngXbB4bZ5T2z6WyF8b5oaNkUmBiDtahi34yUIpXD8Y13JjAK6UyIyApJ73RQ==} + parse-literals@1.2.1: dependencies: typescript: 4.9.4 - dev: true - /parse-multipart-data@1.5.0: - resolution: {integrity: sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==} + parse-multipart-data@1.5.0: {} - /parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - dev: false + parse-numeric-range@1.3.0: {} - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse5-htmlparser2-tree-adapter@7.0.0: dependencies: domhandler: 5.0.3 parse5: 7.1.2 - dev: false - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false + parse5@6.0.1: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: false - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parseurl@1.3.3: {} - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: false + path-is-inside@1.0.2: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.7: {} - /path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + path-to-regexp@1.8.0: dependencies: isarray: 0.0.1 - dev: false - /path-to-regexp@2.2.1: - resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} - dev: false + path-to-regexp@2.2.1: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + pathe@1.1.0: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@1.1.1: {} - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 duplexify: 3.7.1 through2: 2.0.5 - dev: true - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true + pend@1.2.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false + pify@2.3.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true + pify@4.0.1: {} - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} + pirates@4.0.5: {} - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 - dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - /pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 - dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.0.3: dependencies: jsonc-parser: 3.2.0 mlly: 1.3.0 pathe: 1.1.0 - /pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} + pkg-up@3.1.0: dependencies: find-up: 3.0.0 - dev: false - /polished@4.2.2: - resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} - engines: {node: '>=10'} + polished@4.2.2: dependencies: '@babel/runtime': 7.22.3 - dev: true - /polka@1.0.0-next.22: - resolution: {integrity: sha512-a7tsZy5gFbJr0aUltZS97xCkbPglXuD67AMvTyZX7BTDBH384FWf0ZQF6rPvdutSxnO1vUlXM2zSLf5tCKk5RA==} - engines: {node: '>=8'} + polka@1.0.0-next.22: dependencies: '@polka/url': 1.0.0-next.21 trouter: 3.2.1 - /postcss-calc@8.2.4(postcss@8.4.24): - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 + postcss-calc@8.2.4(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - /postcss-colormin@5.3.1(postcss@8.4.24): - resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-colormin@5.3.1(postcss@8.4.24): dependencies: browserslist: 4.21.7 caniuse-api: 3.0.0 @@ -14476,84 +18437,46 @@ packages: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-convert-values@5.1.3(postcss@8.4.24): - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-convert-values@5.1.3(postcss@8.4.24): dependencies: browserslist: 4.21.7 postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-discard-comments@5.1.2(postcss@8.4.24): - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-comments@5.1.2(postcss@8.4.24): dependencies: postcss: 8.4.24 - /postcss-discard-duplicates@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-duplicates@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - /postcss-discard-empty@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-empty@5.1.1(postcss@8.4.24): dependencies: postcss: 8.4.24 - /postcss-discard-overridden@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-overridden@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - /postcss-discard-unused@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-discard-unused@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.13 - dev: false - /postcss-import@15.1.0(postcss@8.4.24): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 + postcss-import@15.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.2 - dev: false - /postcss-js@4.0.1(postcss@8.4.24): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 + postcss-js@4.0.1(postcss@8.4.24): dependencies: camelcase-css: 2.0.1 postcss: 8.4.24 - dev: false - /postcss-lit@1.1.0(postcss@8.4.24): - resolution: {integrity: sha512-JGrJOVKkSTOHp8dEooq+IzmwiLlx+v7muXXZIV59URcwCpTN53szlrmQA2i7r4cdFxTfPFXId5O0cWjEg6rkQQ==} - peerDependencies: - postcss: ^8.3.11 + postcss-lit@1.1.0(postcss@8.4.24): dependencies: '@babel/generator': 7.22.3 '@babel/parser': 7.22.4 @@ -14562,65 +18485,34 @@ packages: postcss: 8.4.24 transitivePeerDependencies: - supports-color - dev: false - /postcss-load-config@4.0.1(postcss@8.4.24): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.1(postcss@8.4.24): dependencies: lilconfig: 2.1.0 postcss: 8.4.24 yaml: 2.3.1 - dev: false - /postcss-loader@7.3.3(postcss@8.4.24)(webpack@5.88.0): - resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 + postcss-loader@7.3.3(postcss@8.4.24)(webpack@5.88.0): dependencies: cosmiconfig: 8.2.0 jiti: 1.18.2 postcss: 8.4.24 semver: 7.3.8 webpack: 5.88.0 - dev: false - /postcss-merge-idents@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-merge-idents@5.1.1(postcss@8.4.24): dependencies: cssnano-utils: 3.1.0(postcss@8.4.24) postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-merge-longhand@5.1.7(postcss@8.4.24): - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-merge-longhand@5.1.7(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 stylehacks: 5.1.1(postcss@8.4.24) - /postcss-merge-rules@5.1.4(postcss@8.4.24): - resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-merge-rules@5.1.4(postcss@8.4.24): dependencies: browserslist: 4.21.7 caniuse-api: 3.0.0 @@ -14628,423 +18520,249 @@ packages: postcss: 8.4.24 postcss-selector-parser: 6.0.13 - /postcss-minify-font-values@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-font-values@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-minify-gradients@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-gradients@5.1.1(postcss@8.4.24): dependencies: colord: 2.9.3 cssnano-utils: 3.1.0(postcss@8.4.24) postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-minify-params@5.1.4(postcss@8.4.24): - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-params@5.1.4(postcss@8.4.24): dependencies: browserslist: 4.21.7 cssnano-utils: 3.1.0(postcss@8.4.24) postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-minify-selectors@5.2.1(postcss@8.4.24): - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-minify-selectors@5.2.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.13 - /postcss-modules-extract-imports@3.0.0(postcss@8.4.24): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-extract-imports@3.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - /postcss-modules-local-by-default@4.0.3(postcss@8.4.24): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-local-by-default@4.0.3(postcss@8.4.24): dependencies: icss-utils: 5.1.0(postcss@8.4.24) postcss: 8.4.24 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - /postcss-modules-scope@3.0.0(postcss@8.4.24): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-scope@3.0.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.13 - /postcss-modules-values@4.0.0(postcss@8.4.24): - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + postcss-modules-values@4.0.0(postcss@8.4.24): dependencies: icss-utils: 5.1.0(postcss@8.4.24) postcss: 8.4.24 - /postcss-nested@6.0.1(postcss@8.4.24): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-nested@6.0.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.13 - dev: false - /postcss-normalize-charset@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-charset@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - /postcss-normalize-display-values@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-display-values@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-normalize-positions@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-positions@5.1.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-repeat-style@5.1.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-normalize-string@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-string@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-timing-functions@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-normalize-unicode@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-unicode@5.1.1(postcss@8.4.24): dependencies: browserslist: 4.21.7 postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-normalize-url@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-url@5.1.0(postcss@8.4.24): dependencies: normalize-url: 6.1.0 postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-normalize-whitespace@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-normalize-whitespace@5.1.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-ordered-values@5.1.3(postcss@8.4.24): - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-ordered-values@5.1.3(postcss@8.4.24): dependencies: cssnano-utils: 3.1.0(postcss@8.4.24) postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-reduce-idents@5.2.0(postcss@8.4.24): - resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-reduce-idents@5.2.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - dev: false - /postcss-reduce-initial@5.1.2(postcss@8.4.24): - resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-reduce-initial@5.1.2(postcss@8.4.24): dependencies: browserslist: 4.21.7 caniuse-api: 3.0.0 postcss: 8.4.24 - /postcss-reduce-transforms@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-reduce-transforms@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} + postcss-selector-parser@6.0.13: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-sort-media-queries@4.4.1(postcss@8.4.24): - resolution: {integrity: sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.4.16 + postcss-sort-media-queries@4.4.1(postcss@8.4.24): dependencies: postcss: 8.4.24 sort-css-media-queries: 2.1.0 - dev: false - /postcss-svgo@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-svgo@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-value-parser: 4.2.0 svgo: 2.8.0 - /postcss-unique-selectors@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-unique-selectors@5.1.1(postcss@8.4.24): dependencies: postcss: 8.4.24 postcss-selector-parser: 6.0.13 - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss-value-parser@4.2.0: {} - /postcss-zindex@5.1.0(postcss@8.4.24): - resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + postcss-zindex@5.1.0(postcss@8.4.24): dependencies: postcss: 8.4.24 - dev: false - /postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.14: dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false - /postcss@8.4.24: - resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.24: dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + prelude-ls@1.2.1: {} - /prepend-http@2.0.0: - resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} - engines: {node: '>=4'} - dev: false + prepend-http@2.0.0: {} - /prettier@2.8.0: - resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} - engines: {node: '>=10.13.0'} - dev: true + prettier@2.8.0: {} - /pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + pretty-error@4.0.0: dependencies: lodash: 4.17.21 renderkid: 3.0.0 - dev: false - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - /pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - dev: true - - /pretty-time@1.1.0: - resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} - engines: {node: '>=4'} - dev: false - - /prism-react-renderer@1.3.5(react@17.0.2): - resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} - peerDependencies: - react: '>=0.14.9' + pretty-hrtime@1.0.3: {} + + pretty-time@1.1.0: {} + + prism-react-renderer@1.3.5(react@17.0.2): dependencies: react: 17.0.2 - dev: false - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: false + prismjs@1.29.0: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-nextick-args@2.0.1: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true + process@0.11.10: {} - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + progress@2.0.3: {} - /promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + promise@7.3.1: dependencies: asap: 2.0.6 - dev: false - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /propagate@2.0.1: - resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} - engines: {node: '>= 8'} - dev: false + propagate@2.0.1: {} - /property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + property-information@5.6.0: dependencies: xtend: 4.0.2 - dev: false - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@1.1.0: {} - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + pump@2.0.1: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + pumpify@1.5.1: dependencies: duplexify: 3.7.1 inherits: 2.0.4 pump: 2.0.1 - dev: true - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: false + punycode@1.4.1: {} - /punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} - engines: {node: '>=6'} + punycode@2.1.1: {} - /pupa@2.1.1: - resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} - engines: {node: '>=8'} + pupa@2.1.1: dependencies: escape-goat: 2.1.1 - dev: false - /puppeteer-core@2.1.1: - resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} - engines: {node: '>=8.16.0'} + puppeteer-core@2.1.1: dependencies: '@types/mime-types': 2.1.1 debug: 4.3.4 @@ -15060,118 +18778,71 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /pure-color@1.3.0: - resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} - dev: false + pure-color@1.3.0: {} - /qrcode-generator@1.4.4: - resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} - dev: false + qrcode-generator@1.4.4: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + qs@6.11.0: dependencies: side-channel: 1.0.4 - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} + qs@6.11.2: dependencies: side-channel: 1.0.4 - dev: true - /query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} + query-string@7.1.3: dependencies: decode-uri-component: 0.2.2 filter-obj: 1.1.0 split-on-first: 1.1.0 strict-uri-encode: 2.0.0 - dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + queue@6.0.2: dependencies: inherits: 2.0.4 - dev: false - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: false + quick-lru@5.1.1: {} - /ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} - dev: true + ramda@0.29.0: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - /range-parser@1.2.0: - resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} - engines: {node: '>= 0.6'} - dev: false + range-parser@1.2.0: {} - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + range-parser@1.2.1: {} - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + raw-body@2.5.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: false - /react-base16-styling@0.6.0: - resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + react-base16-styling@0.6.0: dependencies: base16: 1.0.0 lodash.curry: 4.1.1 lodash.flow: 3.5.0 pure-color: 1.3.0 - dev: false - /react-colorful@5.6.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react-colorful@5.6.1(react-dom@18.2.0)(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /react-dev-utils@12.0.1(eslint@7.32.0)(typescript@4.9.4)(webpack@5.88.0): - resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=2.7' - webpack: '>=4' - peerDependenciesMeta: - typescript: - optional: true + react-dev-utils@12.0.1(eslint@7.32.0)(typescript@4.9.4)(webpack@5.88.0): dependencies: '@babel/code-frame': 7.21.4 address: 1.2.2 @@ -15203,39 +18874,25 @@ packages: - eslint - supports-color - vue-template-compiler - dev: false - /react-dom@17.0.2(react@17.0.2): - resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} - peerDependencies: - react: 17.0.2 + react-dom@17.0.2(react@17.0.2): dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react: 17.0.2 scheduler: 0.20.2 - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - /react-error-overlay@6.0.11: - resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} - dev: false + react-error-overlay@6.0.11: {} - /react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + react-fast-compare@3.2.2: {} - /react-helmet-async@1.3.0(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-helmet-async@1.3.0(react-dom@17.0.2)(react@17.0.2): dependencies: '@babel/runtime': 7.22.3 invariant: 2.2.4 @@ -15245,25 +18902,15 @@ packages: react-fast-compare: 3.2.2 shallowequal: 1.1.0 - /react-inspector@6.0.1(react@18.2.0): - resolution: {integrity: sha512-cxKSeFTf7jpSSVddm66sKdolG90qURAX3g1roTeaN6x0YEbtWc8JpmFN9+yIqLNH2uEkYerWLtJZIXRIFuBKrg==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 || ^18.0.0 + react-inspector@6.0.1(react@18.2.0): dependencies: react: 18.2.0 - dev: true - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@16.13.1: {} - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@17.0.2: {} - /react-json-view@1.21.3(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} - peerDependencies: - react: ^17.0.0 || ^16.3.0 || ^15.5.4 - react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-json-view@1.21.3(react-dom@17.0.2)(react@17.0.2): dependencies: flux: 4.0.4(react@17.0.2) react: 17.0.2 @@ -15274,39 +18921,22 @@ packages: transitivePeerDependencies: - '@types/react' - encoding - dev: false - /react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - dev: false + react-lifecycles-compat@3.0.4: {} - /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.0): - resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} - engines: {node: '>=10.13.0'} - peerDependencies: - react-loadable: '*' - webpack: '>=4.41.1 || 5.x' + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.0): dependencies: '@babel/runtime': 7.22.3 - react-loadable: /@docusaurus/react-loadable@5.5.2(react@17.0.2) + react-loadable: '@docusaurus/react-loadable@5.5.2(react@17.0.2)' webpack: 5.88.0 - dev: false - /react-router-config@5.1.1(react-router@5.3.4)(react@17.0.2): - resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} - peerDependencies: - react: '>=15' - react-router: '>=5' + react-router-config@5.1.1(react-router@5.3.4)(react@17.0.2): dependencies: '@babel/runtime': 7.22.3 react: 17.0.2 react-router: 5.3.4(react@17.0.2) - dev: false - /react-router-dom@5.3.4(react@17.0.2): - resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} - peerDependencies: - react: '>=15' + react-router-dom@5.3.4(react@17.0.2): dependencies: '@babel/runtime': 7.22.3 history: 4.10.1 @@ -15316,12 +18946,8 @@ packages: react-router: 5.3.4(react@17.0.2) tiny-invariant: 1.3.1 tiny-warning: 1.0.3 - dev: false - /react-router@5.3.4(react@17.0.2): - resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} - peerDependencies: - react: '>=15' + react-router@5.3.4(react@17.0.2): dependencies: '@babel/runtime': 7.22.3 history: 4.10.1 @@ -15333,13 +18959,8 @@ packages: react-is: 16.13.1 tiny-invariant: 1.3.1 tiny-warning: 1.0.3 - dev: false - /react-textarea-autosize@8.5.0(react@17.0.2): - resolution: {integrity: sha512-cp488su3U9RygmHmGpJp0KEt0i/+57KCK33XVPH+50swVRBhIZYh0fGduz2YLKXwl9vSKBZ9HUXcg9PQXUXqIw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-textarea-autosize@8.5.0(react@17.0.2): dependencies: '@babel/runtime': 7.22.3 react: 17.0.2 @@ -15347,48 +18968,34 @@ packages: use-latest: 1.2.1(react@17.0.2) transitivePeerDependencies: - '@types/react' - dev: false - /react@17.0.2: - resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} - engines: {node: '>=0.10.0'} + react@17.0.2: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-cache@1.0.0: dependencies: pify: 2.3.0 - dev: false - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.1 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -15398,95 +19005,64 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - dev: false + reading-time@1.5.0: {} - /recast@0.21.5: - resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} - engines: {node: '>= 4'} + recast@0.21.5: dependencies: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 - dev: true - /recast@0.23.2: - resolution: {integrity: sha512-Qv6cPfVZyMOtPszK6PgW70pUgm7gPlFitAPf0Q69rlOA0zLw2XdDcNmPbVGYicFGT9O8I7TZ/0ryJD+6COvIPw==} - engines: {node: '>= 4'} + recast@0.23.2: dependencies: assert: 2.0.0 ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 - dev: true - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + rechoir@0.6.2: dependencies: resolve: 1.22.2 - /recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} + recursive-readdir@2.2.3: dependencies: minimatch: 3.1.2 - dev: false - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.1.0: dependencies: regenerate: 1.4.2 - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerate@1.4.2: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regenerator-runtime@0.13.11: {} - /regenerator-transform@0.15.1: - resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + regenerator-transform@0.15.1: dependencies: '@babel/runtime': 7.22.3 - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.0: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 functions-have-names: 1.2.3 - dev: false - /regexparam@1.3.0: - resolution: {integrity: sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==} - engines: {node: '>=6'} + regexparam@1.3.0: {} - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} + regexpp@3.2.0: {} - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -15495,54 +19071,37 @@ packages: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - /registry-auth-token@4.2.2: - resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} - engines: {node: '>=6.0.0'} + registry-auth-token@4.2.2: dependencies: rc: 1.2.8 - dev: false - /registry-url@5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} - engines: {node: '>=8'} + registry-url@5.1.0: dependencies: rc: 1.2.8 - dev: false - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.9.1: dependencies: jsesc: 0.5.0 - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} + relateurl@0.2.7: {} - /remark-emoji@2.2.0: - resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==} + remark-emoji@2.2.0: dependencies: emoticon: 3.2.0 node-emoji: 1.11.0 unist-util-visit: 2.0.3 - dev: false - /remark-external-links@8.0.0: - resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + remark-external-links@8.0.0: dependencies: extend: 3.0.2 is-absolute-url: 3.0.3 mdast-util-definitions: 4.0.0 space-separated-tokens: 1.1.5 unist-util-visit: 2.0.3 - dev: true - /remark-footnotes@2.0.0: - resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} - dev: false + remark-footnotes@2.0.0: {} - /remark-mdx@1.6.22: - resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} + remark-mdx@1.6.22: dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.10.4 @@ -15554,10 +19113,8 @@ packages: unified: 9.2.0 transitivePeerDependencies: - supports-color - dev: false - /remark-parse@8.0.3: - resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==} + remark-parse@8.0.3: dependencies: ccount: 1.1.0 collapse-white-space: 1.0.6 @@ -15575,213 +19132,130 @@ packages: unist-util-remove-position: 2.0.1 vfile-location: 3.2.0 xtend: 4.0.2 - dev: false - /remark-slug@6.1.0: - resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + remark-slug@6.1.0: dependencies: github-slugger: 1.5.0 mdast-util-to-string: 1.1.0 unist-util-visit: 2.0.3 - dev: true - /remark-squeeze-paragraphs@4.0.0: - resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==} + remark-squeeze-paragraphs@4.0.0: dependencies: mdast-squeeze-paragraphs: 4.0.0 - dev: false - /renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + renderkid@3.0.0: dependencies: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 lodash: 4.17.21 strip-ansi: 6.0.1 - dev: false - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: false + repeat-string@1.6.1: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-from-string@2.0.2: {} - /require-like@0.1.2: - resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} - dev: false + require-like@0.1.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false + requires-port@1.0.0: {} - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: false + resolve-alpn@1.2.1: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolve-from@5.0.0: {} - /resolve-pathname@3.0.0: - resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} - dev: false + resolve-pathname@3.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false + resolve-pkg-maps@1.0.0: {} - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + resolve@1.22.1: dependencies: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true + resolve@1.22.2: dependencies: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true + resolve@2.0.0-next.4: dependencies: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false - /responselike@1.0.2: - resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + responselike@1.0.2: dependencies: lowercase-keys: 1.0.1 - dev: false - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 - dev: false - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: false + retry@0.13.1: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true + rimraf@2.6.3: dependencies: glob: 7.2.3 - dev: true - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true + rimraf@2.7.1: dependencies: glob: 7.2.3 - dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - /rollup-plugin-dts@5.3.0(rollup@3.23.1)(typescript@5.0.2): - resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==} - engines: {node: '>=v14'} - peerDependencies: - rollup: ^3.0.0 - typescript: ^4.1 || ^5.0 + rollup-plugin-dts@5.3.0(rollup@3.23.1)(typescript@5.0.2): dependencies: magic-string: 0.30.0 rollup: 3.23.1 typescript: 5.0.2 optionalDependencies: '@babel/code-frame': 7.21.4 - dev: true - /rollup-plugin-dts@5.3.0(rollup@3.23.1)(typescript@5.1.3): - resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==} - engines: {node: '>=v14'} - peerDependencies: - rollup: ^3.0.0 - typescript: ^4.1 || ^5.0 + rollup-plugin-dts@5.3.0(rollup@3.23.1)(typescript@5.1.3): dependencies: magic-string: 0.30.0 rollup: 3.23.1 typescript: 5.1.3 optionalDependencies: '@babel/code-frame': 7.21.4 - dev: true - /rollup-plugin-dts@5.3.0(rollup@3.23.1)(typescript@5.1.6): - resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==} - engines: {node: '>=v14'} - peerDependencies: - rollup: ^3.0.0 - typescript: ^4.1 || ^5.0 + rollup-plugin-dts@5.3.0(rollup@3.23.1)(typescript@5.1.6): dependencies: magic-string: 0.30.0 rollup: 3.23.1 typescript: 5.1.6 optionalDependencies: '@babel/code-frame': 7.21.4 - dev: true - /rollup-plugin-html-literals@1.1.6(rollup@3.23.1): - resolution: {integrity: sha512-pF2V4wE3qk+fQQboBw2hwnRaElr/QN3uYu4tBXvYXXWQor41/Xa8FYVpbuOZX57VJHAYZm+a2yLanFr+yo2GRw==} - peerDependencies: - rollup: ^1.x.x||^2.x.x||^3.x.x + rollup-plugin-html-literals@1.1.6(rollup@3.23.1): dependencies: '@rollup/pluginutils': 5.0.2(rollup@3.23.1) minify-html-literals: 1.3.5 rollup: 3.23.1 - dev: true - /rollup-plugin-lit-css@4.0.1(rollup@3.23.1): - resolution: {integrity: sha512-DgCypZzKNzERjwGK/kYVuAM/4lnw9VCO7x0FVgix8NV0pxL8cIswDdaaUECsanG79N2tUR4UcrC6YR/NiXHqcA==} + rollup-plugin-lit-css@4.0.1(rollup@3.23.1): dependencies: '@pwrs/lit-css': 2.0.0 '@rollup/pluginutils': 5.0.2(rollup@3.23.1) transitivePeerDependencies: - rollup - dev: true - /rollup-plugin-styles@4.0.0(rollup@3.23.1): - resolution: {integrity: sha512-A2K2sao84OsTmDxXG83JTCdXWrmgvQkkI38XDat46rdtpGMRm9tSYqeCdlwwGDJF4kKIafhV1mUidqu8MxUGig==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - rollup: ^2.63.0 + rollup-plugin-styles@4.0.0(rollup@3.23.1): dependencies: '@rollup/pluginutils': 4.2.1 '@types/cssnano': 5.1.0(postcss@8.4.24) @@ -15802,17 +19276,8 @@ packages: rollup: 3.23.1 source-map-js: 1.0.2 tslib: 2.6.2 - dev: true - /rollup-plugin-visualizer@5.9.2(rollup@3.23.1): - resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - rollup: 2.x || 3.x - peerDependenciesMeta: - rollup: - optional: true + rollup-plugin-visualizer@5.9.2(rollup@3.23.1): dependencies: open: 8.4.2 picomatch: 2.3.1 @@ -15820,28 +19285,18 @@ packages: source-map: 0.7.4 yargs: 17.7.2 - /rollup-route-manifest@1.0.0(rollup@3.23.1): - resolution: {integrity: sha512-3CmcMmCLAzJDUXiO3z6386/Pt8/k9xTZv8gIHyXI8hYGoAInnYdOsFXiGGzQRMy6TXR1jUZme2qbdwjH2nFMjg==} - engines: {node: '>=8'} - peerDependencies: - rollup: '>=2.0.0' + rollup-route-manifest@1.0.0(rollup@3.23.1): dependencies: rollup: 3.23.1 route-sort: 1.0.0 - /rollup@3.23.1: - resolution: {integrity: sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.23.1: optionalDependencies: fsevents: 2.3.2 - /route-sort@1.0.0: - resolution: {integrity: sha512-SFgmvjoIhp5S4iBEDW3XnbT+7PRuZ55oRuNjY+CDB1SGZkyCG9bqQ3/dhaZTctTBYMAvDxd2Uy9dStuaUfgJqQ==} - engines: {node: '>= 6'} + route-sort@1.0.0: {} - /rpc-websockets@7.5.1: - resolution: {integrity: sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w==} + rpc-websockets@7.5.1: dependencies: '@babel/runtime': 7.22.3 eventemitter3: 4.0.7 @@ -15850,180 +19305,117 @@ packages: optionalDependencies: bufferutil: 4.0.7 utf-8-validate: 5.0.10 - dev: false - /rtl-detect@1.0.4: - resolution: {integrity: sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==} - dev: false + rtl-detect@1.0.4: {} - /rtlcss@3.5.0: - resolution: {integrity: sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==} - hasBin: true + rtlcss@3.5.0: dependencies: find-up: 5.0.0 picocolors: 1.0.0 postcss: 8.4.24 strip-json-comments: 3.1.1 - dev: false - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + run-applescript@5.0.0: dependencies: execa: 5.1.1 - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + sade@1.8.1: dependencies: mri: 1.2.0 - /safe-array-concat@1.0.0: - resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} - engines: {node: '>=0.4'} + safe-array-concat@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 has-symbols: 1.0.3 isarray: 2.0.5 - dev: false - /safe-buffer@5.1.1: - resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} - dev: true + safe-buffer@5.1.1: {} - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 - dev: false - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: false + sax@1.2.4: {} - /scheduler@0.20.2: - resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + scheduler@0.20.2: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - /schema-utils@2.7.0: - resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} - engines: {node: '>= 8.9.0'} + schema-utils@2.7.0: dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - - /schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} + + schema-utils@2.7.1: dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} + schema-utils@4.2.0: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.2 ajv-formats: 2.1.1(ajv@8.11.2) ajv-keywords: 5.1.0(ajv@8.11.2) - dev: false - /search-insights@2.6.0: - resolution: {integrity: sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==} - engines: {node: '>=8.16.0'} - dev: false + search-insights@2.6.0: {} - /section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - dev: false - /select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: false + select-hose@2.0.0: {} - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} - engines: {node: '>=10'} + selfsigned@2.1.1: dependencies: node-forge: 1.3.1 - dev: false - /semver-diff@3.1.1: - resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} - engines: {node: '>=8'} + semver-diff@3.1.1: dependencies: semver: 6.3.0 - dev: false - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true + semver@5.7.1: {} - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true + semver@6.3.0: {} - /semver@7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true + semver@7.0.0: {} - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true + semver@7.3.8: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -16041,28 +19433,21 @@ packages: transitivePeerDependencies: - supports-color - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + serialize-javascript@6.0.1: dependencies: randombytes: 2.1.0 - /seroval@0.5.1: - resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} - engines: {node: '>=10'} + seroval@0.5.1: {} - /serve-favicon@2.5.0: - resolution: {integrity: sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==} - engines: {node: '>= 0.8.0'} + serve-favicon@2.5.0: dependencies: etag: 1.8.1 fresh: 0.5.2 ms: 2.1.1 parseurl: 1.3.3 safe-buffer: 5.1.1 - dev: true - /serve-handler@6.1.5: - resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} + serve-handler@6.1.5: dependencies: bytes: 3.0.0 content-disposition: 0.5.2 @@ -16072,11 +19457,8 @@ packages: path-is-inside: 1.0.2 path-to-regexp: 2.2.1 range-parser: 1.2.0 - dev: false - /serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + serve-index@1.9.1: dependencies: accepts: 1.3.8 batch: 0.6.1 @@ -16087,11 +19469,8 @@ packages: parseurl: 1.3.3 transitivePeerDependencies: - supports-color - dev: false - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -16100,184 +19479,121 @@ packages: transitivePeerDependencies: - supports-color - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-blocking@2.0.0: {} - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + set-cookie-parser@2.6.0: {} - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false + setimmediate@1.0.5: {} - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: false + setprototypeof@1.1.0: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + setprototypeof@1.2.0: {} - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + shallowequal@1.1.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: false + shell-quote@1.8.1: {} - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + shelljs@0.8.5: dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + siginfo@2.0.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /simple-update-notifier@1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} + simple-update-notifier@1.1.0: dependencies: semver: 7.0.0 - dev: true - /sirv@1.0.19: - resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} - engines: {node: '>= 10'} + sirv@1.0.19: dependencies: '@polka/url': 1.0.0-next.21 mrmime: 1.0.1 totalist: 1.1.0 - dev: false - /sirv@2.0.3: - resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} - engines: {node: '>= 10'} + sirv@2.0.3: dependencies: '@polka/url': 1.0.0-next.21 mrmime: 1.0.1 totalist: 3.0.1 - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sisteransi@1.0.5: {} - /sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true + sitemap@7.1.1: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.4 arg: 5.0.2 sax: 1.2.4 - dev: false - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: false + slash@4.0.0: {} - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - /slide@1.1.6: - resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} - dev: false + slide@1.1.6: {} - /smob@1.4.0: - resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} - dev: true + smob@1.4.0: {} - /smoldot@1.0.4: - resolution: {integrity: sha512-N3TazI1C4GGrseFH/piWyZCCCRJTRx2QhDfrUKRT4SzILlW5m8ayZ3QTKICcz1C/536T9cbHHJyP7afxI6Mi1A==} - requiresBuild: true + smoldot@1.0.4: dependencies: pako: 2.1.0 ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false optional: true - /smoldot@2.0.1: - resolution: {integrity: sha512-Wqw2fL/sELQByLSeeTX1Z/d0H4McmphPMx8vh6UZS/bIIDx81oU7s/drmx2iL/ME36uk++YxpRuJey8/MOyfOA==} - requiresBuild: true + smoldot@2.0.1: dependencies: ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false optional: true - /sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 websocket-driver: 0.7.4 - dev: false - /solid-js@1.7.2: - resolution: {integrity: sha512-01f8GIc+HTTlfDXtK+TFku3AllHyJ3hNsIpxM2qpObRP4VbEGVIP6VbULnThPlpse+J1y/I/1N9QeQ9MNkE8Ow==} + solid-js@1.7.2: dependencies: csstype: 3.1.2 seroval: 0.5.1 - /solid-refresh@0.5.3(solid-js@1.7.2): - resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==} - peerDependencies: - solid-js: ^1.3 + solid-refresh@0.5.3(solid-js@1.7.2): dependencies: '@babel/generator': 7.22.3 '@babel/helper-module-imports': 7.22.5 '@babel/types': 7.22.5 solid-js: 1.7.2 - /solid-start-node@0.2.19(solid-start@0.2.26)(undici@5.15.1)(vite@4.3.9): - resolution: {integrity: sha512-5Rtlh4PKm6zDuvFoPzf8xEzz5ca35uoyCeHbEqhcVnD9OqqhW8iKevaoNwlJ3Vm9yZHP53SWcS6F3e/KOnvBpA==} - peerDependencies: - solid-start: '*' - undici: ^5.8.0 - vite: '*' + solid-start-node@0.2.19(solid-start@0.2.26)(undici@5.15.1)(vite@4.3.9): dependencies: '@rollup/plugin-commonjs': 24.1.0(rollup@3.23.1) '@rollup/plugin-json': 6.0.0(rollup@3.23.1) @@ -16293,11 +19609,7 @@ packages: transitivePeerDependencies: - supports-color - /solid-start-vercel@0.2.26(solid-start@0.2.26)(vite@4.3.9): - resolution: {integrity: sha512-wSw2+P7xhAvh0+rgeogVl1PO052hgLbL7B//0JYnEd/M1eWSK0wcT0VgiExkbZUSouWQpLY1f0n1RYswBzpjWw==} - peerDependencies: - solid-start: '*' - vite: '*' + solid-start-vercel@0.2.26(solid-start@0.2.26)(vite@4.3.9): dependencies: '@rollup/plugin-commonjs': 24.1.0(rollup@3.23.1) '@rollup/plugin-json': 6.0.0(rollup@3.23.1) @@ -16313,39 +19625,7 @@ packages: - encoding - supports-color - /solid-start@0.2.26(@solidjs/meta@0.28.2)(@solidjs/router@0.8.2)(solid-js@1.7.2)(solid-start-node@0.2.19)(solid-start-vercel@0.2.26)(vite@4.3.9): - resolution: {integrity: sha512-kne2HZlnSMzsirdnvNs1CsDqBl0L0uvKKt1t4de1CH7JIngyqoMcER97jTE0Ejr84KknANaKAdvJAzZcL7Ueng==} - hasBin: true - peerDependencies: - '@solidjs/meta': ^0.28.0 - '@solidjs/router': ^0.8.2 - solid-js: ^1.6.2 - solid-start-aws: '*' - solid-start-cloudflare-pages: '*' - solid-start-cloudflare-workers: '*' - solid-start-deno: '*' - solid-start-netlify: '*' - solid-start-node: '*' - solid-start-static: '*' - solid-start-vercel: '*' - vite: ^4.1.4 - peerDependenciesMeta: - solid-start-aws: - optional: true - solid-start-cloudflare-pages: - optional: true - solid-start-cloudflare-workers: - optional: true - solid-start-deno: - optional: true - solid-start-netlify: - optional: true - solid-start-node: - optional: true - solid-start-static: - optional: true - solid-start-vercel: - optional: true + solid-start@0.2.26(@solidjs/meta@0.28.2)(@solidjs/router@0.8.2)(solid-js@1.7.2)(solid-start-node@0.2.19)(solid-start-vercel@0.2.26)(vite@4.3.9): dependencies: '@babel/core': 7.22.1 '@babel/generator': 7.22.3 @@ -16387,74 +19667,44 @@ packages: transitivePeerDependencies: - supports-color - /solid-toast@0.5.0(solid-js@1.7.2): - resolution: {integrity: sha512-t770JakjyS2P9b8Qa1zMLOD51KYKWXbTAyJePVUoYex5c5FH5S/HtUBUbZAWFcqRCKmAE8KhyIiCvDZA8bOnxQ==} - peerDependencies: - solid-js: ^1.5.4 + solid-toast@0.5.0(solid-js@1.7.2): dependencies: solid-js: 1.7.2 - dev: false - /sort-css-media-queries@2.1.0: - resolution: {integrity: sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==} - engines: {node: '>= 6.3.0'} - dev: false + sort-css-media-queries@2.1.0: {} - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + source-map-js@1.0.2: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.4: {} - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true + sourcemap-codec@1.4.8: {} - /space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + space-separated-tokens@1.1.5: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 - dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 - dev: true - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true + spdx-license-ids@3.0.13: {} - /spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + spdy-transport@3.0.0: dependencies: debug: 4.3.4 detect-node: 2.1.0 @@ -16464,11 +19714,8 @@ packages: wbuf: 1.7.3 transitivePeerDependencies: - supports-color - dev: false - /spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + spdy@4.0.2: dependencies: debug: 4.3.4 handle-thing: 2.0.1 @@ -16477,45 +19724,26 @@ packages: spdy-transport: 3.0.0 transitivePeerDependencies: - supports-color - dev: false - /split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} - dev: true + split-on-first@1.1.0: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + stable@0.1.8: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackback@0.0.2: {} - /state-toggle@1.0.3: - resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} - dev: false + state-toggle@1.0.3: {} - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + statuses@1.5.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + statuses@2.0.1: {} - /std-env@3.3.3: - resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + std-env@3.3.3: {} - /store2@2.14.2: - resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} - dev: true + store2@2.14.2: {} - /storybook@7.0.18: - resolution: {integrity: sha512-FXMmTiomSlLPTHty7vGLr0prPf6pCV07EwAmNOYYYTskitEYV0R7hlhawByd7HuobjIhHvSTKesa1Whl86zLNA==} - hasBin: true + storybook@7.0.18: dependencies: '@storybook/cli': 7.0.18 transitivePeerDependencies: @@ -16523,49 +19751,30 @@ packages: - encoding - supports-color - utf-8-validate - dev: true - /stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} - dev: true + stream-shift@1.0.1: {} - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + streamsearch@1.1.0: {} - /strict-event-emitter-types@2.0.0: - resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} - dev: false + strict-event-emitter-types@2.0.0: {} - /strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} - dev: true + strict-uri-encode@2.0.0: {} - /string-to-template-literal@2.0.0: - resolution: {integrity: sha512-AbTUWHXMyoRlTFP9qe013dfGTFq1XbcBLUoLC7PcumbJewtUwNXCvnko5cH2gZkUFC7kD2Fwxiv4YIndkU0xHA==} - engines: {node: '>=12.0.0'} - dev: true + string-to-template-literal@2.0.0: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: false - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + string.prototype.matchall@4.0.8: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -16575,134 +19784,79 @@ packages: internal-slot: 1.0.5 regexp.prototype.flags: 1.5.0 side-channel: 1.0.4 - dev: false - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: false - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + string.prototype.trimend@1.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: false - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + string.prototype.trimstart@1.0.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: false - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: false - /strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - dev: false + strip-bom-string@1.0.0: {} - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-final-newline@3.0.0: {} - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: false + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + strip-literal@1.0.1: dependencies: acorn: 8.10.0 - /style-to-object@0.3.0: - resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + style-to-object@0.3.0: dependencies: inline-style-parser: 0.1.1 - dev: false - /styled-jsx@5.1.1(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + styled-jsx@5.1.1(react@18.2.0): dependencies: client-only: 0.0.1 react: 18.2.0 - dev: false - /stylehacks@5.1.1(postcss@8.4.24): - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + stylehacks@5.1.1(postcss@8.4.24): dependencies: browserslist: 4.21.7 postcss: 8.4.24 postcss-selector-parser: 6.0.13 - /sucrase@3.32.0: - resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} - engines: {node: '>=8'} - hasBin: true + sucrase@3.32.0: dependencies: '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 @@ -16711,48 +19865,28 @@ packages: mz: 2.7.0 pirates: 4.0.5 ts-interface-checker: 0.1.13 - dev: false - /superstruct@0.14.2: - resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} - dev: false + superstruct@0.14.2: {} - /superstruct@1.0.3: - resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} - engines: {node: '>=14.0.0'} - dev: false + superstruct@1.0.3: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - requiresBuild: true + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - dev: false + svg-parser@2.0.4: {} - /svgo@2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} - hasBin: true + svgo@2.8.0: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 @@ -16762,21 +19896,14 @@ packages: picocolors: 1.0.0 stable: 0.1.8 - /synchronous-promise@2.0.17: - resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - dev: true + synchronous-promise@2.0.17: {} - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.5: dependencies: '@pkgr/utils': 2.4.2 tslib: 2.6.2 - dev: false - /table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} - engines: {node: '>=10.0.0'} + table@6.8.1: dependencies: ajv: 8.11.2 lodash.truncate: 4.4.2 @@ -16784,10 +19911,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /tailwindcss@3.3.2: - resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} - engines: {node: '>=14.0.0'} - hasBin: true + tailwindcss@3.3.2: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -16814,40 +19938,27 @@ packages: sucrase: 3.32.0 transitivePeerDependencies: - ts-node - dev: false - /tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: false + tapable@1.1.3: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + tapable@2.2.1: {} - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} - engines: {node: '>=10'} + tar@6.1.15: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -16856,50 +19967,25 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 - /telejson@7.1.0: - resolution: {integrity: sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA==} + telejson@7.1.0: dependencies: memoizerific: 1.11.3 - dev: true - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: true + temp-dir@2.0.0: {} - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} + temp@0.8.4: dependencies: rimraf: 2.6.3 - dev: true - - /tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} + + tempy@1.0.1: dependencies: del: 6.1.1 is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: true - /terser-webpack-plugin@5.3.9(webpack@5.88.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.9(webpack@5.88.0): dependencies: '@jridgewell/trace-mapping': 0.3.18 jest-worker: 27.5.1 @@ -16908,254 +19994,132 @@ packages: terser: 5.17.7 webpack: 5.88.0 - /terser@5.17.7: - resolution: {integrity: sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==} - engines: {node: '>=10'} - hasBin: true + terser@5.17.7: dependencies: '@jridgewell/source-map': 0.3.3 acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - dev: false + text-encoding-utf-8@1.0.2: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: false - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false + through@2.3.8: {} - /thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: false + thunky@1.1.0: {} - /time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} + time-zone@1.0.0: {} - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: false + tiny-invariant@1.3.1: {} - /tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - dev: false + tiny-warning@1.0.3: {} - /tinybench@2.5.0: - resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + tinybench@2.5.0: {} - /tinypool@0.5.0: - resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} - engines: {node: '>=14.0.0'} + tinypool@0.5.0: {} - /tinyspy@2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} - engines: {node: '>=14.0.0'} + tinyspy@2.1.0: {} - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} + titleize@3.0.0: {} - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true + tmpl@1.0.5: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-readable-stream@1.0.0: - resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} - engines: {node: '>=6'} - dev: false + to-readable-stream@1.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toidentifier@1.0.1: {} - /totalist@1.1.0: - resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} - engines: {node: '>=6'} - dev: false + totalist@1.1.0: {} - /totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + totalist@3.0.1: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@0.0.3: {} - /trim-trailing-lines@1.1.4: - resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} - dev: false + trim-trailing-lines@1.1.4: {} - /trim@0.0.1: - resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} - deprecated: Use String.prototype.trim() instead - dev: false + trim@0.0.1: {} - /trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - dev: false + trough@1.0.5: {} - /trouter@3.2.1: - resolution: {integrity: sha512-oY3CmIiEYOe1YMEzh++I67lrNOUldtCeuLL0vRPydvQLHZpSJ03B5dgDFlpFsiriMq6e//NDjjopjUzXOztHow==} - engines: {node: '>=6'} + trouter@3.2.1: dependencies: regexparam: 1.3.0 - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: true + ts-dedent@2.2.0: {} - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false + ts-interface-checker@0.1.13: {} - /tsconfck@2.1.1(typescript@4.9.4): - resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} - engines: {node: ^14.13.1 || ^16 || >=18} - hasBin: true - peerDependencies: - typescript: ^4.3.5 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true + tsconfck@2.1.1(typescript@4.9.4): dependencies: typescript: 4.9.4 - dev: false - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false + tslib@1.14.1: {} - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + tslib@2.5.3: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tsutils@3.21.0(typescript@4.9.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsutils@3.21.0(typescript@4.9.4): dependencies: tslib: 1.14.1 typescript: 4.9.4 - dev: false - /tsutils@3.21.0(typescript@5.1.6): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsutils@3.21.0(typescript@5.1.6): dependencies: tslib: 1.14.1 typescript: 5.1.6 - dev: false - /turbo-darwin-64@1.10.7: - resolution: {integrity: sha512-N2MNuhwrl6g7vGuz4y3fFG2aR1oCs0UZ5HKl8KSTn/VC2y2YIuLGedQ3OVbo0TfEvygAlF3QGAAKKtOCmGPNKA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + turbo-darwin-64@1.10.7: optional: true - /turbo-darwin-arm64@1.10.7: - resolution: {integrity: sha512-WbJkvjU+6qkngp7K4EsswOriO3xrNQag7YEGRtfLoDdMTk4O4QTeU6sfg2dKfDsBpTidTvEDwgIYJhYVGzrz9Q==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + turbo-darwin-arm64@1.10.7: optional: true - /turbo-linux-64@1.10.7: - resolution: {integrity: sha512-x1CF2CDP1pDz/J8/B2T0hnmmOQI2+y11JGIzNP0KtwxDM7rmeg3DDTtDM/9PwGqfPotN9iVGgMiMvBuMFbsLhg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-64@1.10.7: optional: true - /turbo-linux-arm64@1.10.7: - resolution: {integrity: sha512-JtnBmaBSYbs7peJPkXzXxsRGSGBmBEIb6/kC8RRmyvPAMyqF8wIex0pttsI+9plghREiGPtRWv/lfQEPRlXnNQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + turbo-linux-arm64@1.10.7: optional: true - /turbo-windows-64@1.10.7: - resolution: {integrity: sha512-7A/4CByoHdolWS8dg3DPm99owfu1aY/W0V0+KxFd0o2JQMTQtoBgIMSvZesXaWM57z3OLsietFivDLQPuzE75w==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + turbo-windows-64@1.10.7: optional: true - /turbo-windows-arm64@1.10.7: - resolution: {integrity: sha512-D36K/3b6+hqm9IBAymnuVgyePktwQ+F0lSXr2B9JfAdFPBktSqGmp50JNC7pahxhnuCLj0Vdpe9RqfnJw5zATA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + turbo-windows-arm64@1.10.7: optional: true - /turbo@1.10.7: - resolution: {integrity: sha512-xm0MPM28TWx1e6TNC3wokfE5eaDqlfi0G24kmeHupDUZt5Wd0OzHFENEHMPqEaNKJ0I+AMObL6nbSZonZBV2HA==} - hasBin: true - requiresBuild: true + turbo@1.10.7: optionalDependencies: turbo-darwin-64: 1.10.7 turbo-darwin-arm64: 1.10.7 @@ -17163,191 +20127,111 @@ packages: turbo-linux-arm64: 1.10.7 turbo-windows-64: 1.10.7 turbo-windows-arm64: 1.10.7 - dev: true - /tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + tweetnacl@1.0.3: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + type-detect@4.0.8: {} - /type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - dev: true + type-fest@0.16.0: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + type-fest@0.20.2: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + type-fest@2.19.0: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.10 - dev: false - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.2 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.10 - dev: false - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.0: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.10 - dev: false - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.4: dependencies: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.10 - dev: false - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: false - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true + typedarray@0.0.6: {} - /typescript@4.9.4: - resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} - engines: {node: '>=4.2.0'} - hasBin: true + typescript@4.9.4: {} - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true + typescript@5.0.2: {} - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.1.3: {} - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.1.6: {} - /ua-parser-js@1.0.35: - resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} - dev: false + ua-parser-js@1.0.35: {} - /ufo@1.1.2: - resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + ufo@1.1.2: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.17.4: {} - /uglifycss@0.0.29: - resolution: {integrity: sha512-J2SQ2QLjiknNGbNdScaNZsXgmMGI0kYNrXaDlr4obnPW9ni1jljb1NeEVWAiTgZ8z+EBWP2ozfT9vpy03rjlMQ==} - engines: {node: '>=6.4.0'} - hasBin: true - dev: true + uglifycss@0.0.29: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: false - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /undici@5.15.1: - resolution: {integrity: sha512-XLk8g0WAngdvFqTI+VKfBtM4YWXgdxkf1WezC771Es0Dd+Pm1KmNx8t93WTC+Hh9tnghmVxkclU1HN+j+CvIUA==} - engines: {node: '>=12.18'} + undici@5.15.1: dependencies: busboy: 1.6.0 - /unfetch@4.2.0: - resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - dev: true + unfetch@4.2.0: {} - /unherit@1.1.3: - resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} + unherit@1.1.3: dependencies: inherits: 2.0.4 xtend: 4.0.2 - dev: false - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} + unicode-canonical-property-names-ecmascript@2.0.0: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + unicode-property-aliases-ecmascript@2.1.0: {} - /unified@9.2.0: - resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} + unified@9.2.0: dependencies: '@types/unist': 2.0.6 bail: 1.0.5 @@ -17356,10 +20240,8 @@ packages: is-plain-obj: 2.1.0 trough: 1.0.5 vfile: 4.2.1 - dev: false - /unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + unified@9.2.2: dependencies: '@types/unist': 2.0.6 bail: 1.0.5 @@ -17368,94 +20250,62 @@ packages: is-plain-obj: 2.1.0 trough: 1.0.5 vfile: 4.2.1 - dev: false - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - /unist-builder@2.0.3: - resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} - dev: false + unist-builder@2.0.3: {} - /unist-util-generated@1.1.6: - resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} - dev: false + unist-util-generated@1.1.6: {} - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + unist-util-is@4.1.0: {} - /unist-util-position@3.1.0: - resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} - dev: false + unist-util-position@3.1.0: {} - /unist-util-remove-position@2.0.1: - resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} + unist-util-remove-position@2.0.1: dependencies: unist-util-visit: 2.0.3 - dev: false - /unist-util-remove@2.1.0: - resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} + unist-util-remove@2.1.0: dependencies: unist-util-is: 4.1.0 - dev: false - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.6 - dev: false - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@3.1.1: dependencies: '@types/unist': 2.0.6 unist-util-is: 4.1.0 - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit@2.0.3: dependencies: '@types/unist': 2.0.6 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} + universalify@2.0.0: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + unpipe@1.0.0: {} - /unplugin@0.10.2: - resolution: {integrity: sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==} + unplugin@0.10.2: dependencies: acorn: 8.10.0 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.4.6 - dev: true - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + untildify@4.0.0: {} - /update-browserslist-db@1.0.11(browserslist@4.21.7): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.11(browserslist@4.21.7): dependencies: browserslist: 4.21.7 escalade: 3.1.1 picocolors: 1.0.0 - /update-notifier@5.1.0: - resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} - engines: {node: '>=10'} + update-notifier@5.1.0: dependencies: boxen: 5.1.2 chalk: 4.1.2 @@ -17471,179 +20321,100 @@ packages: semver: 7.3.8 semver-diff: 3.1.1 xdg-basedir: 4.0.0 - dev: false - /upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - dev: true + upper-case@1.1.3: {} - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.1.1 - /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.88.0): - resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - file-loader: '*' - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true + url-loader@4.1.1(file-loader@6.2.0)(webpack@5.88.0): dependencies: file-loader: 6.2.0(webpack@5.88.0) loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 webpack: 5.88.0 - dev: false - /url-parse-lax@3.0.0: - resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} - engines: {node: '>=4'} + url-parse-lax@3.0.0: dependencies: prepend-http: 2.0.0 - dev: false - /use-composed-ref@1.3.0(react@17.0.2): - resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-composed-ref@1.3.0(react@17.0.2): dependencies: react: 17.0.2 - dev: false - /use-isomorphic-layout-effect@1.1.2(react@17.0.2): - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-isomorphic-layout-effect@1.1.2(react@17.0.2): dependencies: react: 17.0.2 - dev: false - /use-latest@1.2.1(react@17.0.2): - resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-latest@1.2.1(react@17.0.2): dependencies: react: 17.0.2 use-isomorphic-layout-effect: 1.1.2(react@17.0.2) - dev: false - /use-resize-observer@9.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} - peerDependencies: - react: 16.8.0 - 18 - react-dom: 16.8.0 - 18 + use-resize-observer@9.1.0(react-dom@18.2.0)(react@18.2.0): dependencies: '@juggle/resize-observer': 3.4.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /use-sync-external-store@1.2.0(react@17.0.2): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.2.0(react@17.0.2): dependencies: react: 17.0.2 - dev: false - /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - requiresBuild: true + utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.6.0 - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + util@0.12.5: dependencies: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.10 which-typed-array: 1.1.10 - dev: true - /utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: false + utila@0.4.0: {} - /utility-types@3.10.0: - resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} - engines: {node: '>= 4'} + utility-types@3.10.0: {} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + utils-merge@1.0.1: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false + uuid@8.3.2: {} - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true + uuid@9.0.0: {} - /v8-compile-cache@2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + v8-compile-cache@2.3.0: {} - /validate-html-nesting@1.2.2: - resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + validate-html-nesting@1.2.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /value-equal@1.0.1: - resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} - dev: false + value-equal@1.0.1: {} - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: {} - /vfile-location@3.2.0: - resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} - dev: false + vfile-location@3.2.0: {} - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.6 unist-util-stringify-position: 2.0.3 - dev: false - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + vfile@4.2.1: dependencies: '@types/unist': 2.0.6 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - dev: false - /vite-node@0.31.1(@types/node@20.9.0): - resolution: {integrity: sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA==} - engines: {node: '>=v14.18.0'} - hasBin: true + vite-node@0.31.1(@types/node@20.9.0): dependencies: cac: 6.7.14 debug: 4.3.4 @@ -17657,14 +20428,10 @@ packages: - sass - stylus - sugarss - - supports-color - - terser - - /vite-plugin-inspect@0.7.28(rollup@3.23.1)(vite@4.3.9): - resolution: {integrity: sha512-XRdQGdf+PU6eT0EoL8beUyFQfcCrHr06OyRM71IT8t7rEC9JywdsscehGHEAyFZryfaVBWAI280N63BI2N+1BA==} - engines: {node: '>=14'} - peerDependencies: - vite: ^3.1.0 || ^4.0.0 + - supports-color + - terser + + vite-plugin-inspect@0.7.28(rollup@3.23.1)(vite@4.3.9): dependencies: '@antfu/utils': 0.7.4 '@rollup/pluginutils': 5.0.2(rollup@3.23.1) @@ -17678,11 +20445,7 @@ packages: - rollup - supports-color - /vite-plugin-solid@2.7.0(solid-js@1.7.2)(vite@4.3.9): - resolution: {integrity: sha512-avp/Jl5zOp/Itfo67xtDB2O61U7idviaIp4mLsjhCa13PjKNasz+IID0jYTyqUp9SFx6/PmBr6v4KgDppqompg==} - peerDependencies: - solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 + vite-plugin-solid@2.7.0(solid-js@1.7.2)(vite@4.3.9): dependencies: '@babel/core': 7.22.1 '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1) @@ -17696,13 +20459,7 @@ packages: transitivePeerDependencies: - supports-color - /vite-tsconfig-paths@4.2.0(typescript@4.9.4)(vite@4.0.3): - resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true + vite-tsconfig-paths@4.2.0(typescript@4.9.4)(vite@4.0.3): dependencies: debug: 4.3.4 globrex: 0.1.2 @@ -17711,32 +20468,8 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: false - /vite@4.0.3(@types/node@20.9.0): - resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.0.3(@types/node@20.9.0): dependencies: '@types/node': 20.9.0 esbuild: 0.16.10 @@ -17745,32 +20478,8 @@ packages: rollup: 3.23.1 optionalDependencies: fsevents: 2.3.2 - dev: false - /vite@4.3.9(@types/node@18.11.18): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.3.9(@types/node@18.11.18): dependencies: '@types/node': 18.11.18 esbuild: 0.17.19 @@ -17779,30 +20488,7 @@ packages: optionalDependencies: fsevents: 2.3.2 - /vite@4.3.9(@types/node@20.9.0): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.3.9(@types/node@20.9.0): dependencies: '@types/node': 20.9.0 esbuild: 0.17.19 @@ -17811,46 +20497,11 @@ packages: optionalDependencies: fsevents: 2.3.2 - /vitefu@0.2.4(vite@4.3.9): - resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 - peerDependenciesMeta: - vite: - optional: true + vitefu@0.2.4(vite@4.3.9): dependencies: vite: 4.3.9(@types/node@18.11.18) - /vitest@0.31.1(@vitest/ui@0.31.1): - resolution: {integrity: sha512-/dOoOgzoFk/5pTvg1E65WVaobknWREN15+HF+0ucudo3dDG/vCZoXTQrjIfEaWvQXmqScwkRodrTbM/ScMpRcQ==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true + vitest@0.31.1(@vitest/ui@0.31.1): dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 @@ -17886,10 +20537,7 @@ packages: - supports-color - terser - /wait-on@6.0.1(debug@4.3.4): - resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} - engines: {node: '>=10.0.0'} - hasBin: true + wait-on@6.0.1(debug@4.3.4): dependencies: axios: 0.25.0(debug@4.3.4) joi: 17.9.2 @@ -17899,47 +20547,30 @@ packages: transitivePeerDependencies: - debug - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + walker@1.0.8: dependencies: makeerror: 1.0.12 - dev: true - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - /wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + wbuf@1.7.3: dependencies: minimalistic-assert: 1.0.1 - dev: false - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /web-namespaces@1.1.4: - resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} - dev: false + web-namespaces@1.1.4: {} - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: false + web-streams-polyfill@3.2.1: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webpack-bundle-analyzer@4.9.0: - resolution: {integrity: sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==} - engines: {node: '>= 10.13.0'} - hasBin: true + webpack-bundle-analyzer@4.9.0: dependencies: '@discoveryjs/json-ext': 0.5.7 acorn: 8.10.0 @@ -17954,13 +20585,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /webpack-dev-middleware@5.3.3(webpack@5.88.0): - resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack-dev-middleware@5.3.3(webpack@5.88.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -17968,20 +20594,8 @@ packages: range-parser: 1.2.1 schema-utils: 4.2.0 webpack: 5.88.0 - dev: false - /webpack-dev-server@4.15.1(webpack@5.88.0): - resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true + webpack-dev-server@4.15.1(webpack@5.88.0): dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.5.0 @@ -18019,32 +20633,17 @@ packages: - debug - supports-color - utf-8-validate - dev: false - /webpack-merge@5.9.0: - resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} - engines: {node: '>=10.0.0'} + webpack-merge@5.9.0: dependencies: clone-deep: 4.0.1 wildcard: 2.0.1 - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + webpack-sources@3.2.3: {} - /webpack-virtual-modules@0.4.6: - resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==} - dev: true + webpack-virtual-modules@0.4.6: {} - /webpack@5.88.0: - resolution: {integrity: sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.88.0: dependencies: '@types/eslint-scope': 3.7.4 '@types/estree': 1.0.1 @@ -18075,60 +20674,40 @@ packages: - esbuild - uglify-js - /webpackbar@5.0.2(webpack@5.88.0): - resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} - engines: {node: '>=12'} - peerDependencies: - webpack: 3 || 4 || 5 + webpackbar@5.0.2(webpack@5.88.0): dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.3.3 webpack: 5.88.0 - dev: false - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + websocket-driver@0.7.4: dependencies: http-parser-js: 0.5.8 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 - dev: false - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: false + websocket-extensions@0.1.4: {} - /well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} + well-known-symbols@2.0.0: {} - /whatwg-fetch@3.6.2: - resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} - dev: false + whatwg-fetch@3.6.2: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: false - /which-typed-array@1.1.10: - resolution: {integrity: sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.10: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -18137,194 +20716,107 @@ packages: has-tostringtag: 1.0.0 is-typed-array: 1.1.10 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: false - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + widest-line@3.1.0: dependencies: string-width: 4.2.3 - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: false - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + wildcard@2.0.1: {} - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} + word-wrap@1.2.3: {} - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + wordwrap@1.0.0: {} - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: false - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@1.3.4: - resolution: {integrity: sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==} + write-file-atomic@1.3.4: dependencies: graceful-fs: 4.2.11 imurmurhash: 0.1.4 slide: 1.1.6 - dev: false - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + write-file-atomic@2.4.3: dependencies: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: false - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /ws@6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@6.2.2: dependencies: async-limiter: 1.0.1 - dev: true - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@7.5.9: {} - /ws@8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@8.14.2(bufferutil@4.0.7)(utf-8-validate@5.0.10): dependencies: bufferutil: 4.0.7 utf-8-validate: 5.0.10 - /xdg-basedir@4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} - dev: false + xdg-basedir@4.0.0: {} - /xml-js@1.6.11: - resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} - hasBin: true + xml-js@1.6.11: dependencies: sax: 1.2.4 - dev: false - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + yaml@1.10.2: {} - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: false + yaml@2.3.1: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -18334,25 +20826,15 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} + yocto-queue@1.0.0: {} - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - dev: false + zod@3.21.4: {} - /zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - dev: false + zwitch@1.0.5: {} diff --git a/sdk/rebuild-bindings.sh b/sdk/rebuild-bindings.sh new file mode 100644 index 00000000..f601d983 --- /dev/null +++ b/sdk/rebuild-bindings.sh @@ -0,0 +1,34 @@ +echo 'Navigating to project root...' +cd .. + +echo 'Deleting existing bindings directories...' +rm -rf server/bindings +rm -rf database/bindings +rm -rf sdk/bindings + +echo 'Running cargo tests to recreate bindings...' +cargo test + +echo 'Creating new bindings directory in sdk...' +mkdir -p sdk/bindings + +echo 'Copying bindings from server and database to sdk...' +cp -r server/bindings/* sdk/bindings/ +cp -r database/bindings/* sdk/bindings/ + +echo 'Generating index.ts for bindings...' +cd sdk/bindings + +rm -f index.ts + +echo "// This file was auto-generated by bindings script. Do not edit this file manually." > index.ts + +for file in *.ts; do + if [ "$file" != "index.ts" ]; then + echo "export * from './${file%.*}';" >> index.ts + fi +done + +cd ../.. + +echo 'Operation completed successfully.' \ No newline at end of file diff --git a/server/Cargo.toml b/server/Cargo.toml index 532127ef..c0bd8c36 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -6,7 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -database = { path = "../database"} +database = { path = "../database" } +openapi = { path = "../openapi" } serde = { workspace = true } tokio = { workspace = true } @@ -32,6 +33,13 @@ pwhash = { workspace = true } rand = { workspace = true } garde = { workspace = true } sqlx = { workspace = true } +r-cache = { workspace = true } +lettre = { workspace = true } +addr = { workspace = true } +hickory-resolver = { workspace = true } +webauthn-rs = { workspace = true } +sha256 = { workspace = true } +configparser = { workspace = true } [features] -cloud_db_tests = [] \ No newline at end of file +cloud_integration_tests = [] diff --git a/server/bindings/AppInfo.ts b/server/bindings/AppInfo.ts index 93723b88..1efbf661 100644 --- a/server/bindings/AppInfo.ts +++ b/server/bindings/AppInfo.ts @@ -1,3 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { WhitelistedDomain } from "./WhitelistedDomain"; -export interface AppInfo { teamId: string, appId: string, appName: string, registeredAt: string, whitelistedDomains: Array, ackPublicKeys: Array, } \ No newline at end of file +export interface AppInfo { teamId: string, appId: string, appName: string, registeredAt: string, whitelistedDomains: Array, ackPublicKeys: Array, } \ No newline at end of file diff --git a/server/bindings/ChangeNetworkResolveEvent.ts b/server/bindings/ChangeNetworkResolveEvent.ts index 9912ea45..d5a9074d 100644 --- a/server/bindings/ChangeNetworkResolveEvent.ts +++ b/server/bindings/ChangeNetworkResolveEvent.ts @@ -1,4 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { RequestFail } from "./RequestFail"; -export interface ChangeNetworkResolveEvent { sessionId: string, requestId: string, newNetwork: string | null, failureReason?: RequestFail, } \ No newline at end of file +export interface ChangeNetworkResolveEvent { sessionId: string, requestId: string, newNetwork?: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/server/bindings/CloudApiErrors.ts b/server/bindings/CloudApiErrors.ts index 8e1a4cc5..3b03285e 100644 --- a/server/bindings/CloudApiErrors.ts +++ b/server/bindings/CloudApiErrors.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export type CloudApiErrors = "TeamDoesNotExist" | "UserDoesNotExist" | "CloudFeatureDisabled" | "InsufficientPermissions" | "TeamHasNoRegisteredApps" | "DatabaseError" | "MaximumUsersPerTeamReached" | "UserAlreadyBelongsToTheTeam" | "IncorrectPassword" | "AccessTokenFailure" | "RefreshTokenFailure" | "AppAlreadyExists" | "MaximumAppsPerTeamReached" | "TeamAlreadyExists" | "PersonalTeamAlreadyExists" | "EmailAlreadyExists" | "InternalServerError" | "UserDoesNotBelongsToTheTeam" | "InvalidName" | "UnauthorizedOriginError" | "AppDoesNotExist" | "UserAlreadyInvitedToTheTeam" | "MaximumInvitesPerTeamReached" | "InviteNotFound" | "ActionForbiddenForPersonalTeam" | "InviteDoesNotExist" | "InvalidPaginationCursor"; \ No newline at end of file +export type CloudApiErrors = "TeamDoesNotExist" | "UserDoesNotExist" | "CloudFeatureDisabled" | "InsufficientPermissions" | "TeamHasNoRegisteredApps" | "DatabaseError" | "MaximumUsersPerTeamReached" | "UserAlreadyBelongsToTheTeam" | "IncorrectPassword" | "AccessTokenFailure" | "RefreshTokenFailure" | "AppAlreadyExists" | "MaximumAppsPerTeamReached" | "TeamAlreadyExists" | "PersonalTeamAlreadyExists" | "EmailAlreadyExists" | "InternalServerError" | "UserDoesNotBelongsToTheTeam" | "InvalidName" | "UnauthorizedOriginError" | "AppDoesNotExist" | "UserAlreadyInvitedToTheTeam" | "MaximumInvitesPerTeamReached" | "InviteNotFound" | "ActionForbiddenForPersonalTeam" | "InviteDoesNotExist" | "InvalidPaginationCursor" | "InvalidOrExpiredVerificationCode" | "InvalidOrExpiredAuthCode" | "InvalidDomainName" | "DomainAlreadyVerified" | "DomainVerificationFailure" | "DomainNotFound" | "DomainVerificationNotStarted" | "DomainAlreadyVerifiedByAnotherApp" | "NoPendingDomainVerification" | "WebAuthnError" | "PasswordNotSet" | "UserDoesNotHavePasskey" | "PasskeyAlreadyExists" | "InvalidPasskeyCredential" | "PasskeyDoesNotExist" | "FailedToCreateTeam" | "DashboardImportFail" | "OriginHeaderRequired" | "InvalidOrigin" | "InvalidAction" | "AdminCannotLeaveTeam" | "GrafanaError" | "TeamWithoutGrafanaId" | "UserDoesNotExistInGrafana"; \ No newline at end of file diff --git a/server/bindings/EventData.ts b/server/bindings/EventData.ts index 772506a2..cc8c85b1 100644 --- a/server/bindings/EventData.ts +++ b/server/bindings/EventData.ts @@ -2,7 +2,9 @@ import type { AppConnectEvent } from "./AppConnectEvent"; import type { AppDisconnectEvent } from "./AppDisconnectEvent"; import type { ChangeNetworkEvent } from "./ChangeNetworkEvent"; +import type { ChangeNetworkResolveEvent } from "./ChangeNetworkResolveEvent"; import type { ChangeWalletEvent } from "./ChangeWalletEvent"; +import type { ChangeWalletResolveEvent } from "./ChangeWalletResolveEvent"; import type { ClientConnectEvent } from "./ClientConnectEvent"; import type { ClientConnectResolveEvent } from "./ClientConnectResolveEvent"; import type { ClientDisconnectEvent } from "./ClientDisconnectEvent"; @@ -13,4 +15,4 @@ import type { SignMessageResolveEvent } from "./SignMessageResolveEvent"; import type { SignTransactionEvent } from "./SignTransactionEvent"; import type { SignTransactionResolveEvent } from "./SignTransactionResolveEvent"; -export type EventData = { type: "AppConnect" } & AppConnectEvent | { type: "AppDisconnect" } & AppDisconnectEvent | { type: "ClientConnect" } & ClientConnectEvent | { type: "ClientConnectResolve" } & ClientConnectResolveEvent | { type: "ClientDisconnect" } & ClientDisconnectEvent | { type: "SignMessage" } & SignMessageEvent | { type: "SignMessageResolve" } & SignMessageResolveEvent | { type: "SignTransaction" } & SignTransactionEvent | { type: "SignTransactionResolve" } & SignTransactionResolveEvent | { type: "SignAndSendTransaction" } & SignAndSendTransactionEvent | { type: "SignAndSendTransactionResolve" } & SignAndSendTransactionResolveEvent | { type: "ChangeNetwork" } & ChangeNetworkEvent | { type: "ChangeWallet" } & ChangeWalletEvent; \ No newline at end of file +export type EventData = { type: "AppConnect" } & AppConnectEvent | { type: "AppDisconnect" } & AppDisconnectEvent | { type: "ClientConnect" } & ClientConnectEvent | { type: "ClientConnectResolve" } & ClientConnectResolveEvent | { type: "ClientDisconnect" } & ClientDisconnectEvent | { type: "SignMessage" } & SignMessageEvent | { type: "SignMessageResolve" } & SignMessageResolveEvent | { type: "SignTransaction" } & SignTransactionEvent | { type: "SignTransactionResolve" } & SignTransactionResolveEvent | { type: "SignAndSendTransaction" } & SignAndSendTransactionEvent | { type: "SignAndSendTransactionResolve" } & SignAndSendTransactionResolveEvent | { type: "ChangeNetwork" } & ChangeNetworkEvent | { type: "ChangeNetworkResolve" } & ChangeNetworkResolveEvent | { type: "ChangeWallet" } & ChangeWalletEvent | { type: "ChangeWalletResolve" } & ChangeWalletResolveEvent; \ No newline at end of file diff --git a/server/bindings/HttpAddPasskeyFinishResponse.ts b/server/bindings/HttpAddPasskeyFinishResponse.ts new file mode 100644 index 00000000..0595e675 --- /dev/null +++ b/server/bindings/HttpAddPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpAddPasskeyFinishResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpCancelPendingDomainVerificationRequest.ts b/server/bindings/HttpCancelPendingDomainVerificationRequest.ts new file mode 100644 index 00000000..f3907cda --- /dev/null +++ b/server/bindings/HttpCancelPendingDomainVerificationRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpCancelPendingDomainVerificationRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/server/bindings/HttpCancelPendingDomainVerificationResponse.ts b/server/bindings/HttpCancelPendingDomainVerificationResponse.ts new file mode 100644 index 00000000..7dbbb62d --- /dev/null +++ b/server/bindings/HttpCancelPendingDomainVerificationResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpCancelPendingDomainVerificationResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpChangeUsersPrivilegesRequest.ts b/server/bindings/HttpChangeUsersPrivilegesRequest.ts new file mode 100644 index 00000000..3cf06666 --- /dev/null +++ b/server/bindings/HttpChangeUsersPrivilegesRequest.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { PrivilegeChange } from "./PrivilegeChange"; + +export interface HttpChangeUsersPrivilegesRequest { teamId: string, privilegesChanges: Array, } \ No newline at end of file diff --git a/server/bindings/HttpChangeUsersPrivilegesResponse.ts b/server/bindings/HttpChangeUsersPrivilegesResponse.ts new file mode 100644 index 00000000..ecdc7535 --- /dev/null +++ b/server/bindings/HttpChangeUsersPrivilegesResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpChangeUsersPrivilegesResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpCloudEndpoint.ts b/server/bindings/HttpCloudEndpoint.ts index 40da1d89..40e75cb7 100644 --- a/server/bindings/HttpCloudEndpoint.ts +++ b/server/bindings/HttpCloudEndpoint.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export type HttpCloudEndpoint = "/register_new_app" | "/register_with_password" | "/login_with_password" | "/login_with_google" | "/register_new_team" | "/remove_user_from_team" | "/get_user_joined_teams" | "/events" | "/invite_user_to_team" | "/accept_team_invite" | "/get_team_user_invites" | "/get_user_team_invites" | "/cancel_team_user_invite" | "/cancel_team_user_invite"; \ No newline at end of file +export type HttpCloudEndpoint = "/register_new_app" | "/register_with_password_start" | "/register_with_password_finish" | "/login_with_password" | "/login_with_google" | "/refresh_token" | "/register_new_team" | "/remove_user_from_team" | "/get_user_joined_teams" | "/events" | "/invite_user_to_team" | "/accept_team_invite" | "/get_team_user_invites" | "/get_user_team_invites" | "/cancel_team_user_invite" | "/cancel_user_team_invite" | "/get_app_events" | "/reset_password_start" | "/reset_password_finish" | "/verify_domain_start" | "/verify_domain_finish" | "/remove_whitelisted_domain" | "/cancel_pending_domain_verification" | "/register_with_passkey_start" | "/register_with_passkey_finish" | "/reset_passkey_start" | "/reset_passkey_finish" | "/get_passkey_challenge" | "/delete_passkey" | "/add_passkey_start" | "/add_passkey_finish" | "/get_user_metadata" | "/get_team_metadata" | "/get_team_users_privileges" | "/change_user_privileges" | "/login_with_passkey_start" | "/login_with_passkey_finish" | "/verify_code" | "/leave_team" | "/delete_app" | "/delete_team" | "/delete_account_start" | "/delete_account_finish"; \ No newline at end of file diff --git a/server/bindings/HttpDeleteAccountFinishRequest.ts b/server/bindings/HttpDeleteAccountFinishRequest.ts new file mode 100644 index 00000000..85fc78d5 --- /dev/null +++ b/server/bindings/HttpDeleteAccountFinishRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteAccountFinishRequest { authCode: string, } \ No newline at end of file diff --git a/server/bindings/HttpDeleteAccountStartRequest.ts b/server/bindings/HttpDeleteAccountStartRequest.ts new file mode 100644 index 00000000..a68a3d1e --- /dev/null +++ b/server/bindings/HttpDeleteAccountStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteAccountStartRequest { device: string, browser: string, } \ No newline at end of file diff --git a/server/bindings/HttpDeleteAppRequest.ts b/server/bindings/HttpDeleteAppRequest.ts new file mode 100644 index 00000000..16cbfebc --- /dev/null +++ b/server/bindings/HttpDeleteAppRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteAppRequest { appId: string, } \ No newline at end of file diff --git a/server/bindings/HttpDeleteTeamRequest.ts b/server/bindings/HttpDeleteTeamRequest.ts new file mode 100644 index 00000000..7ccb9b06 --- /dev/null +++ b/server/bindings/HttpDeleteTeamRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpDeleteTeamRequest { teamId: string, } \ No newline at end of file diff --git a/server/bindings/HttpGetAppEventsRequest.ts b/server/bindings/HttpGetAppEventsRequest.ts new file mode 100644 index 00000000..610297b0 --- /dev/null +++ b/server/bindings/HttpGetAppEventsRequest.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { PaginationCursor } from "./PaginationCursor"; + +export interface HttpGetAppEventsRequest { appId: string, paginationCursor?: PaginationCursor, } \ No newline at end of file diff --git a/server/bindings/HttpGetTeamMetadataRequest.ts b/server/bindings/HttpGetTeamMetadataRequest.ts new file mode 100644 index 00000000..3f8711c0 --- /dev/null +++ b/server/bindings/HttpGetTeamMetadataRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpGetTeamMetadataRequest { teamId: string, } \ No newline at end of file diff --git a/server/bindings/HttpGetTeamMetadataResponse.ts b/server/bindings/HttpGetTeamMetadataResponse.ts new file mode 100644 index 00000000..288e1f6c --- /dev/null +++ b/server/bindings/HttpGetTeamMetadataResponse.ts @@ -0,0 +1,5 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { AppInfo } from "./AppInfo"; +import type { TeamMetadata } from "./TeamMetadata"; + +export interface HttpGetTeamMetadataResponse { teamMetadata: TeamMetadata, teamApps: Array, teamMembers: Array, } \ No newline at end of file diff --git a/server/bindings/HttpGetTeamUsersPrivilegesRequest.ts b/server/bindings/HttpGetTeamUsersPrivilegesRequest.ts new file mode 100644 index 00000000..0c3d35f6 --- /dev/null +++ b/server/bindings/HttpGetTeamUsersPrivilegesRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpGetTeamUsersPrivilegesRequest { teamId: string, } \ No newline at end of file diff --git a/server/bindings/HttpGetTeamUsersPrivilegesResponse.ts b/server/bindings/HttpGetTeamUsersPrivilegesResponse.ts new file mode 100644 index 00000000..5a2d81d8 --- /dev/null +++ b/server/bindings/HttpGetTeamUsersPrivilegesResponse.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { TeamUserPrivilege } from "./TeamUserPrivilege"; + +export interface HttpGetTeamUsersPrivilegesResponse { usersPrivileges: Array, } \ No newline at end of file diff --git a/server/bindings/HttpGetUserJoinedTeamsResponse.ts b/server/bindings/HttpGetUserJoinedTeamsResponse.ts index 7b54bbea..6da348ce 100644 --- a/server/bindings/HttpGetUserJoinedTeamsResponse.ts +++ b/server/bindings/HttpGetUserJoinedTeamsResponse.ts @@ -3,4 +3,4 @@ import type { AppInfo } from "./AppInfo"; import type { JoinedTeam } from "./JoinedTeam"; import type { UserPrivilege } from "./UserPrivilege"; -export interface HttpGetUserJoinedTeamsResponse { teams: Record, teamsApps: Record>, userPrivileges: Record>, } \ No newline at end of file +export interface HttpGetUserJoinedTeamsResponse { teams: Record, teamsApps: Record>, userPrivileges: Record>, teamMembers: Record>, } \ No newline at end of file diff --git a/server/bindings/HttpLeaveTeamRequest.ts b/server/bindings/HttpLeaveTeamRequest.ts new file mode 100644 index 00000000..aeb2ef55 --- /dev/null +++ b/server/bindings/HttpLeaveTeamRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLeaveTeamRequest { teamId: string, device: string, browser: string, } \ No newline at end of file diff --git a/server/bindings/HttpLeaveTeamResponse.ts b/server/bindings/HttpLeaveTeamResponse.ts new file mode 100644 index 00000000..abf576a1 --- /dev/null +++ b/server/bindings/HttpLeaveTeamResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpLeaveTeamResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpLoginWithGoogleResponse.ts b/server/bindings/HttpLoginWithGoogleResponse.ts new file mode 100644 index 00000000..001cae37 --- /dev/null +++ b/server/bindings/HttpLoginWithGoogleResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginWithGoogleResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/server/bindings/HttpLoginWithPasskeyFinishResponse.ts b/server/bindings/HttpLoginWithPasskeyFinishResponse.ts new file mode 100644 index 00000000..e8d95372 --- /dev/null +++ b/server/bindings/HttpLoginWithPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginWithPasskeyFinishResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/server/bindings/HttpLoginWithPasskeyStartRequest.ts b/server/bindings/HttpLoginWithPasskeyStartRequest.ts new file mode 100644 index 00000000..397c8102 --- /dev/null +++ b/server/bindings/HttpLoginWithPasskeyStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpLoginWithPasskeyStartRequest { email: string, } \ No newline at end of file diff --git a/server/bindings/HttpNightlyConnectCloudEvent.ts b/server/bindings/HttpNightlyConnectCloudEvent.ts index e6d67580..5695fc82 100644 --- a/server/bindings/HttpNightlyConnectCloudEvent.ts +++ b/server/bindings/HttpNightlyConnectCloudEvent.ts @@ -1,4 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { EventData } from "./EventData"; -export interface HttpNightlyConnectCloudEvent { appId: string, event: EventData, } \ No newline at end of file +export interface HttpNightlyConnectCloudEvent { appId: string, network: string, event: EventData, } \ No newline at end of file diff --git a/server/bindings/HttpRefreshRequest.ts b/server/bindings/HttpRefreshRequest.ts new file mode 100644 index 00000000..cb9c5bc8 --- /dev/null +++ b/server/bindings/HttpRefreshRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRefreshRequest { refreshToken: string, enforceIp: boolean, } \ No newline at end of file diff --git a/server/bindings/HttpRefreshResponse.ts b/server/bindings/HttpRefreshResponse.ts new file mode 100644 index 00000000..0f29c9b7 --- /dev/null +++ b/server/bindings/HttpRefreshResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRefreshResponse { authToken: string, } \ No newline at end of file diff --git a/server/bindings/HttpRegisterNewAppRequest.ts b/server/bindings/HttpRegisterNewAppRequest.ts index 22db555d..be77a7fe 100644 --- a/server/bindings/HttpRegisterNewAppRequest.ts +++ b/server/bindings/HttpRegisterNewAppRequest.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface HttpRegisterNewAppRequest { teamId: string, appName: string, whitelistedDomains: Array, ackPublicKeys: Array, } \ No newline at end of file +export interface HttpRegisterNewAppRequest { teamId: string, appName: string, } \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasskeyFinishResponse.ts b/server/bindings/HttpRegisterWithPasskeyFinishResponse.ts new file mode 100644 index 00000000..924e8671 --- /dev/null +++ b/server/bindings/HttpRegisterWithPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasskeyFinishResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasskeyStartRequest.ts b/server/bindings/HttpRegisterWithPasskeyStartRequest.ts new file mode 100644 index 00000000..8e83d13e --- /dev/null +++ b/server/bindings/HttpRegisterWithPasskeyStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasskeyStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasswordFinishRequest.ts b/server/bindings/HttpRegisterWithPasswordFinishRequest.ts new file mode 100644 index 00000000..0cd6254c --- /dev/null +++ b/server/bindings/HttpRegisterWithPasswordFinishRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasswordFinishRequest { email: string, newPassword: string, authCode: string, } \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasswordFinishResponse.ts b/server/bindings/HttpRegisterWithPasswordFinishResponse.ts new file mode 100644 index 00000000..533558d7 --- /dev/null +++ b/server/bindings/HttpRegisterWithPasswordFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpRegisterWithPasswordFinishResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasswordStartRequest.ts b/server/bindings/HttpRegisterWithPasswordStartRequest.ts new file mode 100644 index 00000000..c92d4b4a --- /dev/null +++ b/server/bindings/HttpRegisterWithPasswordStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRegisterWithPasswordStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/server/bindings/HttpRegisterWithPasswordStartResponse.ts b/server/bindings/HttpRegisterWithPasswordStartResponse.ts new file mode 100644 index 00000000..dabf431f --- /dev/null +++ b/server/bindings/HttpRegisterWithPasswordStartResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpRegisterWithPasswordStartResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpRemoveWhitelistedDomainRequest.ts b/server/bindings/HttpRemoveWhitelistedDomainRequest.ts new file mode 100644 index 00000000..5652a06b --- /dev/null +++ b/server/bindings/HttpRemoveWhitelistedDomainRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpRemoveWhitelistedDomainRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/server/bindings/HttpRemoveWhitelistedDomainResponse.ts b/server/bindings/HttpRemoveWhitelistedDomainResponse.ts new file mode 100644 index 00000000..f6f2eaf7 --- /dev/null +++ b/server/bindings/HttpRemoveWhitelistedDomainResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpRemoveWhitelistedDomainResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpResetPasskeyFinishResponse.ts b/server/bindings/HttpResetPasskeyFinishResponse.ts new file mode 100644 index 00000000..c9174c9d --- /dev/null +++ b/server/bindings/HttpResetPasskeyFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpResetPasskeyFinishResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpResetPasskeyStartRequest.ts b/server/bindings/HttpResetPasskeyStartRequest.ts new file mode 100644 index 00000000..9ff2d2ef --- /dev/null +++ b/server/bindings/HttpResetPasskeyStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpResetPasskeyStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/server/bindings/HttpResetPasswordFinishRequest.ts b/server/bindings/HttpResetPasswordFinishRequest.ts new file mode 100644 index 00000000..820ee66b --- /dev/null +++ b/server/bindings/HttpResetPasswordFinishRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpResetPasswordFinishRequest { email: string, newPassword: string, authCode: string, } \ No newline at end of file diff --git a/server/bindings/HttpResetPasswordFinishResponse.ts b/server/bindings/HttpResetPasswordFinishResponse.ts new file mode 100644 index 00000000..941dfe57 --- /dev/null +++ b/server/bindings/HttpResetPasswordFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpResetPasswordFinishResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpResetPasswordStartRequest.ts b/server/bindings/HttpResetPasswordStartRequest.ts new file mode 100644 index 00000000..9cda4fb3 --- /dev/null +++ b/server/bindings/HttpResetPasswordStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpResetPasswordStartRequest { email: string, device: string, browser: string, } \ No newline at end of file diff --git a/server/bindings/HttpResetPasswordStartResponse.ts b/server/bindings/HttpResetPasswordStartResponse.ts new file mode 100644 index 00000000..fe2df9e4 --- /dev/null +++ b/server/bindings/HttpResetPasswordStartResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpResetPasswordStartResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpUserMetadataResponse.ts b/server/bindings/HttpUserMetadataResponse.ts new file mode 100644 index 00000000..53a7c630 --- /dev/null +++ b/server/bindings/HttpUserMetadataResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpUserMetadataResponse { userId: string, email: string, passwordSet: boolean, passkeyIds: Array, } \ No newline at end of file diff --git a/server/bindings/HttpVerifyCodeRequest.ts b/server/bindings/HttpVerifyCodeRequest.ts new file mode 100644 index 00000000..09fa72f1 --- /dev/null +++ b/server/bindings/HttpVerifyCodeRequest.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { VerificationAction } from "./VerificationAction"; + +export interface HttpVerifyCodeRequest { email: string, code: string, action: VerificationAction, } \ No newline at end of file diff --git a/server/bindings/HttpVerifyCodeResponse.ts b/server/bindings/HttpVerifyCodeResponse.ts new file mode 100644 index 00000000..50252c32 --- /dev/null +++ b/server/bindings/HttpVerifyCodeResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpVerifyCodeResponse { verificationCode: string, } \ No newline at end of file diff --git a/server/bindings/HttpVerifyDomainFinishRequest.ts b/server/bindings/HttpVerifyDomainFinishRequest.ts new file mode 100644 index 00000000..7f57b548 --- /dev/null +++ b/server/bindings/HttpVerifyDomainFinishRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpVerifyDomainFinishRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/server/bindings/HttpVerifyDomainFinishResponse.ts b/server/bindings/HttpVerifyDomainFinishResponse.ts new file mode 100644 index 00000000..f8077043 --- /dev/null +++ b/server/bindings/HttpVerifyDomainFinishResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type HttpVerifyDomainFinishResponse = null; \ No newline at end of file diff --git a/server/bindings/HttpVerifyDomainStartRequest.ts b/server/bindings/HttpVerifyDomainStartRequest.ts new file mode 100644 index 00000000..4b1a9cb2 --- /dev/null +++ b/server/bindings/HttpVerifyDomainStartRequest.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpVerifyDomainStartRequest { appId: string, domainName: string, } \ No newline at end of file diff --git a/server/bindings/HttpVerifyDomainStartResponse.ts b/server/bindings/HttpVerifyDomainStartResponse.ts new file mode 100644 index 00000000..65ec29bb --- /dev/null +++ b/server/bindings/HttpVerifyDomainStartResponse.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface HttpVerifyDomainStartResponse { code: string, } \ No newline at end of file diff --git a/server/bindings/InitializeRequest.ts b/server/bindings/InitializeRequest.ts index be71606c..e51358f6 100644 --- a/server/bindings/InitializeRequest.ts +++ b/server/bindings/InitializeRequest.ts @@ -3,4 +3,4 @@ import type { AppMetadata } from "./AppMetadata"; import type { Network } from "./Network"; import type { Version } from "./Version"; -export interface InitializeRequest { responseId: string, appMetadata: AppMetadata, network: Network, version: Version, persistent: boolean, persistentSessionId?: string, } \ No newline at end of file +export interface InitializeRequest { responseId: string, appMetadata: AppMetadata, network: Network, version: Version, persistent: boolean, persistentSessionId?: string, appId?: string, } \ No newline at end of file diff --git a/server/bindings/InitializeResponse.ts b/server/bindings/InitializeResponse.ts index 2558a34c..ffecc061 100644 --- a/server/bindings/InitializeResponse.ts +++ b/server/bindings/InitializeResponse.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface InitializeResponse { responseId: string, sessionId: string, createdNew: boolean, publicKeys: Array, metadata?: string, } \ No newline at end of file +export interface InitializeResponse { responseId: string, sessionId: string, createdNew: boolean, publicKeys: Array, metadata?: string, appId: string, } \ No newline at end of file diff --git a/server/bindings/LoginWithGoogleResponse.ts b/server/bindings/LoginWithGoogleResponse.ts deleted file mode 100644 index 718e6d34..00000000 --- a/server/bindings/LoginWithGoogleResponse.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export interface LoginWithGoogleResponse { userId: string, authToken: string, refreshToken: string, } \ No newline at end of file diff --git a/server/bindings/NewRequestEvent.ts b/server/bindings/NewRequestEvent.ts deleted file mode 100644 index d6917eb3..00000000 --- a/server/bindings/NewRequestEvent.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { RequestType } from "./RequestType"; - -export interface NewRequestEvent { sessionId: string, requestId: string, requestType: RequestType, network: string, } \ No newline at end of file diff --git a/server/bindings/NewUserPrivilegeLevel.ts b/server/bindings/NewUserPrivilegeLevel.ts new file mode 100644 index 00000000..9e04e946 --- /dev/null +++ b/server/bindings/NewUserPrivilegeLevel.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type NewUserPrivilegeLevel = "read" | "edit" | "noAccess"; \ No newline at end of file diff --git a/server/bindings/PrivilegeChange.ts b/server/bindings/PrivilegeChange.ts new file mode 100644 index 00000000..eb306ac2 --- /dev/null +++ b/server/bindings/PrivilegeChange.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { NewUserPrivilegeLevel } from "./NewUserPrivilegeLevel"; + +export interface PrivilegeChange { appId: string, userEmail: string, newPrivilegeLevel: NewUserPrivilegeLevel, } \ No newline at end of file diff --git a/server/bindings/RequestType.ts b/server/bindings/RequestType.ts deleted file mode 100644 index 1477f1d3..00000000 --- a/server/bindings/RequestType.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type RequestType = "signMessage" | "signTransaction" | "signAndSendTransaction" | "changeWallet" | "changeNetwork"; \ No newline at end of file diff --git a/server/bindings/SignAndSendTransactionResolveEvent.ts b/server/bindings/SignAndSendTransactionResolveEvent.ts index 343baa00..5fa3a25a 100644 --- a/server/bindings/SignAndSendTransactionResolveEvent.ts +++ b/server/bindings/SignAndSendTransactionResolveEvent.ts @@ -1,4 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { RequestFail } from "./RequestFail"; -export interface SignAndSendTransactionResolveEvent { sessionId: string, requestId: string, network: string, txHash: string | null, failureReason?: RequestFail, } \ No newline at end of file +export interface SignAndSendTransactionResolveEvent { sessionId: string, requestId: string, txHash?: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/server/bindings/SignTransactionResolveEvent.ts b/server/bindings/SignTransactionResolveEvent.ts index 7c01b17d..19087fe4 100644 --- a/server/bindings/SignTransactionResolveEvent.ts +++ b/server/bindings/SignTransactionResolveEvent.ts @@ -1,4 +1,4 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { RequestFail } from "./RequestFail"; -export interface SignTransactionResolveEvent { sessionId: string, requestId: string, txHash: string | null, failureReason?: RequestFail, } \ No newline at end of file +export interface SignTransactionResolveEvent { sessionId: string, requestId: string, txHash?: string, failureReason?: RequestFail, } \ No newline at end of file diff --git a/server/bindings/TeamInvite.ts b/server/bindings/TeamInvite.ts index ae35f807..c926ac10 100644 --- a/server/bindings/TeamInvite.ts +++ b/server/bindings/TeamInvite.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export interface TeamInvite { creatorEmail: string, teamName: string, userEmail: string, createdAt: string, } \ No newline at end of file +export interface TeamInvite { teamId: string, creatorEmail: string, teamName: string, userEmail: string, createdAt: string, } \ No newline at end of file diff --git a/server/bindings/TeamMetadata.ts b/server/bindings/TeamMetadata.ts new file mode 100644 index 00000000..f03a7acf --- /dev/null +++ b/server/bindings/TeamMetadata.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export interface TeamMetadata { creatorEmail: string, teamId: string, teamName: string, personalTeam: boolean, createdAt: string, } \ No newline at end of file diff --git a/server/bindings/TeamUserPrivilege.ts b/server/bindings/TeamUserPrivilege.ts new file mode 100644 index 00000000..714a2c9a --- /dev/null +++ b/server/bindings/TeamUserPrivilege.ts @@ -0,0 +1,4 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { PrivilegeLevel } from "./PrivilegeLevel"; + +export interface TeamUserPrivilege { appId: string, userEmail: string, privilege: PrivilegeLevel, } \ No newline at end of file diff --git a/server/bindings/VerificationAction.ts b/server/bindings/VerificationAction.ts new file mode 100644 index 00000000..d3440245 --- /dev/null +++ b/server/bindings/VerificationAction.ts @@ -0,0 +1,3 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +export type VerificationAction = "registerPassword" | "registerPasskey" | "resetPassword" | "resetPasskey" | "deleteAccount"; \ No newline at end of file diff --git a/server/src/auth/auth_token.rs b/server/src/auth/auth_token.rs index 082ef34e..92f0b9e4 100644 --- a/server/src/auth/auth_token.rs +++ b/server/src/auth/auth_token.rs @@ -1,3 +1,5 @@ +use crate::env::NONCE; + use super::auth_token_type::AuthTokenType; use chrono::{Duration, Utc}; use jsonwebtoken::{decode, encode, Algorithm, DecodingKey, EncodingKey, Header, Validation}; @@ -10,12 +12,13 @@ pub struct AuthToken { pub user_id: String, pub ip: Option, pub token_type: AuthTokenType, - pub sub: String, + pub sub: String, // user email + pub nonce: String, pub exp: u64, // Required (validate_exp defaults to true in validation). Expiration time (as UTC timestamp) } impl AuthToken { - pub fn new_access(user_id: &String, ip: Option) -> Self { + pub fn new_access(user_id: &String, email: &String, ip: Option) -> Self { AuthToken { id: uuid7::uuid7().to_string(), user_id: user_id.clone(), @@ -24,11 +27,12 @@ impl AuthToken { None => None, }, token_type: AuthTokenType::Access, - sub: user_id.clone(), + sub: email.clone(), + nonce: NONCE().to_string(), exp: (Utc::now() + Duration::minutes(30)).timestamp() as u64, // Token expires in 30 minutes } } - pub fn new_refresh(user_id: &String, ip: Option) -> Self { + pub fn new_refresh(user_id: &String, email: &String, ip: Option) -> Self { AuthToken { id: uuid7::uuid7().to_string(), user_id: user_id.clone(), @@ -37,7 +41,8 @@ impl AuthToken { None => None, }, token_type: AuthTokenType::Refresh, - sub: user_id.clone(), + sub: email.clone(), + nonce: NONCE().to_string(), exp: (Utc::now() + Duration::minutes(60 * 7 * 24)).timestamp() as u64, // Token expires in 7 days } } @@ -82,7 +87,7 @@ mod tests { fn test_auth_token_new() { // Test the `new` method to create a new `AuthToken` instance. let ip = SocketAddr::from(([123, 233, 3, 21], 8080)); - let auth_token = AuthToken::new_access(&"1".to_string(), Some(ip)); + let auth_token = AuthToken::new_access(&"1".to_string(), &"1".to_string(), Some(ip)); // Check that the `user_id` and `exp` fields are set correctly. assert_eq!(auth_token.user_id, "1".to_string()); assert_eq!(auth_token.ip.unwrap(), ip.ip()); @@ -93,7 +98,7 @@ mod tests { fn test_auth_token_encode() { // Test the `encode` method to generate a JWT from an `AuthToken` instance. let ip = SocketAddr::from(([123, 233, 3, 21], 8080)); - let auth_token = AuthToken::new_access(&"1".to_string(), Some(ip)); + let auth_token = AuthToken::new_access(&"1".to_string(), &"test".to_string(), Some(ip)); let token = auth_token.encode(JWT_SECRET()).unwrap(); // Check that the JWT is a non-empty string. @@ -104,7 +109,7 @@ mod tests { fn test_auth_token_decode() { // Test the `decode` method to parse a JWT and create an `AuthToken` instance. let ip = SocketAddr::from(([123, 233, 3, 21], 8080)); - let auth_token = AuthToken::new_access(&"1".to_string(), Some(ip)); + let auth_token = AuthToken::new_access(&"1".to_string(), &"1".to_string(), Some(ip)); let token = auth_token.encode(JWT_SECRET()).unwrap(); let decoded_auth_token = AuthToken::decode(&token, JWT_PUBLIC_KEY(), ip).unwrap(); @@ -131,7 +136,7 @@ mod tests { fn test_auth_token_decode_incorrect_secret() { // Test the `decode` method with the incorrect public key. let ip = SocketAddr::from(([123, 233, 3, 21], 8080)); - let auth_token = AuthToken::new_access(&"1".to_string(), Some(ip)); + let auth_token = AuthToken::new_access(&"1".to_string(), &"1".to_string(), Some(ip)); let incorrect_public_key = "-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzlUYIpqSUAyLJaf8ZUef 06YBh5DcmaTrwGcVwC57VtywY7bHXQUtGooULQjiYgnyOPxHDt2W+gQW1axiMxOQ @@ -169,6 +174,7 @@ mod tests { user_id: user_id.clone(), exp, ip: Some(ip.ip()), + nonce: "NONCE".to_string(), token_type: AuthTokenType::Access, sub: user_id, }; @@ -183,7 +189,7 @@ mod tests { fn test_decode_different_ip() { // Test the `decode` method with an expired JWT. let ip = SocketAddr::from(([123, 233, 3, 21], 8080)); - let auth_token = AuthToken::new_access(&"1".to_string(), Some(ip)); + let auth_token = AuthToken::new_access(&"1".to_string(), &"1".to_string(), Some(ip)); let token = auth_token.encode(JWT_SECRET()).unwrap(); let different_ip = SocketAddr::from(([2, 133, 3, 21], 8080)); diff --git a/server/src/bin/grafana_restore.rs b/server/src/bin/grafana_restore.rs new file mode 100644 index 00000000..4855f7b4 --- /dev/null +++ b/server/src/bin/grafana_restore.rs @@ -0,0 +1,114 @@ +use core::panic; +use database::db::Db; +use openapi::apis::configuration::Configuration; +use server::env::{GF_SECURITY_ADMIN_PASSWORD, GF_SECURITY_ADMIN_USER, GRAFANA_BASE_PATH}; +use server::http::cloud::grafana_utils::add_user_to_team::handle_grafana_add_user_to_team; +use server::http::cloud::grafana_utils::create_new_app::handle_grafana_create_new_app; +use server::http::cloud::grafana_utils::create_new_team::handle_grafana_create_new_team; +use server::utils::import_template_dashboards; +use std::collections::HashSet; +use std::sync::Arc; + +// This script is used to restore the state of the Grafana instance +// Before running this script, clear the contents of the grafana-data folder +#[tokio::main] +async fn main() { + let db = Db::connect_to_the_pool().await; + let mut conf: Configuration = Configuration::new(); + conf.base_path = GRAFANA_BASE_PATH().to_string(); + conf.basic_auth = Some(( + GF_SECURITY_ADMIN_USER().to_string(), + Some(GF_SECURITY_ADMIN_PASSWORD().to_string()), + )); + + let grafana_client_conf = Arc::new(conf); + // Setup template dashboards + import_template_dashboards(&grafana_client_conf).await; + + if let Err(err) = db.clear_all_grafana_ids().await { + panic!("Failed to clear grafana ids in database: {:?}", err); + } + + let teams = match db.get_all_teams().await { + Ok(teams) => teams, + Err(e) => { + panic!("Failed to get teams. Error: {:?}", e); + } + }; + for team in teams { + // create teams + let grafana_id = match handle_grafana_create_new_team( + &grafana_client_conf, + &team.team_admin_id, + &team.team_name, + ) + .await + { + Ok(id) => { + if let Err(err) = db.update_grafana_id(&team.team_id, &id.to_string()).await { + panic!("Failed to update grafana id in database: {:?}", err); + } + id.to_string() + } + Err(err) => { + panic!("Failed to create team in grafana: {:?}", err); + } + }; + + let privileges = match db.get_privileges_by_team_id(&team.team_id).await { + Ok(privileges) => privileges, + Err(e) => { + panic!("Failed to get privileges. Error: {:?}", e); + } + }; + let unique_user_ids: Vec = privileges + .into_iter() + .map(|privilege| privilege.user_id) + .collect::>() + .into_iter() + .collect(); + + let users_emails = match db.get_users_emails_by_ids(&unique_user_ids).await { + Ok(emails) => emails, + Err(e) => { + panic!("Failed to get users emails. Error: {:?}", e); + } + }; + for (_, user_email) in users_emails { + // add users to teams + match handle_grafana_add_user_to_team(&grafana_client_conf, &grafana_id, &user_email) + .await + { + Ok(id) => id, + Err(err) => { + panic!("Failed to add user to team in grafana: {:?}", err); + } + }; + } + let apps = match db.get_registered_apps_by_team_id(&team.team_id).await { + Ok(apps) => apps, + Err(e) => { + panic!("Failed to get apps. Error: {:?}", e); + } + }; + for app in apps { + let app_id = app.app_id.clone(); + let app_name = app.app_name.clone(); + // create apps + match handle_grafana_create_new_app( + &grafana_client_conf, + &app_id, + &app_name, + &grafana_id, + ) + .await + { + Ok(id) => id, + Err(err) => { + panic!("Failed to create app in grafana: {:?}", err); + } + }; + } + } + println!("Got it! Exiting..."); +} diff --git a/server/src/bin/nightly-connect-server.rs b/server/src/bin/nightly-connect-server.rs index 60b91f5a..aaadf417 100644 --- a/server/src/bin/nightly-connect-server.rs +++ b/server/src/bin/nightly-connect-server.rs @@ -6,7 +6,7 @@ use tracing_subscriber::EnvFilter; #[tokio::main] async fn main() { - let filter: EnvFilter = "debug,sqlx=warn,tower_http=trace,hyper=warn" + let filter: EnvFilter = "info,sqlx=warn,tower_http=trace,hyper=warn" .parse() .expect("filter should parse"); diff --git a/server/src/cloud_state.rs b/server/src/cloud_state.rs new file mode 100644 index 00000000..6ca57e50 --- /dev/null +++ b/server/src/cloud_state.rs @@ -0,0 +1,99 @@ +use crate::{ + env::{ENVIRONMENT, GF_SECURITY_ADMIN_PASSWORD, GF_SECURITY_ADMIN_USER, GRAFANA_BASE_PATH}, + ip_geolocation::GeolocationRequester, + mailer::{entry::run_mailer, mailer::Mailer}, + structs::session_cache::ApiSessionsCache, + utils::import_template_dashboards, +}; +use axum::extract::FromRef; +use database::db::Db; +use hickory_resolver::{ + name_server::{GenericConnector, TokioRuntimeProvider}, + AsyncResolver, TokioAsyncResolver, +}; +use openapi::apis::configuration::Configuration; +use r_cache::cache::Cache; +use reqwest::Url; +use std::{sync::Arc, time::Duration}; +use tokio::task; +use webauthn_rs::{Webauthn, WebauthnBuilder}; + +pub type DnsResolver = AsyncResolver>; + +#[derive(Clone, FromRef)] +pub struct CloudState { + pub db: Arc, + pub geo_location: Arc, + pub sessions_cache: Arc, + pub mailer: Arc, + pub dns_resolver: Arc, + pub webauthn: Arc, + pub grafana_client_conf: Arc, +} + +impl CloudState { + pub async fn new() -> Self { + let sessions_cache = get_new_session(); + let db_arc = Arc::new(Db::connect_to_the_pool().await); + let geo_loc_requester = Arc::new(GeolocationRequester::new().await); + let mailer = Arc::new(run_mailer().await.unwrap()); + let dns_resolver = Arc::new(TokioAsyncResolver::tokio_from_system_conf().unwrap()); + + let mut conf = Configuration::new(); + conf.base_path = GRAFANA_BASE_PATH().to_string(); + conf.basic_auth = Some(( + GF_SECURITY_ADMIN_USER().to_string(), + Some(GF_SECURITY_ADMIN_PASSWORD().to_string()), + )); + + let grafana_client_conf = Arc::new(conf); + + // Setup template dashboards + import_template_dashboards(&grafana_client_conf).await; + + // Passkey + let rp_id = match ENVIRONMENT() { + "PROD" => "cloud.nightly.app", + "DEV" => "localhost", + _ => panic!("Invalid ENVIRONMENT env"), + }; + // Url containing the effective domain name + let rp_origin = Url::parse(match ENVIRONMENT() { + "PROD" => "https://cloud.nightly.app", + "DEV" => "http://localhost:3000", + _ => panic!("Invalid ENVIRONMENT env"), + }) + .expect("Cant parse rp_origin"); + let builder = WebauthnBuilder::new(rp_id, &rp_origin) + .expect("Invalid configuration") + .rp_name("Nightly Connect Cloud"); + + // Consume the builder and create our webauthn instance. + let webauthn = Arc::new(builder.build().expect("Invalid configuration")); + + Self { + db: db_arc, + geo_location: geo_loc_requester, + sessions_cache, + mailer, + dns_resolver, + webauthn, + grafana_client_conf, + } + } +} + +pub fn get_new_session() -> Arc { + // Default 15 min expiration + let add_new_passkey_sessions = Arc::new(Cache::new(Some(Duration::from_secs(15 * 60)))); + task::spawn({ + let cache = Arc::clone(&add_new_passkey_sessions); + async move { + loop { + tokio::time::sleep(Duration::from_secs(300)).await; + cache.remove_expired(); + } + } + }); + add_new_passkey_sessions +} diff --git a/server/src/env.rs b/server/src/env.rs index edd9aace..34c430c4 100644 --- a/server/src/env.rs +++ b/server/src/env.rs @@ -1,5 +1,7 @@ #![allow(non_snake_case)] +use configparser::ini::Ini; use once_cell::sync::OnceCell; +use std::{fs, path::PathBuf}; #[derive(Debug)] pub struct ENV { @@ -8,7 +10,15 @@ pub struct ENV { pub JWT_PUBLIC_KEY: String, pub ONLY_RELAY_SERVICE: bool, pub NONCE: String, + pub MAILER_ADDRESS: String, + pub MAILER_PASSWORD: String, + pub DATABASE_ADDRESS: String, + pub GRAFANA_BASE_PATH: String, + pub GF_SECURITY_ADMIN_USER: String, + pub GF_SECURITY_ADMIN_PASSWORD: String, + pub MAILER_ACTIVE: bool, } + pub fn get_env() -> &'static ENV { static INSTANCE: OnceCell = OnceCell::new(); @@ -17,33 +27,116 @@ pub fn get_env() -> &'static ENV { let ENVIRONMENT = std::env::var("ENV").expect("Failed to get ENV env"); let ENVIRONMENT = ENVIRONMENT.as_str(); + let project_root = PathBuf::from("/root/connect"); + println!("Using absolute project root: {:?}", project_root); + + let jwt_secret_path = project_root.join("jwt_keys/grafana.key"); + let jwt_public_path = project_root.join("jwt_keys/grafana.key.pub"); + + println!("Attempting to read JWT secret from: {:?}", jwt_secret_path); + println!( + "Attempting to read JWT public key from: {:?}", + jwt_public_path + ); + + let jwt_secret = match fs::read_to_string(&jwt_secret_path) { + Ok(content) => content, + Err(e) => { + println!("Error reading JWT secret file: {}", e); + panic!("Failed to read JWT secret file"); + } + }; + + let jwt_public = match fs::read_to_string(&jwt_public_path) { + Ok(content) => content, + Err(e) => { + println!("Error reading JWT public file: {}", e); + panic!("Failed to read JWT public file"); + } + }; + + // Parse grafana.ini + let grafana_ini_path = project_root.join("grafana/grafana.ini"); + println!( + "Attempting to read grafana.ini from: {:?}", + grafana_ini_path + ); + + let mut config = Ini::new(); + config + .load(grafana_ini_path) + .expect("Failed to load grafana.ini"); + + // Read admin credentials from grafana.ini + let admin_user = config + .get("security", "admin_user") + .expect("Failed to get admin_user from grafana.ini"); + let admin_password = config + .get("security", "admin_password") + .expect("Failed to get admin_password from grafana.ini"); + let env = ENV { ENVIRONMENT: ENVIRONMENT.to_owned(), - JWT_SECRET: std::env::var("JWT_SECRET").expect("JWT_SECRET env not set"), - JWT_PUBLIC_KEY: std::env::var("JWT_PUBLIC_KEY").expect("JWT_PUBLIC_KEY env not set"), + JWT_SECRET: jwt_secret, + JWT_PUBLIC_KEY: jwt_public, ONLY_RELAY_SERVICE: std::env::var("ONLY_RELAY_SERVICE") .expect("Failed to get ONLY_RELAY_SERVICE env") .eq_ignore_ascii_case("true"), NONCE: std::env::var("NONCE").expect("Failed to get NONCE env"), + MAILER_ADDRESS: std::env::var("MAILER_ADDRESS") + .expect("Failed to get MAILER_ADDRESS env"), + MAILER_PASSWORD: std::env::var("MAILER_PASSWORD") + .expect("Failed to get MAILER_PASSWORD env"), + DATABASE_ADDRESS: std::env::var("DATABASE_ADDRESS") + .expect("Failed to get DATABASE_ADDRESS env"), + GRAFANA_BASE_PATH: std::env::var("GRAFANA_BASE_PATH") + .expect("Failed to get GRAFANA_BASE_PATH env"), + GF_SECURITY_ADMIN_USER: admin_user, + GF_SECURITY_ADMIN_PASSWORD: admin_password, + MAILER_ACTIVE: std::env::var("MAILER_ACTIVE") + .expect("Failed to get MAILER_ACTIVE env") + .eq_ignore_ascii_case("true"), }; return env; }) } +pub fn is_env_production() -> bool { + ENVIRONMENT() == "PROD" +} pub fn ENVIRONMENT() -> &'static str { get_env().ENVIRONMENT.as_str() } pub fn JWT_SECRET() -> &'static str { get_env().JWT_SECRET.as_str() } - pub fn JWT_PUBLIC_KEY() -> &'static str { get_env().JWT_PUBLIC_KEY.as_str() } pub fn ONLY_RELAY_SERVICE() -> bool { get_env().ONLY_RELAY_SERVICE } - pub fn NONCE() -> &'static str { get_env().NONCE.as_str() } +pub fn MAILER_ADDRESS() -> &'static str { + get_env().MAILER_ADDRESS.as_str() +} +pub fn MAILER_PASSWORD() -> &'static str { + get_env().MAILER_PASSWORD.as_str() +} +pub fn GRAFANA_BASE_PATH() -> &'static str { + get_env().GRAFANA_BASE_PATH.as_str() +} +pub fn GF_SECURITY_ADMIN_USER() -> &'static str { + get_env().GF_SECURITY_ADMIN_USER.as_str() +} +pub fn GF_SECURITY_ADMIN_PASSWORD() -> &'static str { + get_env().GF_SECURITY_ADMIN_PASSWORD.as_str() +} +pub fn MAILER_ACTIVE() -> bool { + get_env().MAILER_ACTIVE +} +pub fn DATABASE_ADDRESS() -> &'static str { + get_env().DATABASE_ADDRESS.as_str() +} diff --git a/server/src/http/cloud/accept_team_invite.rs b/server/src/http/cloud/accept_team_invite.rs index d92616a9..b2aec925 100644 --- a/server/src/http/cloud/accept_team_invite.rs +++ b/server/src/http/cloud/accept_team_invite.rs @@ -1,12 +1,16 @@ -use crate::{ - middlewares::auth_middleware::UserId, - structs::cloud::api_cloud_errors::CloudApiErrors, +use super::{ + grafana_utils::add_user_to_team::handle_grafana_add_user_to_team, utils::{custom_validate_uuid, validate_request}, }; +use crate::{ + env::is_env_production, middlewares::auth_middleware::UserId, + structs::cloud::api_cloud_errors::CloudApiErrors, utils::start_transaction, +}; use axum::{extract::State, http::StatusCode, Extension, Json}; use database::db::Db; use garde::Validate; use log::error; +use openapi::apis::configuration::Configuration; use serde::{Deserialize, Serialize}; use std::sync::Arc; use ts_rs::TS; @@ -24,16 +28,11 @@ pub struct HttpAcceptTeamInviteRequest { pub struct HttpAcceptTeamInviteResponse {} pub async fn accept_team_invite( - State(db): State>>, + State(db): State>, + State(grafana_conf): State>, Extension(user_id): Extension, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -101,12 +100,16 @@ pub async fn accept_team_invite( )); } } - - // Accept invite - let mut tx = match db.connection_pool.begin().await { - Ok(tx) => tx, + let team = match db.get_team_by_team_id(None, &request.team_id).await { + Ok(Some(team)) => team, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } Err(err) => { - error!("Failed to start transaction: {:?}", err); + error!("Failed to get team by team_id: {:?}", err); return Err(( StatusCode::INTERNAL_SERVER_ERROR, CloudApiErrors::DatabaseError.to_string(), @@ -114,6 +117,31 @@ pub async fn accept_team_invite( } }; + // Grafana add user to the team + if is_env_production() { + let grafana_team_id = match team.grafana_id { + Some(grafana_id) => grafana_id, + None => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamWithoutGrafanaId.to_string(), + )); + } + }; + + if let Err(err) = + handle_grafana_add_user_to_team(&grafana_conf, &grafana_team_id, &user.email).await + { + error!("Failed to add user to the team in grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + }; + } + // Accept invite + let mut tx = start_transaction(&db).await?; + // Accept invite if let Err(err) = db .accept_team_invite(&mut tx, &request.team_id, &user.email) @@ -158,7 +186,7 @@ pub async fn accept_team_invite( Ok(Json(HttpAcceptTeamInviteResponse {})) } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; @@ -199,8 +227,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; // unwrap err as it should have failed @@ -295,8 +321,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; // unwrap err as it should have failed diff --git a/server/src/http/cloud/add_passkey_finish.rs b/server/src/http/cloud/add_passkey_finish.rs new file mode 100644 index 00000000..4cda4c37 --- /dev/null +++ b/server/src/http/cloud/add_passkey_finish.rs @@ -0,0 +1,118 @@ +use crate::{ + middlewares::auth_middleware::UserId, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::db::Db; +use garde::Validate; +use log::{error, warn}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; +use webauthn_rs::{prelude::RegisterPublicKeyCredential, Webauthn}; + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct HttpAddPasskeyFinishRequest { + pub credential: RegisterPublicKeyCredential, +} + +#[derive(Validate, Clone, Debug, Deserialize, Serialize, TS)] +#[ts(export)] +pub struct HttpAddPasskeyFinishResponse {} + +pub async fn add_passkey_finish( + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Get cache data + let sessions_key = SessionsCacheKey::AddPasskey(user_id.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::VerifyAddPasskey(session)) => session, + _ => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Validate new passkey registration + let passkey = match web_auth.finish_passkey_registration( + &request.credential, + &session_data.passkey_registration_state, + ) { + Ok(sk) => sk, + Err(err) => { + warn!( + "Failed to finish adding new passkey: {:?}, user_id: {}", + err, &user_id + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )); + } + }; + + // Validate new passkey + // Get user data + let user_data = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user_data)) => user_data, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get user data: {:?}, user_id: {}", err, &user_id); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user has already added this passkey + let mut passkeys = match user_data.passkeys { + Some(passkeys) => { + if passkeys.contains(&passkey) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::PasskeyAlreadyExists.to_string(), + )); + } + + passkeys + } + None => { + vec![] + } + }; + + // Add new passkey + passkeys.push(passkey); + + // Update passkeys in database + if let Err(err) = db.update_passkeys(&user_data.email, &passkeys).await { + error!( + "Failed to update user passkeys: {:?}, user_email: {}", + err, &user_data.email + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + return Ok(Json(HttpAddPasskeyFinishResponse {})); +} diff --git a/server/src/http/cloud/add_passkey_start.rs b/server/src/http/cloud/add_passkey_start.rs new file mode 100644 index 00000000..3b67db47 --- /dev/null +++ b/server/src/http/cloud/add_passkey_start.rs @@ -0,0 +1,80 @@ +use crate::{ + middlewares::auth_middleware::UserId, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{AddPasskeyVerification, ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::db::Db; +use log::error; +use std::sync::Arc; +use webauthn_rs::{ + prelude::{CreationChallengeResponse, Uuid}, + Webauthn, +}; + +pub type HttpAddPasskeyStartResponse = CreationChallengeResponse; + +pub async fn add_passkey_start( + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Extension(user_id): Extension, +) -> Result, (StatusCode, String)> { + // Get user data + let user_data = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user_data)) => user_data, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user exists: {:?}, user_id: {}", + err, user_id + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Save to cache passkey challenge request + let sessions_key = SessionsCacheKey::AddPasskey(user_id.clone()).to_string(); + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Generate challenge + let temp_user_id = Uuid::new_v4(); + let res = + web_auth.start_passkey_registration(temp_user_id, &user_data.email, &user_data.email, None); + + let (ccr, reg_state) = match res { + Ok((ccr, reg_state)) => (ccr, reg_state), + Err(_) => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )) + } + }; + + // Save the challenge to the cache + sessions_cache.set( + sessions_key, + SessionCache::VerifyAddPasskey(AddPasskeyVerification { + user_id, + passkey_registration_state: reg_state, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + + return Ok(Json(ccr)); +} diff --git a/server/src/http/cloud/cancel_team_user_invite.rs b/server/src/http/cloud/cancel_team_user_invite.rs index 678ec326..3a416166 100644 --- a/server/src/http/cloud/cancel_team_user_invite.rs +++ b/server/src/http/cloud/cancel_team_user_invite.rs @@ -1,7 +1,7 @@ +use super::utils::{custom_validate_uuid, validate_request}; use crate::{ middlewares::auth_middleware::UserId, structs::cloud::{api_cloud_errors::CloudApiErrors, team_invite::TeamInvite}, - utils::{custom_validate_uuid, validate_request}, }; use axum::{extract::State, http::StatusCode, Extension, Json}; use database::db::Db; @@ -26,16 +26,10 @@ pub struct HttpCancelTeamUserInviteRequest { pub struct HttpCancelTeamUserInviteResponse {} pub async fn cancel_team_user_invite( - State(db): State>>, + State(db): State>, Extension(user_id): Extension, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -50,6 +44,13 @@ pub async fn cancel_team_user_invite( )); } + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + // Check team type if team.personal { return Err(( @@ -121,7 +122,7 @@ pub async fn cancel_team_user_invite( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; @@ -160,8 +161,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let _ = add_test_app(&request, &auth_token, &test_app) diff --git a/server/src/http/cloud/cancel_user_team_invite.rs b/server/src/http/cloud/cancel_user_team_invite.rs index ef8e201a..1554c3a1 100644 --- a/server/src/http/cloud/cancel_user_team_invite.rs +++ b/server/src/http/cloud/cancel_user_team_invite.rs @@ -1,7 +1,6 @@ +use super::utils::{custom_validate_uuid, validate_request}; use crate::{ - middlewares::auth_middleware::UserId, - structs::cloud::api_cloud_errors::CloudApiErrors, - utils::{custom_validate_uuid, validate_request}, + middlewares::auth_middleware::UserId, structs::cloud::api_cloud_errors::CloudApiErrors, }; use axum::{extract::State, http::StatusCode, Extension, Json}; use database::db::Db; @@ -24,16 +23,10 @@ pub struct HttpCancelUserTeamInviteRequest { pub struct HttpCancelUserTeamInviteResponse {} pub async fn cancel_user_team_invite( - State(db): State>>, + State(db): State>, Extension(user_id): Extension, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -93,7 +86,7 @@ pub async fn cancel_user_team_invite( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; @@ -141,8 +134,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let app_id = add_test_app(&request, &auth_token, &test_app) .await diff --git a/server/src/http/cloud/change_user_privileges.rs b/server/src/http/cloud/change_user_privileges.rs new file mode 100644 index 00000000..71e2202a --- /dev/null +++ b/server/src/http/cloud/change_user_privileges.rs @@ -0,0 +1,502 @@ +use super::utils::{custom_validate_uuid, validate_request}; +use crate::{ + middlewares::auth_middleware::UserId, + structs::cloud::{ + api_cloud_errors::CloudApiErrors, new_user_privilege_level::NewUserPrivilegeLevel, + }, + utils::start_transaction, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::{ + db::Db, + structs::privilege_level::PrivilegeLevel, + tables::{user_app_privileges::table_struct::UserAppPrivilege, utils::get_current_datetime}, +}; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, +}; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct PrivilegeChange { + #[garde(custom(custom_validate_uuid))] + pub app_id: String, + #[garde(email)] + pub user_email: String, + #[garde(skip)] + pub new_privilege_level: NewUserPrivilegeLevel, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpChangeUsersPrivilegesRequest { + #[garde(custom(custom_validate_uuid))] + pub team_id: String, + #[garde(dive)] + pub privileges_changes: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpChangeUsersPrivilegesResponse {} + +pub async fn change_user_privileges( + State(db): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Get team data and perform checks + match db.get_team_by_team_id(None, &request.team_id).await { + Ok(Some(team)) => { + // Check if user is a admin of this team + if team.team_admin_id != user_id { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + + // Check team type + if team.personal { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::ActionForbiddenForPersonalTeam.to_string(), + )); + } + + // Check if changes can be applied + let emails: Vec = request + .privileges_changes + .iter() + .map(|x| &x.user_email) + .collect::>() + .into_iter() + .map(|x| x.clone()) + .collect(); + + // Get users ids + let user_ids = match db.get_users_ids_by_emails(&emails).await { + Ok(user_ids) => user_ids, + Err(err) => { + error!("Failed to get users ids: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Get users privileges + let team_users_privileges = match db.get_privileges_by_team_id(&request.team_id).await { + Ok(users_in_team_privileges) => users_in_team_privileges, + Err(err) => { + error!("Failed to get users in team privileges: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Sort privileges by user_id + let access_map: HashMap<(&String, &String), &PrivilegeLevel> = team_users_privileges + .iter() + .map(|privilege| { + ( + (&privilege.user_id, &privilege.app_id), + &privilege.privilege_level, + ) + }) + .collect(); + + // Start transaction to update users privileges + let mut tx = start_transaction(&db).await?; + + // Update users privileges + for requested_change in request.privileges_changes { + // Determine action + let new_privilege_level = + match requested_change.new_privilege_level.to_privilege_level() { + Some(privilege) => privilege, + None => { + error!("Failed to convert new privilege level"); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + let user_id = user_ids.get(&requested_change.user_email).ok_or(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + ))?; + + let current_privilege = access_map.get(&(user_id, &requested_change.app_id)); + + match &requested_change.new_privilege_level { + NewUserPrivilegeLevel::Read => { + // check current privilege level + match current_privilege { + Some(privileges) => { + // Update privilege + if *privileges == &PrivilegeLevel::Read { + continue; + } + + db.update_user_privilege( + &mut tx, + user_id, + &requested_change.app_id, + new_privilege_level, + ) + .await + .map_err(|err| { + error!("Failed to update privilege: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + })?; + } + None => { + // Check if user has access to the team + if !access_map.keys().any(|(user_id, _)| user_id == user_id) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotBelongsToTheTeam.to_string(), + )); + } + + // Insert new privilege + let user_new_privilege = UserAppPrivilege { + user_id: user_id.clone(), + app_id: requested_change.app_id.clone(), + privilege_level: PrivilegeLevel::Read, + creation_timestamp: get_current_datetime(), + }; + + db.add_new_privilege_within_tx(&mut tx, &user_new_privilege) + .await + .map_err(|err| { + error!("Failed to add new privilege: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + })?; + } + }; + } + NewUserPrivilegeLevel::Edit => { + // check current privilege level + match current_privilege { + Some(privileges) => { + // Update privilege + if *privileges == &PrivilegeLevel::Edit { + continue; + } + + db.update_user_privilege( + &mut tx, + user_id, + &requested_change.app_id, + new_privilege_level, + ) + .await + .map_err(|err| { + error!("Failed to update privilege: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + })?; + } + None => { + // Check if user has access to the team + if !access_map.keys().any(|(user_id, _)| user_id == user_id) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotBelongsToTheTeam.to_string(), + )); + } + + // Insert new privilege + let user_new_privilege = UserAppPrivilege { + user_id: user_id.clone(), + app_id: requested_change.app_id.clone(), + privilege_level: PrivilegeLevel::Edit, + creation_timestamp: get_current_datetime(), + }; + + db.add_new_privilege_within_tx(&mut tx, &user_new_privilege) + .await + .map_err(|err| { + error!("Failed to add new privilege: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + })?; + } + }; + } + NewUserPrivilegeLevel::NoAccess => { + // check current privilege level + if let Some(_) = current_privilege { + // Check if user still has access to the team, if there is entry in the access map to remove access to specific app + // then there should be at least one another entry in the access map which will give him access to the team + if access_map.keys().any(|(user_id, app_id)| { + user_id == user_id && *app_id != &requested_change.app_id + }) { + // Update privilege + db.remove_user_privilege( + &mut tx, + user_id, + &requested_change.app_id, + ) + .await + .map_err(|err| { + error!("Failed to remove privilege: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + })?; + } + } + } + } + } + + // Commit transaction + tx.commit().await.map_err(|err| { + error!("Failed to commit transaction: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + })?; + + // Return response + return Ok(Json(HttpChangeUsersPrivilegesResponse {})); + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + env::JWT_SECRET, + http::cloud::{ + get_team_users_privileges::HttpGetTeamUsersPrivilegesResponse, + register_new_app::HttpRegisterNewAppRequest, + }, + structs::cloud::{ + cloud_http_endpoints::HttpCloudEndpoint, team_user_privilege::TeamUserPrivilege, + }, + test_utils::test_utils::{ + add_test_app, add_test_team, add_user_to_test_team, convert_response, create_test_app, + generate_valid_name, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[ignore = "Not used for now"] + #[tokio::test] + async fn test_change_privileges() { + let test_app = create_test_app(false).await; + + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + let mut app_ids = Vec::new(); + for _ in 0..3 { + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + let app_id = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + app_ids.push(app_id); + } + + let mut users_email = Vec::new(); + // Register 10 users and invite them to the team + for _ in 0..10 { + let (app_user_auth_token, app_user_email, _app_user_password) = + register_and_login_random_user(&test_app).await; + + // Invite user to the first three teams + add_user_to_test_team( + &team_id, + &app_user_email, + &auth_token, + &app_user_auth_token, + &test_app, + ) + .await + .unwrap(); + + users_email.push(app_user_email); + } + + // Prepare list of changes to be applied + let mut changes = Vec::new(); + // Change state of 4 users in first + for i in 0..4 { + let privilege = if i % 2 == 0 { + NewUserPrivilegeLevel::Read + } else { + NewUserPrivilegeLevel::Edit + }; + + let change = PrivilegeChange { + app_id: app_ids[0].clone(), + user_email: users_email[i].clone(), + new_privilege_level: privilege, + }; + + changes.push(change); + } + // Remove access to the second app for the first user + let change = PrivilegeChange { + app_id: app_ids[1].clone(), + user_email: users_email[0].clone(), + new_privilege_level: NewUserPrivilegeLevel::NoAccess, + }; + changes.push(change); + + // Try to change privileges + let request = HttpChangeUsersPrivilegesRequest { + team_id: team_id.clone(), + privileges_changes: changes, + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&request).unwrap(); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::ChangeUserPrivileges.to_string() + )) + .extension(ip.clone()) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(response) + .await + .unwrap(); + + // Get users privileges + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}?teamId={team_id}", + HttpCloudEndpoint::GetTeamUserPrivileges.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let res = convert_response::(response) + .await + .unwrap(); + + // Check amount + assert_eq!(res.users_privileges.len(), 32); // 10 for each user per app + 3 for admin entries - 1 for removed access + + // Check changed privileges to first app + for i in 0..4 { + let user_privileges = res + .users_privileges + .iter() + .filter(|x| x.user_email == users_email[i] && x.app_id == app_ids[0]) + .collect::>(); + + assert_eq!(user_privileges.len(), 1); + let privilege = user_privileges[0]; + if i % 2 == 0 { + assert_eq!(privilege.privilege, PrivilegeLevel::Read); + } else { + assert_eq!(privilege.privilege, PrivilegeLevel::Edit); + } + } + + // Check removed access to the second app + let user_privileges = res + .users_privileges + .iter() + .filter(|x| x.user_email == users_email[0] && x.app_id == app_ids[1]) + .collect::>(); + assert_eq!(user_privileges.len(), 0); + + // Check unchanged privileges to the last app + for i in 0..10 { + let user_privileges = res + .users_privileges + .iter() + .filter(|x| x.user_email == users_email[i] && x.app_id == app_ids[2]) + .collect::>(); + + assert_eq!(user_privileges.len(), 1); + let privilege = user_privileges[0]; + assert_eq!(privilege.privilege, PrivilegeLevel::Read); + } + } +} diff --git a/server/src/http/cloud/delete_account_finish.rs b/server/src/http/cloud/delete_account_finish.rs new file mode 100644 index 00000000..8ace31b2 --- /dev/null +++ b/server/src/http/cloud/delete_account_finish.rs @@ -0,0 +1,228 @@ +use crate::{ + env::is_env_production, + http::cloud::utils::{check_auth_code, validate_request}, + middlewares::auth_middleware::UserId, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, + utils::start_transaction, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use openapi::apis::configuration::Configuration; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +use super::grafana_utils::delete_user_account::handle_grafana_delete_user_account; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpDeleteAccountFinishRequest { + #[garde(skip)] + pub auth_code: String, +} + +pub async fn delete_account_finish( + State(db): State>, + State(sessions_cache): State>, + State(grafana_conf): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // check if user exists + let user = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user)) => user, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get user: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Get session data + let sessions_key = SessionsCacheKey::DeleteAccount(user.email.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::DeleteAccount(session)) => session, + _ => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Validate auth code + if !check_auth_code( + &request.auth_code, + &session_data.authentication_code, + session_data.created_at, + ) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredAuthCode.to_string(), + )); + } + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Start transaction to update users privileges + let mut tx = start_transaction(&db).await?; + + let mut owned_team_grafana_ids = Vec::new(); + let mut non_owned_team_grafana_ids = Vec::new(); + let mut app_ids: Vec = Vec::new(); + + let teams = match db + .get_joined_teams_by_user_id(&user_id) + .await + .map_err(|err| { + error!("Failed to get user teams: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + }) { + Ok(joined_teams) => joined_teams, + Err(err) => { + error!("Failed to get user teams: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + for (team, _, _, registered_apps) in teams { + if team.team_admin_id == user_id { + if let Some(grafana_id) = team.grafana_id { + owned_team_grafana_ids.push(grafana_id); + } + for (app, _) in registered_apps { + if app.team_id == team.team_id { + app_ids.push(app.app_id.clone()); + } + } + } else { + if let Some(grafana_id) = team.clone().grafana_id { + non_owned_team_grafana_ids.push(grafana_id) + } + } + } + // Grafana, delete teams, apps and user + if is_env_production() { + if let Err(err) = handle_grafana_delete_user_account( + &grafana_conf, + &owned_team_grafana_ids, + &non_owned_team_grafana_ids, + &user.email, + ) + .await + { + error!("Failed to delete account in grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + }; + } + + // Delete all invites connected to user + if let Err(err) = db + .cancel_all_team_invites_containing_email(&mut tx, &user.email, &user_id) + .await + { + error!("Failed to delete team invites: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Delete all verified domains + if let Err(err) = db + .delete_domain_verifications_for_inactive_apps(&mut tx, &app_ids) + .await + { + error!("Failed to delete domains: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Delete all user apps + if let Err(err) = db.deactivate_user_apps(&mut tx, &user_id).await { + error!("Failed to delete user apps: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Leave all teams + if let Err(err) = db.remove_inactive_user_from_teams(&mut tx, &user_id).await { + error!("Failed to leave teams: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // delete privileges + if let Err(err) = db + .remove_privileges_for_inactive_teams(&mut tx, &user_id) + .await + { + error!("Failed to leave teams: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Delete all user teams + if let Err(err) = db.delete_all_user_teams(&mut tx, &user_id).await { + error!("Failed to delete user teams: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Deactivate the user + if let Err(err) = db.deactivate_user(&user_id, &mut tx).await { + error!("Failed to delete user: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Commit transaction + tx.commit().await.map_err(|err| { + error!("Failed to commit transaction: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + ) + })?; + + return Ok(Json(())); +} diff --git a/server/src/http/cloud/delete_account_start.rs b/server/src/http/cloud/delete_account_start.rs new file mode 100644 index 00000000..22c531bd --- /dev/null +++ b/server/src/http/cloud/delete_account_start.rs @@ -0,0 +1,151 @@ +use crate::{ + mailer::{ + mail_requests::{DeleteAccountNotification, SendEmailRequest}, + mailer::Mailer, + }, + middlewares::auth_middleware::UserId, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ + ApiSessionsCache, DeleteAccountVerification, SessionCache, SessionsCacheKey, + }, + }, + test_env::is_test_env, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +use super::utils::generate_verification_code; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +pub struct HttpDeleteAccountStartRequest { + #[garde(alphanumeric)] + pub device: String, + #[garde(alphanumeric)] + pub browser: String, +} + +pub async fn delete_account_start( + State(db): State>, + State(mailer): State>, + State(sessions_cache): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Get user data + let user_data = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user_data)) => user_data, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user exists: {:?}, user_id: {}", + err, user_id + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Save to cache delete account challenge request + let sessions_key = SessionsCacheKey::DeleteAccount(user_data.email.clone()).to_string(); + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Generate verification code, if not in production use a static code + let verification_code = generate_verification_code(); + + // Save the challenge to the cache + sessions_cache.set( + sessions_key, + SessionCache::DeleteAccount(DeleteAccountVerification { + email: user_data.email.clone(), + verification_code: verification_code.clone(), + authentication_code: None, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + + if !is_test_env() { + // Send code via email + let request = SendEmailRequest::DeleteAccount(DeleteAccountNotification { + email: user_data.email, + code: verification_code, + device: request.device.clone(), + browser: request.browser.clone(), + }); + + // It doesn't matter if this fails + mailer.handle_email_request(&request); + } + + return Ok(Json(())); +} + +#[cfg(feature = "cloud_intsegration_tests")] +#[cfg(test)] +mod tests { + use crate::{ + env::JWT_SECRET, + http::cloud::delete_account_start::HttpDeleteAccountStartRequest, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + convert_response, create_test_app, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_delete_account() { + let test_app = create_test_app(false).await; + + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + + let request = HttpDeleteAccountStartRequest { + device: "device".to_string(), + browser: "browser".to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&request).unwrap(); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::DeleteAccountStart.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::<()>(response).await.unwrap(); + } +} diff --git a/server/src/http/cloud/delete_app.rs b/server/src/http/cloud/delete_app.rs new file mode 100644 index 00000000..33a97e67 --- /dev/null +++ b/server/src/http/cloud/delete_app.rs @@ -0,0 +1,242 @@ +use super::utils::{custom_validate_uuid, validate_request}; +use crate::{ + env::is_env_production, + http::cloud::grafana_utils::delete_registered_app::handle_grafana_delete_app, + middlewares::auth_middleware::UserId, structs::cloud::api_cloud_errors::CloudApiErrors, + utils::start_transaction, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::{db::Db, structs::privilege_level::PrivilegeLevel}; +use garde::Validate; +use log::{error, warn}; +use openapi::apis::configuration::Configuration; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpDeleteAppRequest { + #[garde(custom(custom_validate_uuid))] + pub app_id: String, +} + +pub async fn delete_app( + State(db): State>, + State(grafana_conf): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + warn!("Delete app request: {:?}", request); + + // First check if app exists + match db.get_registered_app_by_app_id(&request.app_id).await { + Ok(Some(app)) => { + // Check if user has admin privileges + match db + .get_privilege_by_user_id_and_app_id(&user_id, &request.app_id) + .await + { + Ok(Some(user_privilege)) => { + if user_privilege.privilege_level != PrivilegeLevel::Admin { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + // Check if app is active + if app.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )); + } + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + Err(err) => { + error!("Failed to get privileges by app id and user id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + // Delete the app + // Start a transaction + let mut tx = start_transaction(&db).await?; + + if let Err(err) = db + .remove_privileges_for_inactive_app_within_tx(&mut tx, &request.app_id) + .await + { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to delete app: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + if let Err(err) = db + .delete_domain_verification_for_inactive_app(&mut tx, &request.app_id) + .await + { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to delete app: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + if let Err(err) = db.deactivate_app(&mut tx, &request.app_id).await { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to deactivate app: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + // Grafana, delete app + // TODO, fix this by fixing methods for setting up grafana datasource + if is_env_production() { + if let Err(err) = handle_grafana_delete_app(&grafana_conf, &request.app_id).await { + error!("Failed to delete app from grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + } + } + + // If nothing failed commit the transaction + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + return Ok(Json(())); + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get app by app id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } +} + +#[cfg(feature = "cloud_intsegration_tests")] +#[cfg(test)] +mod tests { + use crate::{ + env::JWT_SECRET, + http::cloud::{ + delete_app::HttpDeleteAppRequest, register_new_app::HttpRegisterNewAppRequest, + }, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + add_test_app, add_test_team, add_user_to_test_team, convert_response, create_test_app, + generate_valid_name, get_test_app_data, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_delete_app() { + let test_app = create_test_app(false).await; + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + let (user_token, user_email, _password) = register_and_login_random_user(&test_app).await; + + // Register new team + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + + // unwrap err as it should have failed + let app_id = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: generate_valid_name(), + }; + let app_id_2 = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + let _ = + add_user_to_test_team(&team_id, &user_email, &auth_token, &user_token, &test_app).await; + + let request = HttpDeleteAppRequest { + app_id: app_id.clone(), + }; + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&request).unwrap(); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::DeleteApp.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + convert_response::<()>(response).await.unwrap(); + let err = get_test_app_data(&team_id, &app_id, &auth_token, &test_app) + .await + .unwrap_err(); + + assert_eq!(err.to_string(), "App not found".to_string()); + assert!( + get_test_app_data(&team_id, &app_id_2, &auth_token, &test_app) + .await + .is_ok() + ); + } +} diff --git a/server/src/http/cloud/delete_passkey.rs b/server/src/http/cloud/delete_passkey.rs new file mode 100644 index 00000000..1df31988 --- /dev/null +++ b/server/src/http/cloud/delete_passkey.rs @@ -0,0 +1,127 @@ +use crate::{ + middlewares::auth_middleware::UserId, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::db::Db; +use garde::Validate; +use log::{error, warn}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use webauthn_rs::prelude::PublicKeyCredential; +use webauthn_rs::Webauthn; + +#[derive(Validate, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HttpDeletePasskeyRequest { + #[garde(skip)] + pub passkey_id: String, + #[garde(skip)] + pub credential: PublicKeyCredential, +} + +pub async fn delete_passkey( + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Extension(user_id): Extension, + Json(payload): Json, +) -> Result, (StatusCode, String)> { + // Get cache data + let sessions_key = SessionsCacheKey::Passkey2FA(user_id.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::Passkey2FA(session)) => session, + _ => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Finish passkey authentication + if let Err(err) = web_auth.finish_passkey_authentication( + &payload.credential, + &session_data.passkey_verification_state, + ) { + warn!( + "Failed to finish passkey authentication: {:?}, user_id: {}", + err, user_id + ); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidPasskeyCredential.to_string(), + )); + } + + // Get user data + let user_data = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user_data)) => user_data, + Ok(None) => { + error!("User does not exists: user_id: {}", user_id); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); + } + Err(err) => { + error!( + "Failed to check if user exists: {:?}, user_id: {}", + err, user_id + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Get user passkeys + let mut passkeys = match user_data.passkeys { + Some(passkey) => passkey, + None => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotHavePasskey.to_string(), + )); + } + }; + + // Remove passkey + match passkeys + .iter() + .position(|x| x.cred_id().to_string() == payload.passkey_id) + { + Some(index) => { + // Remove passkey + passkeys.remove(index); + } + None => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::PasskeyDoesNotExist.to_string(), + )) + } + } + + // Update user passkeys in database + if let Err(err) = db.update_passkeys(&user_data.email, &passkeys).await { + error!( + "Failed to update user passkeys: {:?}, user_id: {}", + err, user_id + ); + + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + return Ok(Json(())); +} diff --git a/server/src/http/cloud/delete_team.rs b/server/src/http/cloud/delete_team.rs new file mode 100644 index 00000000..4c39621c --- /dev/null +++ b/server/src/http/cloud/delete_team.rs @@ -0,0 +1,268 @@ +use super::utils::{custom_validate_uuid, validate_request}; +use crate::{ + env::is_env_production, + http::cloud::grafana_utils::delete_team::handle_grafana_delete_team, + middlewares::auth_middleware::UserId, + structs::cloud::{api_cloud_errors::CloudApiErrors, app_info::AppInfo}, + utils::start_transaction, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::db::Db; +use garde::Validate; +use log::{error, warn}; +use openapi::apis::configuration::Configuration; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpDeleteTeamRequest { + #[garde(custom(custom_validate_uuid))] + pub team_id: String, +} + +pub async fn delete_team( + State(db): State>, + State(grafana_conf): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + warn!("Delete team request: {:?}", request); + // Start a transaction + let mut tx = start_transaction(&db).await?; + + // First check if team exists + let team = match db.get_team_by_team_id(None, &request.team_id).await { + Ok(Some(team)) => { + if team.team_admin_id != user_id { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + + // Check if team is active + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + team + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get app by app id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Delete the team + if let Err(err) = db.deactivate_team(&mut tx, &request.team_id).await { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to deactivate team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Delete all team invites + if let Err(err) = db.cancel_all_team_invites(&mut tx, &request.team_id).await { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to deactivate app: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Get team apps + let registered_apps: Vec = match db.get_registered_apps_by_team_id(&team.team_id).await + { + Ok(apps) => apps.into_iter().map(|app| app.into()).collect(), + Err(err) => { + error!("Failed to get registered apps by team_id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Delete team apps, privileges and domain verifications + for app in registered_apps.iter() { + if let Err(err) = db + .delete_domain_verification_for_inactive_app(&mut tx, &app.app_id) + .await + { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to create app: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + if let Err(err) = db + .remove_privileges_for_inactive_app_within_tx(&mut tx, &app.app_id) + .await + { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to create app: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + if let Err(err) = db.deactivate_app(&mut tx, &app.app_id).await { + let _ = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)); + error!("Failed to deactivate app: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Grafana, delete team + // TODO, fix this by fixing methods for setting up grafana datasource + if is_env_production() { + let team_grafana_id = match team.grafana_id { + Some(grafana_id) => grafana_id, + None => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::TeamWithoutGrafanaId.to_string(), + )); + } + }; + + if let Err(err) = handle_grafana_delete_team(&grafana_conf, &team_grafana_id).await { + error!("Failed to delete team from grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + }; + } + + // If nothing failed commit the transaction + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + return Ok(Json(())); +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use crate::{ + env::JWT_SECRET, + http::cloud::{ + delete_team::HttpDeleteTeamRequest, register_new_app::HttpRegisterNewAppRequest, + }, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + add_test_app, add_test_team, add_user_to_test_team, convert_response, create_test_app, + generate_valid_name, get_test_team_data, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_delete_team() { + let test_app = create_test_app(false).await; + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + let (user_token, user_email, _password) = register_and_login_random_user(&test_app).await; + + // Register new team + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + + // unwrap err as it should have failed + add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + let _ = + add_user_to_test_team(&team_id, &user_email, &auth_token, &user_token, &test_app).await; + + let request = HttpDeleteTeamRequest { + team_id: team_id.clone(), + }; + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&request).unwrap(); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let team = get_test_team_data(&team_id, &auth_token, &test_app) + .await + .unwrap(); + assert_eq!(team.team_metadata.team_id, team_id.clone()); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::DeleteTeam.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + let _ = convert_response::<()>(response).await.unwrap(); + let err = get_test_team_data(&team_id, &auth_token, &test_app) + .await + .unwrap_err(); + + assert_eq!(err.to_string(), "TeamDoesNotExist".to_string()); + } +} diff --git a/server/src/http/cloud/domains/cancel_pending_domain_request.rs b/server/src/http/cloud/domains/cancel_pending_domain_request.rs new file mode 100644 index 00000000..6bd0ca48 --- /dev/null +++ b/server/src/http/cloud/domains/cancel_pending_domain_request.rs @@ -0,0 +1,142 @@ +use crate::{ + http::cloud::utils::{custom_validate_domain_name, custom_validate_uuid}, + middlewares::auth_middleware::UserId, + structs::cloud::api_cloud_errors::CloudApiErrors, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::{db::Db, structs::privilege_level::PrivilegeLevel}; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpCancelPendingDomainVerificationRequest { + #[garde(custom(custom_validate_uuid))] + pub app_id: String, + #[garde(skip)] + pub domain_name: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpCancelPendingDomainVerificationResponse {} + +pub async fn cancel_pending_domain_request( + State(db): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate domain name + let domain_name = custom_validate_domain_name(&request.domain_name).map_err(|e| { + error!("Failed to validate domain name: {:?}", e); + ( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidDomainName.to_string(), + ) + })?; + + // Check if app exists and get data + let app = match db.get_registered_app_by_app_id(&request.app_id).await { + Ok(Some(app)) => { + if app.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )); + } + app + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )) + } + Err(err) => { + error!("Failed to check if app exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user has sufficient permissions + match db + .get_privilege_by_user_id_and_app_id(&user_id, &request.app_id) + .await + { + Ok(Some(privilege)) => { + // User needs to have admin privileges + if privilege.privilege_level != PrivilegeLevel::Admin { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user has sufficient permissions: {:?}", + err + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Check if domain is whitelisted + if app.whitelisted_domains.contains(&domain_name) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainAlreadyVerified.to_string(), + )); + } + + // Check if there is a pending domain verification + match db + .get_pending_domain_verification_by_domain_name_and_app_id(&domain_name, &request.app_id) + .await + { + Ok(Some(_)) => { + // Cancel domain verification + if let Err(err) = db + .cancel_domain_verification(&domain_name, &request.app_id) + .await + { + error!("Failed to cancel domain verification: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::NoPendingDomainVerification.to_string(), + )); + } + Err(err) => { + error!("Failed to check if domain verification exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + return Ok(Json(HttpCancelPendingDomainVerificationResponse {})); +} diff --git a/server/src/http/cloud/domains/mod.rs b/server/src/http/cloud/domains/mod.rs new file mode 100644 index 00000000..d1c9703c --- /dev/null +++ b/server/src/http/cloud/domains/mod.rs @@ -0,0 +1,4 @@ +pub mod cancel_pending_domain_request; +pub mod remove_whitelisted_domain; +pub mod verify_domain_finish; +pub mod verify_domain_start; diff --git a/server/src/http/cloud/domains/remove_whitelisted_domain.rs b/server/src/http/cloud/domains/remove_whitelisted_domain.rs new file mode 100644 index 00000000..c9217d02 --- /dev/null +++ b/server/src/http/cloud/domains/remove_whitelisted_domain.rs @@ -0,0 +1,269 @@ +use crate::{ + http::cloud::utils::{custom_validate_domain_name, custom_validate_uuid}, + middlewares::auth_middleware::UserId, + structs::cloud::api_cloud_errors::CloudApiErrors, + utils::start_transaction, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::{db::Db, structs::privilege_level::PrivilegeLevel}; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpRemoveWhitelistedDomainRequest { + #[garde(custom(custom_validate_uuid))] + pub app_id: String, + #[garde(skip)] + pub domain_name: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpRemoveWhitelistedDomainResponse {} + +pub async fn remove_whitelisted_domain( + State(db): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate domain name + let domain_name = custom_validate_domain_name(&request.domain_name).map_err(|e| { + error!("Failed to validate domain name: {:?}", e); + ( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidDomainName.to_string(), + ) + })?; + + // Check if app exists and get data + let app = match db.get_registered_app_by_app_id(&request.app_id).await { + Ok(Some(app)) => { + if app.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )); + } + app + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )) + } + Err(err) => { + error!("Failed to check if app exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user has sufficient permissions + match db + .get_privilege_by_user_id_and_app_id(&user_id, &request.app_id) + .await + { + Ok(Some(privilege)) => { + // User needs to have admin privileges + if privilege.privilege_level != PrivilegeLevel::Admin { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user has sufficient permissions: {:?}", + err + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Check if domain is whitelisted + if !app.whitelisted_domains.contains(&domain_name) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainNotFound.to_string(), + )); + } + + let mut tx = start_transaction(&db).await?; + + // Remove domain from whitelisted domains + if let Err(err) = db + .remove_whitelisted_domain(&mut tx, &request.app_id, &domain_name) + .await + { + error!( + "Failed to remove domain from whitelisted domains: {:?}", + err + ); + + if let Err(err) = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)) + { + error!("Failed to rollback transaction: {:?}", err); + } + + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + if let Err(err) = db + .delete_domain_verification(&mut tx, &domain_name, &request.app_id) + .await + { + error!("Failed to delete domain verification: {:?}", err); + + if let Err(err) = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)) + { + error!("Failed to rollback transaction: {:?}", err); + } + + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + return Ok(Json(HttpRemoveWhitelistedDomainResponse {})); +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + env::JWT_SECRET, + http::cloud::register_new_app::HttpRegisterNewAppRequest, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + add_test_app, add_test_team, convert_response, create_test_app, generate_valid_name, + get_test_app_data, register_and_login_random_user, verify_new_domain, + }, + }; + use axum::{ + body::Body, + extract::{ConnectInfo, Request}, + http::Method, + }; + use database::structs::{ + domain_verification_status::DomainVerificationStatus, whitelisted_domain::WhitelistedDomain, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_remove_domain() { + let test_app = create_test_app(false).await; + + // Register new user + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + + // Register new team + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + + let app_id = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + + // Add new domain + let domain_name = "test-domain.com".to_string(); + verify_new_domain(&domain_name, &app_id, &auth_token, &test_app) + .await + .unwrap(); + + // Get app data and check if domain is whitelisted + let app_data = get_test_app_data(&team_id, &app_id, &auth_token, &test_app) + .await + .unwrap(); + + let expected = WhitelistedDomain { + domain: domain_name.clone(), + status: DomainVerificationStatus::Verified, + }; + + assert!(app_data.whitelisted_domains.contains(&expected)); + + // Remove domain + let request = HttpRemoveWhitelistedDomainRequest { + domain_name: domain_name.clone(), + app_id: app_id.clone(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&request).unwrap(); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::RemoveWhitelistedDomain.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let _ = convert_response::(response) + .await + .unwrap(); + + // Get app data and check if domain was removed + let app_data = get_test_app_data(&team_id, &app_id, &auth_token, &test_app) + .await + .unwrap(); + + assert!(!app_data.whitelisted_domains.contains(&expected)); + } +} diff --git a/server/src/http/cloud/domains/verify_domain_finish.rs b/server/src/http/cloud/domains/verify_domain_finish.rs new file mode 100644 index 00000000..95847b25 --- /dev/null +++ b/server/src/http/cloud/domains/verify_domain_finish.rs @@ -0,0 +1,269 @@ +use crate::{ + cloud_state::DnsResolver, + env::is_env_production, + http::cloud::utils::{custom_validate_domain_name, custom_validate_uuid}, + middlewares::auth_middleware::UserId, + structs::cloud::api_cloud_errors::CloudApiErrors, + utils::start_transaction, +}; +use anyhow::bail; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::{db::Db, structs::privilege_level::PrivilegeLevel}; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpVerifyDomainFinishRequest { + #[garde(custom(custom_validate_uuid))] + pub app_id: String, + #[garde(skip)] + pub domain_name: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpVerifyDomainFinishResponse {} + +pub async fn verify_domain_finish( + State(db): State>, + State(dns_resolver): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate domain name + let domain_name = custom_validate_domain_name(&request.domain_name).map_err(|e| { + error!("Failed to validate domain name: {:?}", e); + ( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidDomainName.to_string(), + ) + })?; + + // Check if app exists and get data + let app = match db.get_registered_app_by_app_id(&request.app_id).await { + Ok(Some(app)) => { + if app.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )); + } + app + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )) + } + Err(err) => { + error!("Failed to check if app exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user has sufficient permissions + match db + .get_privilege_by_user_id_and_app_id(&user_id, &request.app_id) + .await + { + Ok(Some(privilege)) => { + // User needs to have admin privileges + if privilege.privilege_level != PrivilegeLevel::Admin { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user has sufficient permissions: {:?}", + err + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Check if domain is already verified + if app.whitelisted_domains.contains(&domain_name) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainAlreadyVerified.to_string(), + )); + } + + // Additional check + match db + .get_finished_domain_verification_by_domain_name(&domain_name) + .await + { + Ok(Some(verified)) => { + // Check if the domain is verified for the same app or if someone else verified it + if verified.app_id == request.app_id { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainAlreadyVerified.to_string(), + )); + } else { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainAlreadyVerifiedByAnotherApp.to_string(), + )); + } + } + Ok(None) => { + // Continue + } + Err(err) => { + error!( + "Failed to check if domain verification already finished: {:?}", + err + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Get challenge data + let domain_verification_challenge = match db + .get_pending_domain_verification_by_domain_name_and_app_id(&domain_name, &request.app_id) + .await + { + Ok(Some(challenge)) => challenge, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainVerificationNotStarted.to_string(), + )) + } + Err(err) => { + error!("Failed to get domain verification challenge: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Validate the code + // Attempt to resolve the TXT records for the given domain, only on PROD + if is_env_production() { + if let Err(err) = check_verification_code( + &dns_resolver, + &domain_name, + &domain_verification_challenge.code, + ) + .await + { + error!("Failed to verify domain: {:?}, err: {:?}", domain_name, err); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainVerificationFailure.to_string(), + )); + } + } + + // Add domain to whitelist + let mut tx = start_transaction(&db).await?; + + if let Err(err) = db + .add_new_whitelisted_domain(&mut tx, &request.app_id, &domain_name) + .await + { + if let Err(err) = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)) + { + error!("Failed to rollback transaction: {:?}", err); + } + + error!("Failed to add domain to whitelist: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Update domain verification entry + if let Err(err) = db + .finish_domain_verification(&mut tx, &domain_name, &request.app_id) + .await + { + if let Err(err) = tx + .rollback() + .await + .map_err(|err| error!("Failed to rollback transaction: {:?}", err)) + { + error!("Failed to rollback transaction: {:?}", err); + } + + error!("Failed to finish domain verification: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Commit transaction + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + Ok(Json(HttpVerifyDomainFinishResponse {})) +} + +async fn check_verification_code( + dns_resolver: &Arc, + domain_name: &String, + code: &str, +) -> anyhow::Result<()> { + match dns_resolver.txt_lookup(domain_name.clone()).await { + Ok(txt_response) => { + // Iterate through each TXT record found + for txt in txt_response.iter() { + let txt_data = txt.txt_data(); + // Each TXT record can contain multiple strings, so we iterate through them all + for txt_str in txt_data { + let txt_str = match std::str::from_utf8(txt_str) { + Ok(txt_str) => txt_str, + Err(err) => bail!("Failed to parse TXT record: {:?}", err), + }; + // Check if the verification code is present + if txt_str.contains(&code) { + return Ok(()); + } + } + } + bail!("Verification code not found in TXT records"); + } + Err(_) => { + bail!("Failed to resolve TXT records"); + } + } +} diff --git a/server/src/http/cloud/domains/verify_domain_start.rs b/server/src/http/cloud/domains/verify_domain_start.rs new file mode 100644 index 00000000..18b32134 --- /dev/null +++ b/server/src/http/cloud/domains/verify_domain_start.rs @@ -0,0 +1,182 @@ +use crate::{ + http::cloud::utils::{custom_validate_domain_name, custom_validate_uuid}, + middlewares::auth_middleware::UserId, + structs::cloud::api_cloud_errors::CloudApiErrors, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::{db::Db, structs::privilege_level::PrivilegeLevel}; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpVerifyDomainStartRequest { + #[garde(custom(custom_validate_uuid))] + pub app_id: String, + #[garde(skip)] + pub domain_name: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpVerifyDomainStartResponse { + pub code: String, +} + +pub async fn verify_domain_start( + State(db): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate domain name + let domain_name = custom_validate_domain_name(&request.domain_name).map_err(|e| { + error!("Failed to validate domain name: {:?}", e); + ( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidDomainName.to_string(), + ) + })?; + + // Check if app exists and get data + let app = match db.get_registered_app_by_app_id(&request.app_id).await { + Ok(Some(app)) => { + if app.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )); + } + app + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppDoesNotExist.to_string(), + )) + } + Err(err) => { + error!("Failed to check if app exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user has sufficient permissions + match db + .get_privilege_by_user_id_and_app_id(&user_id, &request.app_id) + .await + { + Ok(Some(privilege)) => { + // User needs to have admin privileges + if privilege.privilege_level != PrivilegeLevel::Admin { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user has sufficient permissions: {:?}", + err + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Check if domain is already verified + if app.whitelisted_domains.contains(&domain_name) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainAlreadyVerified.to_string(), + )); + } + + // Check if challenge already exists + let verification_code = match db + .get_pending_domain_verification_by_domain_name_and_app_id(&domain_name, &request.app_id) + .await + { + Ok(Some(challenge)) => challenge.code, + Ok(None) => { + // Challenge does not exist, generate new code + let code = + format!("TXT NCC verification code {}", uuid7::uuid7().to_string()).to_string(); + + // Save challenge to the database + if let Err(err) = db + .create_new_domain_verification_entry(&domain_name, &request.app_id, &code) + .await + { + error!("Failed to save challenge to the database: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + code + } + Err(err) => { + error!("Failed to check if challenge exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Additional check, if domain is already verified by someone else + match db + .get_finished_domain_verification_by_domain_name(&domain_name) + .await + { + Ok(Some(verified)) => { + // Check if the domain is verified for the same app or if someone else verified it + if verified.app_id == request.app_id { + // Kinda impossible to reach this point, but just in case + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainAlreadyVerified.to_string(), + )); + } else { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::DomainAlreadyVerifiedByAnotherApp.to_string(), + )); + } + } + Ok(None) => { + // Continue + } + Err(err) => { + error!( + "Failed to check if domain verification already finished: {:?}", + err + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + Ok(Json(HttpVerifyDomainStartResponse { + code: verification_code, + })) +} diff --git a/server/src/http/cloud/events/events.rs b/server/src/http/cloud/events/events.rs index ae8c1f83..0e52273e 100644 --- a/server/src/http/cloud/events/events.rs +++ b/server/src/http/cloud/events/events.rs @@ -1,4 +1,5 @@ use super::events_handler::process_event; +use crate::http::cloud::utils::extract_domain_name; use crate::ip_geolocation::GeolocationRequester; use crate::state::Sessions; use crate::structs::cloud::cloud_events::events::EventData; @@ -8,7 +9,7 @@ use crate::{ use axum::extract::ConnectInfo; use axum::{extract::State, http::StatusCode, Json}; use database::db::Db; -use log::error; +use log::{error, warn}; use serde::{Deserialize, Serialize}; use std::net::SocketAddr; use std::sync::Arc; @@ -19,34 +20,42 @@ use ts_rs::TS; #[serde(rename_all = "camelCase")] pub struct HttpNightlyConnectCloudEvent { pub app_id: String, + pub network: String, pub event: EventData, } pub async fn events( ConnectInfo(ip): ConnectInfo, - State(db): State>>, - State(geo_loc_requester): State>>, + State(db): State>, + State(geo_loc_requester): State>, State(sessions): State, Origin(origin): Origin, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Check if the feature is enabled - let (db, geolocation_requester) = match (&db, &geo_loc_requester) { - (Some(db), Some(geo)) => (db, geo), - _ => { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - )); - } - }; + println!("Received event: {:?}", request); + println!("Origin: {:?}", origin); + // Check if origin was provided + let origin = origin.ok_or(( + StatusCode::FORBIDDEN, + CloudApiErrors::OriginHeaderRequired.to_string(), + ))?; + + let domain_name = extract_domain_name(&origin).map_err(|err| { + warn!("{}", err); + ( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidDomainName.to_string(), + ) + })?; + + println!("Domain name: {:?}", domain_name); // Check if origin and app_id match in the database - match db.get_registered_app_by_app_id(&origin).await { + match db.get_registered_app_by_app_id(&request.app_id).await { Ok(Some(app)) => { app.whitelisted_domains .iter() - .find(|&d| d == &origin) + .find(|&d| d == &domain_name) .ok_or(( StatusCode::FORBIDDEN, CloudApiErrors::UnauthorizedOriginError.to_string(), @@ -68,7 +77,7 @@ pub async fn events( } // Process the event - process_event(request, ip, &db, &geolocation_requester, &sessions).await; + process_event(request, ip, &db, &geo_loc_requester, &sessions).await; return Ok(Json(())); } diff --git a/server/src/http/cloud/events/events_handler.rs b/server/src/http/cloud/events/events_handler.rs index 7e26326f..4c8b3318 100644 --- a/server/src/http/cloud/events/events_handler.rs +++ b/server/src/http/cloud/events/events_handler.rs @@ -4,7 +4,9 @@ use super::{ process_event_app_connect::process_event_app_connect, process_event_app_disconnect::process_event_app_disconnect, process_event_change_network::process_event_change_network, + process_event_change_network_resolve::process_event_change_network_resolve, process_event_change_wallet::process_event_change_wallet, + process_event_change_wallet_resolve::process_event_change_wallet_resolve, process_event_client_connect::process_event_client_connect_init, process_event_client_connect_resolve::process_event_client_connect_resolve, process_event_client_disconnect::process_event_client_disconnect, @@ -35,6 +37,7 @@ pub async fn process_event( process_event_app_connect( event, &event_payload.app_id, + &event_payload.network, ip, db_connection, geo_loc_requester, @@ -43,12 +46,20 @@ pub async fn process_event( .await; } EventData::AppDisconnect(event) => { - process_event_app_disconnect(event, &event_payload.app_id, ip, db_connection).await; + process_event_app_disconnect( + event, + &event_payload.app_id, + &event_payload.network, + ip, + db_connection, + ) + .await; } EventData::ClientConnect(event) => { process_event_client_connect_init( event, &event_payload.app_id, + &event_payload.network, ip, db_connection, geo_loc_requester, @@ -60,24 +71,48 @@ pub async fn process_event( .await; } EventData::ClientDisconnect(event) => { - process_event_client_disconnect(event, &event_payload.app_id, ip, db_connection).await; + process_event_client_disconnect( + event, + &event_payload.app_id, + &event_payload.network, + ip, + db_connection, + ) + .await; } EventData::SignMessage(event) => { - process_event_sign_message(event, &event_payload.app_id, db_connection).await; + process_event_sign_message( + event, + &event_payload.app_id, + &event_payload.network, + db_connection, + ) + .await; } EventData::SignMessageResolve(event) => { process_event_sign_message_resolve(event, &event_payload.app_id, db_connection).await; } EventData::SignTransaction(event) => { - process_event_sign_transaction(event, &event_payload.app_id, db_connection).await; + process_event_sign_transaction( + event, + &event_payload.app_id, + &event_payload.network, + db_connection, + ) + .await; } EventData::SignTransactionResolve(event) => { process_event_sign_transaction_resolve(event, &event_payload.app_id, db_connection) .await; } EventData::SignAndSendTransaction(event) => { - process_event_sign_and_send_transaction(event, &event_payload.app_id, db_connection) - .await; + process_event_sign_and_send_transaction( + event, + &event_payload.app_id, + &event_payload.network, + db_connection, + ) + .await; } EventData::SignAndSendTransactionResolve(event) => { process_event_sign_and_send_transaction_resolve( @@ -88,10 +123,28 @@ pub async fn process_event( .await; } EventData::ChangeNetwork(event) => { - process_event_change_network(event, &event_payload.app_id, db_connection).await; + process_event_change_network( + event, + &event_payload.app_id, + &event_payload.network, + db_connection, + ) + .await; + } + EventData::ChangeNetworkResolve(event) => { + process_event_change_network_resolve(event, &event_payload.app_id, db_connection).await; } EventData::ChangeWallet(event) => { - process_event_change_wallet(event, &event_payload.app_id, db_connection).await; + process_event_change_wallet( + event, + &event_payload.app_id, + &event_payload.network, + db_connection, + ) + .await; + } + EventData::ChangeWalletResolve(event) => { + process_event_change_wallet_resolve(event, &event_payload.app_id, db_connection).await; } } } diff --git a/server/src/http/cloud/events/processors/process_event_app_connect.rs b/server/src/http/cloud/events/processors/process_event_app_connect.rs index 4b70b9ba..73dc4ed0 100644 --- a/server/src/http/cloud/events/processors/process_event_app_connect.rs +++ b/server/src/http/cloud/events/processors/process_event_app_connect.rs @@ -1,8 +1,8 @@ use crate::{ - ip_geolocation::GeolocationRequester, state::Sessions, - structs::cloud::cloud_events::event_types::app_connect_event::AppConnectEvent, - utils::get_geolocation_data, + http::cloud::utils::get_geolocation_data, ip_geolocation::GeolocationRequester, + state::Sessions, structs::cloud::cloud_events::event_types::app_connect_event::AppConnectEvent, }; +use chrono::{DateTime, Utc}; use database::{ db::Db, structs::event_type::EventType, @@ -17,13 +17,16 @@ use std::{net::SocketAddr, sync::Arc}; pub async fn process_event_app_connect( event: &AppConnectEvent, app_id: &String, + network: &String, ip: SocketAddr, db: &Arc, geo_loc_requester: &Arc, sessions: &Sessions, ) { + let current_timestamp = get_current_datetime(); + // Save event to Db - save_event_app_connect(db, app_id, event).await; + save_event_app_connect(db, app_id, network, event, ¤t_timestamp).await; if event.new_session { // New session, get the data from sessions and create a new session in the database @@ -73,7 +76,12 @@ pub async fn process_event_app_connect( // Should not fail, but if it does then we will have a problem if let Err(err) = db - .handle_new_session(&session_data, geo_location_data, &ip.to_string()) + .handle_new_session( + &session_data, + geo_location_data, + &ip.to_string(), + ¤t_timestamp, + ) .await { error!( @@ -83,7 +91,16 @@ pub async fn process_event_app_connect( } } else { // Reconnection to an existing session - let mut tx = db.connection_pool.begin().await.unwrap(); + let mut tx = match db.connection_pool.begin().await { + Ok(tx) => tx, + Err(err) => { + error!( + "Failed to create new transaction to save app connection event, app_id: [{}], event: [{:?}], err: [{}]", + app_id, event, err + ); + return; + } + }; // Get the geolocation data let geo_location_data = get_geolocation_data(&db, &geo_loc_requester, &ip).await; @@ -93,8 +110,10 @@ pub async fn process_event_app_connect( &mut tx, &event.session_id, &app_id, + &network, &ip.to_string(), geo_location_data, + ¤t_timestamp, ) .await { @@ -117,7 +136,13 @@ pub async fn process_event_app_connect( } } -async fn save_event_app_connect(db: &Arc, app_id: &String, event: &AppConnectEvent) { +async fn save_event_app_connect( + db: &Arc, + app_id: &String, + network: &String, + event: &AppConnectEvent, + creation_timestamp: &DateTime, +) { // Establish a new transaction let mut tx = match db.connection_pool.begin().await { Ok(tx) => tx, @@ -132,7 +157,13 @@ async fn save_event_app_connect(db: &Arc, app_id: &String, event: &AppConnec // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::AppConnect) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &EventType::AppConnect, + &creation_timestamp, + ) .await { Ok(event_id) => event_id, @@ -154,19 +185,36 @@ async fn save_event_app_connect(db: &Arc, app_id: &String, event: &AppConnec } }; + if let Err(err) = db.add_new_network(&mut tx, network).await { + error!( + "Failed to add new network, app_id: [{}], event: [{:?}], err: [{}]", + app_id, event, err + ); + + // Rollback the transaction + if let Err(err) = tx.rollback().await { + error!( + "Failed to rollback transaction for new app connection event, app_id: [{}], event: [{:?}], err: [{}]", + app_id, event, err + ); + } + + return; + } + // Now create a new event app connect corresponding to the event match db .create_new_event_app_connect( &mut tx, event_id, + app_id, + network, &event.session_id, - &event - .device_metadata - .to_string() - .unwrap_or("Failed to serialize device metadata".to_string()), + &event.device_metadata, &event.language, &event.timezone, event.new_session, + &creation_timestamp, ) .await { diff --git a/server/src/http/cloud/events/processors/process_event_app_disconnect.rs b/server/src/http/cloud/events/processors/process_event_app_disconnect.rs index 77ff8b19..67dc8d93 100644 --- a/server/src/http/cloud/events/processors/process_event_app_disconnect.rs +++ b/server/src/http/cloud/events/processors/process_event_app_disconnect.rs @@ -1,16 +1,17 @@ use crate::structs::cloud::cloud_events::event_types::app_disconnect_event::AppDisconnectEvent; -use database::{db::Db, structs::event_type::EventType}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::{net::SocketAddr, sync::Arc}; pub async fn process_event_app_disconnect( event: &AppDisconnectEvent, app_id: &String, + network: &String, ip: SocketAddr, db: &Arc, ) { // Save event to Db - save_event_app_disconnect(db, app_id, event).await; + save_event_app_disconnect(db, app_id, network, event).await; // Close app disconnect in the database if let Err(err) = db.close_app_connection(&event.session_id, &app_id).await { @@ -21,7 +22,12 @@ pub async fn process_event_app_disconnect( } } -async fn save_event_app_disconnect(db: &Arc, app_id: &String, event: &AppDisconnectEvent) { +async fn save_event_app_disconnect( + db: &Arc, + app_id: &String, + network: &String, + event: &AppDisconnectEvent, +) { // Establish a new transaction let mut tx = match db.connection_pool.begin().await { Ok(tx) => tx, @@ -36,7 +42,13 @@ async fn save_event_app_disconnect(db: &Arc, app_id: &String, event: &AppDis // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::AppDisconnect) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &EventType::AppDisconnect, + &get_current_datetime(), + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/events/processors/process_event_change_network.rs b/server/src/http/cloud/events/processors/process_event_change_network.rs index 987ac81b..461999b5 100644 --- a/server/src/http/cloud/events/processors/process_event_change_network.rs +++ b/server/src/http/cloud/events/processors/process_event_change_network.rs @@ -1,11 +1,12 @@ use crate::structs::cloud::cloud_events::event_types::change_network_event::ChangeNetworkEvent; -use database::{db::Db, structs::event_type::EventType}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::sync::Arc; pub async fn process_event_change_network( event: &ChangeNetworkEvent, app_id: &String, + network: &String, db: &Arc, ) { // Establish a new transaction @@ -22,7 +23,13 @@ pub async fn process_event_change_network( // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::ChangeNetwork) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &EventType::ChangeNetwork, + &get_current_datetime(), + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/events/processors/process_event_change_wallet.rs b/server/src/http/cloud/events/processors/process_event_change_wallet.rs index fd1fde1e..1e18164a 100644 --- a/server/src/http/cloud/events/processors/process_event_change_wallet.rs +++ b/server/src/http/cloud/events/processors/process_event_change_wallet.rs @@ -1,9 +1,14 @@ use crate::structs::cloud::cloud_events::event_types::change_wallet_event::ChangeWalletEvent; -use database::{db::Db, structs::event_type::EventType}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::sync::Arc; -pub async fn process_event_change_wallet(event: &ChangeWalletEvent, app_id: &String, db: &Arc) { +pub async fn process_event_change_wallet( + event: &ChangeWalletEvent, + app_id: &String, + network: &String, + db: &Arc, +) { // Establish a new transaction let mut tx = match db.connection_pool.begin().await { Ok(tx) => tx, @@ -18,7 +23,13 @@ pub async fn process_event_change_wallet(event: &ChangeWalletEvent, app_id: &Str // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::ChangeWallet) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &&EventType::ChangeWallet, + &get_current_datetime(), + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/events/processors/process_event_change_wallet_resolve.rs b/server/src/http/cloud/events/processors/process_event_change_wallet_resolve.rs index 576c4e0f..1cde8cfd 100644 --- a/server/src/http/cloud/events/processors/process_event_change_wallet_resolve.rs +++ b/server/src/http/cloud/events/processors/process_event_change_wallet_resolve.rs @@ -3,7 +3,7 @@ use database::{db::Db, structs::request_status::RequestStatus}; use log::error; use std::sync::Arc; -pub async fn process_event_change_network_resolve( +pub async fn process_event_change_wallet_resolve( event: &ChangeWalletResolveEvent, app_id: &String, db: &Arc, diff --git a/server/src/http/cloud/events/processors/process_event_client_connect.rs b/server/src/http/cloud/events/processors/process_event_client_connect.rs index 10f13a93..b62078d1 100644 --- a/server/src/http/cloud/events/processors/process_event_client_connect.rs +++ b/server/src/http/cloud/events/processors/process_event_client_connect.rs @@ -1,24 +1,36 @@ use crate::{ - ip_geolocation::GeolocationRequester, + http::cloud::utils::get_geolocation_data, ip_geolocation::GeolocationRequester, structs::cloud::cloud_events::event_types::client_connect_event::ClientConnectEvent, - utils::get_geolocation_data, }; -use database::{db::Db, structs::event_type::EventType}; +use chrono::{DateTime, Utc}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::{net::SocketAddr, sync::Arc}; pub async fn process_event_client_connect_init( event: &ClientConnectEvent, app_id: &String, + network: &String, ip: SocketAddr, db: &Arc, geo_loc_requester: &Arc, ) { + let current_time = get_current_datetime(); + // Save event to Db - save_event_client_connect(db, app_id, event).await; + save_event_client_connect(db, app_id, network, event, ¤t_time).await; // Save connection attempt by client - let mut tx = db.connection_pool.begin().await.unwrap(); + let mut tx = match db.connection_pool.begin().await { + Ok(tx) => tx, + Err(err) => { + error!( + "Failed to create new transaction to save client connect event, app_id: [{}], event: [{:?}], err: [{}]", + app_id, event, err + ); + return; + } + }; // Get the geolocation data let geo_location_data = get_geolocation_data(&db, &geo_loc_requester, &ip).await; @@ -27,10 +39,12 @@ pub async fn process_event_client_connect_init( .create_new_connection_event_by_client( &mut tx, &app_id, + &network, &event.session_id, &event.session_type, &ip.to_string(), geo_location_data, + ¤t_time, ) .await { @@ -52,7 +66,13 @@ pub async fn process_event_client_connect_init( } } -async fn save_event_client_connect(db: &Arc, app_id: &String, event: &ClientConnectEvent) { +async fn save_event_client_connect( + db: &Arc, + app_id: &String, + network: &String, + event: &ClientConnectEvent, + current_time: &DateTime, +) { // Establish a new transaction let mut tx = match db.connection_pool.begin().await { Ok(tx) => tx, @@ -67,7 +87,13 @@ async fn save_event_client_connect(db: &Arc, app_id: &String, event: &Client // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::ClientConnect) + .create_new_event_entry( + &mut tx, + &app_id, + network, + &EventType::ClientConnect, + ¤t_time, + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/events/processors/process_event_client_disconnect.rs b/server/src/http/cloud/events/processors/process_event_client_disconnect.rs index 8cf89a00..98f2ec8c 100644 --- a/server/src/http/cloud/events/processors/process_event_client_disconnect.rs +++ b/server/src/http/cloud/events/processors/process_event_client_disconnect.rs @@ -1,19 +1,32 @@ use crate::structs::cloud::cloud_events::event_types::client_disconnect_event::ClientDisconnectEvent; -use database::{db::Db, structs::event_type::EventType}; +use chrono::{DateTime, Utc}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::{net::SocketAddr, sync::Arc}; pub async fn process_event_client_disconnect( event: &ClientDisconnectEvent, app_id: &String, + network: &String, ip: SocketAddr, db: &Arc, ) { + let current_timestamp = get_current_datetime(); + // Save event to Db - save_event_client_disconnect(db, app_id, event).await; + save_event_client_disconnect(db, app_id, network, event, ¤t_timestamp).await; // Update connection status for user - let mut tx = db.connection_pool.begin().await.unwrap(); + let mut tx = match db.connection_pool.begin().await { + Ok(tx) => tx, + Err(err) => { + error!( + "Failed to create new transaction to update client disconnect status, app_id: [{}], event: [{:?}], err: [{}]", + app_id, event, err + ); + return; + } + }; match db .close_client_connection(&mut tx, &app_id, &event.disconnected_session_id) @@ -40,7 +53,9 @@ pub async fn process_event_client_disconnect( async fn save_event_client_disconnect( db: &Arc, app_id: &String, + network: &String, event: &ClientDisconnectEvent, + current_timestamp: &DateTime, ) { // Establish a new transaction let mut tx = match db.connection_pool.begin().await { @@ -56,7 +71,13 @@ async fn save_event_client_disconnect( // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::ClientDisconnect) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &EventType::ClientDisconnect, + current_timestamp, + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/events/processors/process_event_sign_and_send_transaction.rs b/server/src/http/cloud/events/processors/process_event_sign_and_send_transaction.rs index 875d6a2d..5271e024 100644 --- a/server/src/http/cloud/events/processors/process_event_sign_and_send_transaction.rs +++ b/server/src/http/cloud/events/processors/process_event_sign_and_send_transaction.rs @@ -1,11 +1,12 @@ use crate::structs::cloud::cloud_events::event_types::sign_and_send_transaction_event::SignAndSendTransactionEvent; -use database::{db::Db, structs::event_type::EventType}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::sync::Arc; pub async fn process_event_sign_and_send_transaction( event: &SignAndSendTransactionEvent, app_id: &String, + network: &String, db: &Arc, ) { // Establish a new transaction @@ -22,7 +23,13 @@ pub async fn process_event_sign_and_send_transaction( // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::SignAndSendTransaction) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &EventType::SignAndSendTransaction, + &get_current_datetime(), + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/events/processors/process_event_sign_message.rs b/server/src/http/cloud/events/processors/process_event_sign_message.rs index c964b301..f51692b2 100644 --- a/server/src/http/cloud/events/processors/process_event_sign_message.rs +++ b/server/src/http/cloud/events/processors/process_event_sign_message.rs @@ -1,9 +1,14 @@ use crate::structs::cloud::cloud_events::event_types::sign_message_event::SignMessageEvent; -use database::{db::Db, structs::event_type::EventType}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::sync::Arc; -pub async fn process_event_sign_message(event: &SignMessageEvent, app_id: &String, db: &Arc) { +pub async fn process_event_sign_message( + event: &SignMessageEvent, + app_id: &String, + network: &String, + db: &Arc, +) { // Establish a new transaction let mut tx = match db.connection_pool.begin().await { Ok(tx) => tx, @@ -18,7 +23,13 @@ pub async fn process_event_sign_message(event: &SignMessageEvent, app_id: &Strin // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::SignMessage) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &EventType::SignMessage, + &get_current_datetime(), + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/events/processors/process_event_sign_transaction.rs b/server/src/http/cloud/events/processors/process_event_sign_transaction.rs index c18dd78e..d55960ab 100644 --- a/server/src/http/cloud/events/processors/process_event_sign_transaction.rs +++ b/server/src/http/cloud/events/processors/process_event_sign_transaction.rs @@ -1,11 +1,12 @@ use crate::structs::cloud::cloud_events::event_types::sign_transaction_event::SignTransactionEvent; -use database::{db::Db, structs::event_type::EventType}; +use database::{db::Db, structs::event_type::EventType, tables::utils::get_current_datetime}; use log::error; use std::sync::Arc; pub async fn process_event_sign_transaction( event: &SignTransactionEvent, app_id: &String, + network: &String, db: &Arc, ) { // Establish a new transaction @@ -22,7 +23,13 @@ pub async fn process_event_sign_transaction( // Create a new event index let event_id = match db - .create_new_event_entry(&mut tx, &app_id, &EventType::SignTransaction) + .create_new_event_entry( + &mut tx, + &app_id, + &network, + &EventType::SignTransaction, + &get_current_datetime(), + ) .await { Ok(event_id) => event_id, diff --git a/server/src/http/cloud/get_events.rs b/server/src/http/cloud/get_events.rs index 79838b00..7bac2610 100644 --- a/server/src/http/cloud/get_events.rs +++ b/server/src/http/cloud/get_events.rs @@ -1,7 +1,8 @@ -use crate::middlewares::auth_middleware::UserId; -use crate::structs::cloud::api_cloud_errors::CloudApiErrors; -use crate::structs::cloud::app_event::AppEvent; -use crate::utils::{custom_validate_optional_pagination_cursor, custom_validate_uuid}; +use crate::{ + middlewares::auth_middleware::UserId, + structs::cloud::{api_cloud_errors::CloudApiErrors, app_event::AppEvent}, +}; +use axum::extract::Query; use axum::Extension; use axum::{extract::State, http::StatusCode, Json}; use database::db::Db; @@ -12,10 +13,12 @@ use serde::{Deserialize, Serialize}; use std::sync::Arc; use ts_rs::TS; +use super::utils::{custom_validate_optional_pagination_cursor, custom_validate_uuid}; + #[derive(Debug, Clone, Serialize, Deserialize, TS, Validate)] #[ts(export)] #[serde(rename_all = "camelCase")] -pub struct HttpGetAppEventsEventRequest { +pub struct HttpGetAppEventsRequest { #[garde(custom(custom_validate_uuid))] pub app_id: String, #[garde(custom(custom_validate_optional_pagination_cursor))] @@ -31,17 +34,11 @@ pub struct HttpGetAppEventsResponse { pub cursor: Option, } -pub async fn events( - State(db): State>>, +pub async fn get_events( + State(db): State>, Extension(user_id): Extension, - Json(request): Json, + Query(request): Query, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Check if user has sufficient permissions match db .get_privilege_by_user_id_and_app_id(&user_id, &request.app_id) @@ -83,3 +80,130 @@ pub async fn events( } } } + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + env::JWT_SECRET, + http::cloud::register_new_app::HttpRegisterNewAppRequest, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + add_test_app, add_test_team, convert_response, create_test_app, generate_valid_name, + register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_get_app_events() { + let test_app = create_test_app(false).await; + + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + + // Register new team + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + + // unwrap err as it should have failed + let app_id = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + + // Get team invites + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}?appId={app_id}", + HttpCloudEndpoint::GetEvents.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let res = convert_response::(response) + .await + .unwrap(); + + assert_eq!(res.events.len(), 0); + assert!(res.cursor.is_none()); + } + + #[tokio::test] + async fn test_get_app_events_forbidden() { + let test_app = create_test_app(false).await; + + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + + // Register new team + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + + // unwrap err as it should have failed + let app_id = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + + // Register new user + let (test_user_auth_token, _test_user_email, _test_user_password) = + register_and_login_random_user(&test_app).await; + + // Get team invites using new user token, should fail + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let auth = test_user_auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}?appId={app_id}", + HttpCloudEndpoint::GetEvents.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let res = convert_response::(response) + .await + .unwrap_err(); + + assert_eq!(res.to_string(), StatusCode::FORBIDDEN.to_string()); + } +} diff --git a/server/src/http/cloud/get_passkey_challenge.rs b/server/src/http/cloud/get_passkey_challenge.rs new file mode 100644 index 00000000..a478cbfb --- /dev/null +++ b/server/src/http/cloud/get_passkey_challenge.rs @@ -0,0 +1,82 @@ +use crate::{ + middlewares::auth_middleware::UserId, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, Passkey2FAVerification, SessionCache, SessionsCacheKey}, + }, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode}; +use axum::{Extension, Json}; +use database::db::Db; +use log::error; +use std::sync::Arc; +use webauthn_rs::prelude::RequestChallengeResponse; +use webauthn_rs::Webauthn; + +pub type HttpTwoFactorWithPasskeyStartResponse = RequestChallengeResponse; + +pub async fn get_passkey_challenge( + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Extension(user_id): Extension, +) -> Result, (StatusCode, String)> { + // Get user data + let user_data = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user_data)) => user_data, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user exists: {:?}, user_id: {}", + err, user_id + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + let passkey = match user_data.passkeys { + Some(passkey) => passkey, + None => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotHavePasskey.to_string(), + )); + } + }; + + // Save to cache passkey challenge request + let sessions_key = SessionsCacheKey::Passkey2FA(user_id.clone()).to_string(); + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + match web_auth.start_passkey_authentication(&passkey) { + Ok((rcr, auth_state)) => { + sessions_cache.set( + sessions_key, + SessionCache::Passkey2FA(Passkey2FAVerification { + email: user_data.email.clone(), + passkey_verification_state: auth_state, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + return Ok(Json(rcr)); + } + Err(_) => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )); + } + }; +} diff --git a/server/src/http/cloud/get_team_metadata.rs b/server/src/http/cloud/get_team_metadata.rs new file mode 100644 index 00000000..4196e84e --- /dev/null +++ b/server/src/http/cloud/get_team_metadata.rs @@ -0,0 +1,280 @@ +use super::utils::custom_validate_uuid; +use crate::{ + middlewares::auth_middleware::UserId, + structs::cloud::{ + api_cloud_errors::CloudApiErrors, app_info::AppInfo, team_metadata::TeamMetadata, + }, +}; +use axum::{ + extract::{Query, State}, + http::StatusCode, + Extension, Json, +}; +use database::{ + db::Db, structs::privilege_level::PrivilegeLevel, + tables::user_app_privileges::table_struct::UserAppPrivilege, +}; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpGetTeamMetadataRequest { + #[garde(custom(custom_validate_uuid))] + pub team_id: String, +} + +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpGetTeamMetadataResponse { + pub team_metadata: TeamMetadata, + pub team_apps: Vec, + pub team_members: Vec, +} + +pub async fn get_team_metadata( + State(db): State>, + Extension(user_id): Extension, + Query(request): Query, +) -> Result, (StatusCode, String)> { + // Get user data + match db.get_team_by_team_id(None, &request.team_id).await { + Ok(Some(team)) => { + // Check if user has privileges to access this team + let mut team_privileges = match db.get_privileges_by_team_id(&request.team_id).await { + Ok(privileges) => { + if team.team_admin_id != user_id + && !privileges + .iter() + .any(|privilege| privilege.user_id == user_id) + { + return Err(( + StatusCode::UNAUTHORIZED, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + + privileges + } + Err(err) => { + error!("Failed to get user privileges: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + if team_privileges.is_empty() && team.team_admin_id == user_id { + team_privileges.push(UserAppPrivilege { + user_id: user_id.clone(), + app_id: "".to_string(), + privilege_level: PrivilegeLevel::Admin, + creation_timestamp: team.registration_timestamp, + }) + } + // Get team admin email + let admin_email = match db.get_user_by_user_id(&team.team_admin_id).await { + Ok(Some(user)) => user.email, + Ok(None) => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + Err(err) => { + error!("Failed to get user by user_id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Get team data + let team_metadata = TeamMetadata { + creator_email: admin_email, + team_id: team.team_id.clone(), + team_name: team.team_name, + personal_team: team.personal, + created_at: team.registration_timestamp, + }; + + // Get team apps + let mut registered_apps: Vec = + match db.get_registered_apps_by_team_id(&team.team_id).await { + Ok(apps) => apps.into_iter().map(|app| app.into()).collect(), + Err(err) => { + error!("Failed to get registered apps by team_id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Get pending domain verifications + let app_ids = registered_apps + .iter() + .map(|app| app.app_id.clone()) + .collect::>(); + + if let Ok(mut pending_domain_verifications) = db + .get_pending_domain_verifications_by_app_ids(&app_ids) + .await + { + for app in registered_apps.iter_mut() { + if let Some(pending_domains) = pending_domain_verifications.get_mut(&app.app_id) + { + app.whitelisted_domains.append(pending_domains); + } + } + } + + // Get team users from team_privileges + let team_members_ids: Vec = team_privileges + .iter() + .map(|privilege| privilege.user_id.clone()) + .collect(); + + // Get users emails + let users_ids_emails = match db.get_users_emails_by_ids(&team_members_ids).await { + Ok(users_ids_emails) => users_ids_emails, + Err(err) => { + error!("Failed to get users ids: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + let team_members: Vec = users_ids_emails.values().cloned().collect(); + + // Return data to user + return Ok(Json(HttpGetTeamMetadataResponse { + team_metadata, + team_apps: registered_apps, + team_members, + })); + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + env::JWT_SECRET, + http::cloud::register_new_app::HttpRegisterNewAppRequest, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + add_test_app, add_test_team, add_user_to_test_team, convert_response, create_test_app, + generate_valid_name, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_get_team_metadata() { + let test_app = create_test_app(false).await; + + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + + // Register new team + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + + let _ = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + + // Register 10 users and invite them to the team + let mut users_email = Vec::new(); + for _ in 0..10 { + let (app_user_auth_token, app_user_email, _app_user_password) = + register_and_login_random_user(&test_app).await; + + // Invite user to the first three teams + add_user_to_test_team( + &team_id, + &app_user_email, + &auth_token, + &app_user_auth_token, + &test_app, + ) + .await + .unwrap(); + + users_email.push(app_user_email); + } + + // Get team metadata + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}?teamId={team_id}", + HttpCloudEndpoint::GetTeamMetadata.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let res = convert_response::(response) + .await + .unwrap(); + + assert_eq!(res.team_metadata.team_id, team_id); + assert_eq!(res.team_metadata.team_name, team_name); + assert_eq!(res.team_metadata.personal_team, false); + assert_eq!(res.team_members.len(), 11); + assert_eq!(res.team_apps.len(), 1); + + // Check if all users are in the team + for email in users_email { + assert!(res.team_members.contains(&email)); + } + } +} diff --git a/server/src/http/cloud/get_team_user_invites.rs b/server/src/http/cloud/get_team_user_invites.rs index 38ccc23d..3152e7f4 100644 --- a/server/src/http/cloud/get_team_user_invites.rs +++ b/server/src/http/cloud/get_team_user_invites.rs @@ -1,9 +1,13 @@ +use super::utils::{custom_validate_uuid, validate_request}; use crate::{ middlewares::auth_middleware::UserId, structs::cloud::{api_cloud_errors::CloudApiErrors, team_invite::TeamInvite}, - utils::{custom_validate_uuid, validate_request}, }; -use axum::{extract::State, http::StatusCode, Extension, Json}; +use axum::{ + extract::{Query, State}, + http::StatusCode, + Extension, Json, +}; use database::db::Db; use garde::Validate; use log::error; @@ -27,16 +31,10 @@ pub struct HttpGetTeamUserInvitesResponse { } pub async fn get_team_user_invites( - State(db): State>>, + State(db): State>, Extension(user_id): Extension, - Json(request): Json, + Query(request): Query, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -50,6 +48,12 @@ pub async fn get_team_user_invites( CloudApiErrors::InsufficientPermissions.to_string(), )); } + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } // Check team type if team.personal { @@ -94,7 +98,7 @@ pub async fn get_team_user_invites( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; @@ -133,8 +137,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; // unwrap err as it should have failed @@ -158,12 +160,7 @@ mod tests { } // Get team invites - let request = HttpGetTeamUserInvitesRequest { - team_id: team_id.clone(), - }; - let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); - let json = serde_json::to_string(&request).unwrap(); let auth = auth_token.encode(JWT_SECRET()).unwrap(); let req = Request::builder() @@ -171,11 +168,11 @@ mod tests { .header("content-type", "application/json") .header("authorization", format!("Bearer {auth}")) .uri(format!( - "/cloud/private{}", + "/cloud/private{}?teamId={team_id}", HttpCloudEndpoint::GetTeamUserInvites.to_string() )) .extension(ip.clone()) - .body(Body::from(json)) + .body(Body::empty()) .unwrap(); // Send request @@ -229,8 +226,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; // unwrap err as it should have failed diff --git a/server/src/http/cloud/get_team_users_privileges.rs b/server/src/http/cloud/get_team_users_privileges.rs new file mode 100644 index 00000000..d87c77c4 --- /dev/null +++ b/server/src/http/cloud/get_team_users_privileges.rs @@ -0,0 +1,240 @@ +use super::utils::custom_validate_uuid; +use crate::{ + middlewares::auth_middleware::UserId, + structs::cloud::{api_cloud_errors::CloudApiErrors, team_user_privilege::TeamUserPrivilege}, +}; +use axum::{ + extract::{Query, State}, + http::StatusCode, + Extension, Json, +}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpGetTeamUsersPrivilegesRequest { + #[garde(custom(custom_validate_uuid))] + pub team_id: String, +} + +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpGetTeamUsersPrivilegesResponse { + pub users_privileges: Vec, +} + +pub async fn get_team_users_privileges( + State(db): State>, + Extension(user_id): Extension, + Query(request): Query, +) -> Result, (StatusCode, String)> { + // Get user data + match db.get_team_by_team_id(None, &request.team_id).await { + Ok(Some(team)) => { + // Check if user is a admin of this team + if team.team_admin_id != user_id { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + + // Check team type + if team.personal { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::ActionForbiddenForPersonalTeam.to_string(), + )); + } + + let team_privileges = match db.get_privileges_by_team_id(&request.team_id).await { + Ok(privileges) => { + if !privileges + .iter() + .any(|privilege| privilege.user_id == user_id) + { + return Err(( + StatusCode::UNAUTHORIZED, + CloudApiErrors::InsufficientPermissions.to_string(), + )); + } + + privileges + } + Err(err) => { + error!("Failed to get user privileges: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Get team users ids from team_privileges + let team_members_ids: Vec = team_privileges + .iter() + .map(|privilege| privilege.user_id.clone()) + .collect(); + + // Get users emails + let users_ids_emails = match db.get_users_emails_by_ids(&team_members_ids).await { + Ok(users_ids_emails) => users_ids_emails, + Err(err) => { + error!("Failed to get users ids: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + let final_list = team_privileges + .iter() + .map(|privilege| { + // Should not happen but just in case + let email = match users_ids_emails.get(&privilege.user_id) { + Some(email) => email.clone(), + None => "".to_string(), + }; + + TeamUserPrivilege { + app_id: privilege.app_id.clone(), + user_email: email.clone(), + privilege: privilege.privilege_level.clone(), + } + }) + .collect(); + + Ok(Json(HttpGetTeamUsersPrivilegesResponse { + users_privileges: final_list, + })) + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + env::JWT_SECRET, + http::cloud::register_new_app::HttpRegisterNewAppRequest, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + add_test_app, add_test_team, add_user_to_test_team, convert_response, create_test_app, + generate_valid_name, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use database::structs::privilege_level::PrivilegeLevel; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_get_team_metadata() { + let test_app = create_test_app(false).await; + + let (auth_token, admin_email, _password) = register_and_login_random_user(&test_app).await; + + // Register new team + let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.clone(), + app_name: app_name.clone(), + }; + + let _ = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + + // Register 10 users and invite them to the team + let mut users_email = Vec::new(); + for _ in 0..10 { + let (app_user_auth_token, app_user_email, _app_user_password) = + register_and_login_random_user(&test_app).await; + + // Invite user to the first three teams + add_user_to_test_team( + &team_id, + &app_user_email, + &auth_token, + &app_user_auth_token, + &test_app, + ) + .await + .unwrap(); + + users_email.push(app_user_email); + } + + // Get team metadata + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}?teamId={team_id}", + HttpCloudEndpoint::GetTeamUserPrivileges.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let res = convert_response::(response) + .await + .unwrap(); + + assert_eq!(res.users_privileges.len(), 11); + // Check privileges + for privilege in res.users_privileges { + if privilege.user_email == admin_email { + assert_eq!(privilege.privilege, PrivilegeLevel::Admin); + } else { + assert_eq!(privilege.privilege, PrivilegeLevel::Read); + } + } + } +} diff --git a/server/src/http/cloud/get_user_joined_teams.rs b/server/src/http/cloud/get_user_joined_teams.rs index 058768c8..8b3b8630 100644 --- a/server/src/http/cloud/get_user_joined_teams.rs +++ b/server/src/http/cloud/get_user_joined_teams.rs @@ -22,28 +22,57 @@ pub struct HttpGetUserJoinedTeamsResponse { pub teams: HashMap, pub teams_apps: HashMap>, pub user_privileges: HashMap>, + pub team_members: HashMap>, } pub async fn get_user_joined_teams( - State(db): State>>, + State(db): State>, Extension(user_id): Extension, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Check if user already belongs to the team match db.get_joined_teams_by_user_id(&user_id).await { Ok(joined_teams) => { let mut teams = HashMap::new(); let mut teams_apps = HashMap::new(); let mut user_privileges = HashMap::new(); - + let mut team_members = HashMap::new(); for (team, admin_email, joined_timestamp, registered_apps) in joined_teams { let team_id = team.team_id.clone(); + ///// TEMP FIX: Get team members + let team_privileges = match db.get_privileges_by_team_id(&team_id).await { + Ok(privileges) => privileges, + Err(err) => { + error!("Failed to get team privileges: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Get team users from team_privileges + let team_members_ids: Vec = team_privileges + .iter() + .map(|privilege| privilege.user_id.clone()) + .collect(); + + // Get users emails + let users_ids_emails = match db.get_users_emails_by_ids(&team_members_ids).await { + Ok(users_ids_emails) => users_ids_emails, + Err(err) => { + error!("Failed to get users ids: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + let team_members_emails: Vec = users_ids_emails.values().cloned().collect(); + team_members.insert(team_id.clone(), team_members_emails); + ///// + // Parse joined team let joined_team = JoinedTeam { team_id: team.team_id.clone(), @@ -68,6 +97,25 @@ pub async fn get_user_joined_teams( } if !apps_info.is_empty() { + // Get pending domain verifications + let app_ids = apps_info + .iter() + .map(|app| app.app_id.clone()) + .collect::>(); + + if let Ok(mut pending_domain_verifications) = db + .get_pending_domain_verifications_by_app_ids(&app_ids) + .await + { + for app in apps_info.iter_mut() { + if let Some(pending_domains) = + pending_domain_verifications.get_mut(&app.app_id) + { + app.whitelisted_domains.append(pending_domains); + } + } + } + teams_apps.insert(team_id.clone(), apps_info); } @@ -80,6 +128,7 @@ pub async fn get_user_joined_teams( teams, teams_apps, user_privileges, + team_members, })) } Err(err) => { @@ -95,7 +144,7 @@ pub async fn get_user_joined_teams( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::structs::cloud::cloud_http_endpoints::HttpCloudEndpoint; @@ -146,8 +195,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let app_id = add_test_app(&request, &auth_token, &test_app) .await diff --git a/server/src/http/cloud/get_user_metadata.rs b/server/src/http/cloud/get_user_metadata.rs new file mode 100644 index 00000000..22b7d495 --- /dev/null +++ b/server/src/http/cloud/get_user_metadata.rs @@ -0,0 +1,116 @@ +use crate::{ + middlewares::auth_middleware::UserId, structs::cloud::api_cloud_errors::CloudApiErrors, +}; +use axum::Extension; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpUserMetadataResponse { + pub user_id: String, + pub email: String, + pub password_set: bool, + pub passkey_ids: Vec, +} + +pub async fn get_user_metadata( + State(db): State>, + Extension(user_id): Extension, +) -> Result, (StatusCode, String)> { + // Get user data + let user_data = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user_data)) => user_data, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )) + } + Err(err) => { + error!( + "Failed to check if user exists: {:?}, user_id: {}", + err, user_id + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + let response = HttpUserMetadataResponse { + user_id: user_data.user_id, + email: user_data.email, + password_set: user_data.password_hash.is_some(), + passkey_ids: user_data + .passkeys + .unwrap_or_default() + .iter() + .map(|p| p.cred_id().to_string()) + .collect(), + }; + + Ok(Json(response)) +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + env::JWT_SECRET, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + convert_response, create_test_app, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_get_user_metadata() { + let test_app = create_test_app(false).await; + + // Register and login user + let (auth_token, email, _password) = register_and_login_random_user(&test_app).await; + + // Get user metadata + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let auth = auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::GetUserMetadata.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let res = convert_response::(response) + .await + .unwrap(); + + assert_eq!(res.email, email); + assert_eq!(res.password_set, true); + assert_eq!(res.passkey_ids.len(), 0); + assert_eq!(res.user_id, auth_token.user_id); + } +} diff --git a/server/src/http/cloud/get_user_team_invites.rs b/server/src/http/cloud/get_user_team_invites.rs index 8f0dad12..afd94762 100644 --- a/server/src/http/cloud/get_user_team_invites.rs +++ b/server/src/http/cloud/get_user_team_invites.rs @@ -17,15 +17,9 @@ pub struct HttpGetUserTeamInvitesResponse { } pub async fn get_user_team_invites( - State(db): State>>, + State(db): State>, Extension(user_id): Extension, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Get user data and perform checks let user = match db.get_user_by_user_id(&user_id).await { Ok(Some(user)) => user, @@ -64,7 +58,7 @@ pub async fn get_user_team_invites( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::auth::AuthToken; @@ -113,8 +107,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let _ = add_test_app(&request, &auth_token, &test_app) @@ -205,8 +197,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; // unwrap err as it should have failed diff --git a/server/src/http/cloud/grafana_utils/add_user_to_team.rs b/server/src/http/cloud/grafana_utils/add_user_to_team.rs new file mode 100644 index 00000000..86085667 --- /dev/null +++ b/server/src/http/cloud/grafana_utils/add_user_to_team.rs @@ -0,0 +1,82 @@ +use crate::structs::cloud::{ + api_cloud_errors::CloudApiErrors, grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use log::{error, warn}; +use openapi::{ + apis::{ + configuration::Configuration, + teams_api::add_team_member, + users_api::{get_user_by_login_or_email, get_user_teams}, + }, + models::AddTeamMemberCommand, +}; +use std::sync::Arc; + +pub async fn handle_grafana_add_user_to_team( + grafana_conf: &Arc, + team_id: &String, + user_email: &String, +) -> Result<(), (StatusCode, String)> { + // Check if user exists, if not create a new user + let user_id = match get_user_by_login_or_email(&grafana_conf, user_email).await { + Ok(user) => user.id, + Err(err) => { + warn!("Failed to get user from grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // If for some reason user_id is not found, return error + let id = match user_id { + Some(id) => id, + None => { + error!("Failed to get user_id for email: {:?}", user_email); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Check if user is already in the team + match get_user_teams(&grafana_conf, id.clone()).await { + Ok(teams) => { + let team_id: i64 = team_id.parse().map_err(|err| { + error!("Failed to parse team_id: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + ) + })?; + + // For now we will be checking team id but in the future we might need to swap to team uid + if teams.iter().any(|team| team.id == Some(team_id)) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserAlreadyBelongsToTheTeam.to_string(), + )); + } + } + Err(err) => { + warn!("Failed to get user teams: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + + // Add user to the team + let request = AddTeamMemberCommand { user_id: user_id }; + + if let Err(err) = add_team_member(&grafana_conf, team_id, request).await { + warn!( + "Failed to add user [{:?}] to team [{:?}], error: {:?}", + user_email, team_id, err + ); + return Err(handle_grafana_error(err)); + } + + Ok(()) +} diff --git a/server/src/http/cloud/grafana_utils/create_new_app.rs b/server/src/http/cloud/grafana_utils/create_new_app.rs new file mode 100644 index 00000000..863196c3 --- /dev/null +++ b/server/src/http/cloud/grafana_utils/create_new_app.rs @@ -0,0 +1,89 @@ +use crate::{ + statics::DASHBOARD_TEMPLATE_UID, + structs::cloud::{api_cloud_errors::CloudApiErrors, grafana_error::handle_grafana_error}, +}; +use axum::http::StatusCode; +use log::warn; +use openapi::{ + apis::{ + configuration::Configuration, + dashboards_api::{get_dashboard_by_uid, import_dashboard}, + }, + models::ImportDashboardRequest, +}; +use serde_json::json; +use std::sync::Arc; + +pub async fn handle_grafana_create_new_app( + grafana_conf: &Arc, + app_name: &String, + app_id: &String, + team_id: &String, +) -> Result<(), (StatusCode, String)> { + // Import template dashboard + let mut template_dashboard = + match get_dashboard_by_uid(&grafana_conf, &DASHBOARD_TEMPLATE_UID).await { + Ok(response) => match response.dashboard { + Some(dashboard) => dashboard, + None => { + warn!("Failed to get template dashboard: {:?}", response); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DashboardImportFail.to_string(), + )); + } + }, + Err(err) => { + println!("Failed to get template dashboard: {:?}", err); + return Err(handle_grafana_error(err)); + } + }; + + // Modify dashboard template fields + if let Some(uid_field) = template_dashboard.get_mut("uid") { + *uid_field = json!(app_id); + } else { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DashboardImportFail.to_string(), + )); + } + + if let Some(id_field) = template_dashboard.get_mut("id") { + *id_field = json!(""); // Set dashboard id to empty string to create a new dashboard + } else { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DashboardImportFail.to_string(), + )); + } + + if let Some(title_field) = template_dashboard.get_mut("title") { + *title_field = json!(app_name); + } else { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DashboardImportFail.to_string(), + )); + } + + // Import dashboard for the team + if let Err(err) = import_dashboard( + &grafana_conf, + ImportDashboardRequest { + dashboard: Some(template_dashboard), + folder_id: None, + folder_uid: Some(team_id.clone()), // When we create a new team, we create a folder with the same uid as the team id + inputs: None, + overwrite: Some(false), + path: None, + plugin_id: None, + }, + ) + .await + { + return Err(handle_grafana_error(err)); + }; + + Ok(()) +} diff --git a/server/src/http/cloud/grafana_utils/create_new_team.rs b/server/src/http/cloud/grafana_utils/create_new_team.rs new file mode 100644 index 00000000..1c50d5ff --- /dev/null +++ b/server/src/http/cloud/grafana_utils/create_new_team.rs @@ -0,0 +1,157 @@ +use crate::structs::cloud::{ + api_cloud_errors::CloudApiErrors, grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use log::warn; +use openapi::{ + apis::{ + admin_users_api::admin_create_user, + configuration::Configuration, + folder_permissions_api::update_folder_permissions, + folders_api::create_folder, + teams_api::{add_team_member, create_team}, + users_api::get_user_by_login_or_email, + }, + models::{ + AddTeamMemberCommand, AdminCreateUserForm, CreateFolderCommand, CreateTeamCommand, + DashboardAclUpdateItem, UpdateDashboardAclCommand, + }, +}; +use rand::{distributions::Alphanumeric, thread_rng, Rng}; +use std::sync::Arc; + +pub async fn handle_grafana_create_new_team( + grafana_conf: &Arc, + admin_email: &String, + team_name: &String, +) -> Result { + let grafana_team_name = format!("[{}][{}]", team_name, admin_email); + // Check if user exists, if not create a new user + let admin_id = match get_user_by_login_or_email(&grafana_conf, admin_email).await { + Ok(user) => match user.id { + Some(id) => id, + None => { + warn!("Failed to get user from grafana: {:?}", user); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }, + Err(_) => { + // Create user with the same email as the user, password can be anything, it won't be used + let random_password: String = thread_rng() + .sample_iter(&Alphanumeric) + .take(30) + .map(char::from) + .collect(); + + let request = AdminCreateUserForm { + password: Some(random_password), + email: Some(admin_email.to_lowercase().clone()), + login: None, + name: None, + org_id: None, + }; + + match admin_create_user(&grafana_conf, request).await { + Ok(create_user_response) => match create_user_response.id { + Some(id) => id, + None => { + warn!("Failed to create user: {:?}", create_user_response); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }, + Err(err) => { + warn!("Failed to create user: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + } + } + }; + + // create new team + let team_request = CreateTeamCommand { + email: Some(admin_email.clone()), + name: Some(grafana_team_name.clone()), + }; + + let grafana_team_id = match create_team(&grafana_conf, team_request).await { + Ok(response) => match response.team_id { + Some(team_id) => team_id, + None => { + warn!("Failed to create team: {:?}", response); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::FailedToCreateTeam.to_string(), + )); + } + }, + Err(err) => { + return Err(handle_grafana_error(err)); + } + }; + + // create folder for team dashboards + let folder_request = CreateFolderCommand { + description: None, + parent_uid: None, + title: Some(grafana_team_name.clone()), + uid: Some(grafana_team_id.to_string()), + }; + + let folder_uid = match create_folder(&grafana_conf, folder_request).await { + Ok(response) => match response.uid { + Some(folder_uid) => folder_uid, + None => { + warn!("Failed to create folder: {:?}", response); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::FailedToCreateTeam.to_string(), + )); + } + }, + Err(err) => { + return Err(handle_grafana_error(err)); + } + }; + + // set folder permissions for the whole team + let update_permissions_request = UpdateDashboardAclCommand { + items: Some(vec![DashboardAclUpdateItem { + permission: Some(1), // Grant View permission for the whole team + role: None, + team_id: Some(grafana_team_id), + user_id: None, + }]), + }; + + if let Err(err) = + update_folder_permissions(&grafana_conf, &folder_uid, update_permissions_request).await + { + return Err(handle_grafana_error(err)); + } + + // Add user to the team + let request = AddTeamMemberCommand { + user_id: Some(admin_id), + }; + + if let Err(err) = + add_team_member(&grafana_conf, grafana_team_id.to_string().as_str(), request).await + { + warn!( + "Failed to add user [{:?}] to team [{:?}], error: {:?}", + admin_email, grafana_team_id, err + ); + return Err(handle_grafana_error(err)); + } + + Ok(grafana_team_id) +} diff --git a/server/src/http/cloud/grafana_utils/delete_registered_app.rs b/server/src/http/cloud/grafana_utils/delete_registered_app.rs new file mode 100644 index 00000000..7f4264e6 --- /dev/null +++ b/server/src/http/cloud/grafana_utils/delete_registered_app.rs @@ -0,0 +1,49 @@ +use crate::structs::cloud::{ + api_cloud_errors::CloudApiErrors, grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use log::warn; +use openapi::apis::{ + configuration::Configuration, + dashboards_api::{delete_dashboard_by_uid, get_dashboard_by_uid}, +}; +use std::sync::Arc; + +pub async fn handle_grafana_delete_app( + grafana_conf: &Arc, + app_id: &String, +) -> Result<(), (StatusCode, String)> { + match get_dashboard_by_uid(&grafana_conf, &app_id).await { + Ok(response) => match response.dashboard { + Some(_) => (), + None => { + warn!( + "Failed to get dashboard: {:?}, dashboard_id:{:?}", + response, app_id + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::AppDoesNotExist.to_string(), + )); + } + }, + Err(err) => { + warn!( + "Failed to delete dashboard: {:?}, dashboard_id: {:?}", + err, app_id + ); + return Err(handle_grafana_error(err)); + } + }; + + match delete_dashboard_by_uid(&grafana_conf, &app_id).await { + Ok(_) => return Ok(()), + Err(err) => { + warn!( + "Failed to delete dashboard: {:?}, dashboard_id: {:?}", + err, app_id + ); + return Err(handle_grafana_error(err)); + } + } +} diff --git a/server/src/http/cloud/grafana_utils/delete_team.rs b/server/src/http/cloud/grafana_utils/delete_team.rs new file mode 100644 index 00000000..aa73ed1e --- /dev/null +++ b/server/src/http/cloud/grafana_utils/delete_team.rs @@ -0,0 +1,48 @@ +use crate::structs::cloud::{ + api_cloud_errors::CloudApiErrors, grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use log::warn; +use openapi::apis::{ + configuration::Configuration, + folders_api::delete_folder, + teams_api::{delete_team_by_id, get_team_by_id}, +}; +use std::sync::Arc; + +pub async fn handle_grafana_delete_team( + grafana_conf: &Arc, + team_id: &String, +) -> Result<(), (StatusCode, String)> { + match get_team_by_id(&grafana_conf, &team_id).await { + Ok(response) => match response.id { + Some(_) => (), + None => { + warn!("Failed to get team: {:?}, team_id: {:?}", response, team_id); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + }, + Err(err) => { + warn!("Failed to get team: {:?}, team_id: {:?}", err, team_id); + return Err(handle_grafana_error(err)); + } + }; + + match delete_team_by_id(&grafana_conf, team_id).await { + Ok(_) => (), + Err(err) => { + warn!("Failed to delete team: {:?}, team_id: {:?}", err, team_id); + return Err(handle_grafana_error(err)); + } + } + + // Response for this method has been modified - errors in the original OpenAPI spec + if let Err(err) = delete_folder(&grafana_conf, team_id, Some(false)).await { + warn!("Failed to delete folder: {:?}, team_id: {:?}", err, team_id); + return Err(handle_grafana_error(err)); + }; + return Ok(()); +} diff --git a/server/src/http/cloud/grafana_utils/delete_user_account.rs b/server/src/http/cloud/grafana_utils/delete_user_account.rs new file mode 100644 index 00000000..bf5d1f86 --- /dev/null +++ b/server/src/http/cloud/grafana_utils/delete_user_account.rs @@ -0,0 +1,117 @@ +use crate::structs::cloud::{ + api_cloud_errors::CloudApiErrors, grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use log::warn; +use openapi::apis::{ + admin_users_api::admin_delete_user, + configuration::Configuration, + folders_api::delete_folder, + teams_api::{delete_team_by_id, get_team_by_id, remove_team_member}, + users_api::get_user_by_login_or_email, +}; +use std::sync::Arc; + +pub async fn handle_grafana_delete_user_account( + grafana_conf: &Arc, + owned_team_grafana_ids: &Vec, + non_owned_team_grafana_ids: &Vec, + user_email: &String, +) -> Result<(), (StatusCode, String)> { + for team_id in owned_team_grafana_ids { + match get_team_by_id(&grafana_conf, team_id).await { + Ok(response) => match response.id { + Some(_) => (), + None => { + warn!("Failed to get team: {:?}, team_id: {:?}", response, team_id); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + }, + Err(err) => { + warn!("Failed to get team: {:?}, team_id: {:?}", err, team_id); + return Err(handle_grafana_error(err)); + } + }; + + match delete_team_by_id(&grafana_conf, team_id).await { + Ok(_) => (), + Err(err) => { + warn!("Failed to delete team: {:?}, team_id: {:?}", err, team_id); + return Err(handle_grafana_error(err)); + } + } + + if let Err(err) = delete_folder(&grafana_conf, team_id, Some(false)).await { + warn!("Failed to delete folder: {:?}, team_id: {:?}", err, team_id); + return Err(handle_grafana_error(err)); + }; + } + // Check if user exists, if not return error + let user_id = match get_user_by_login_or_email( + &grafana_conf, + user_email.as_str().to_lowercase().as_str(), + ) + .await + { + Ok(user) => match user.id { + Some(id) => id, + None => { + warn!("Failed to get id for user: {:?}", user); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::UserDoesNotExistInGrafana.to_string(), + )); + } + }, + Err(_) => { + warn!("Failed to get user: {:?}", user_email); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::UserDoesNotExistInGrafana.to_string(), + )); + } + }; + + for team_id in non_owned_team_grafana_ids { + match get_team_by_id(&grafana_conf, team_id).await { + Ok(response) => match response.id { + Some(_) => (), + None => { + warn!("Failed to get team: {:?}, team_id: {:?}", response, team_id); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + }, + Err(err) => { + warn!("Failed to get team: {:?}, team_id: {:?}", err, team_id); + return Err(handle_grafana_error(err)); + } + }; + + match remove_team_member(&grafana_conf, team_id, user_id).await { + Ok(_) => (), + Err(err) => { + warn!( + "Failed to remove user from team: {:?}, team_id: {:?}", + err, team_id + ); + return Err(handle_grafana_error(err)); + } + } + } + + match admin_delete_user(&grafana_conf, user_id).await { + Ok(_) => (), + Err(err) => { + warn!("Failed to delete user: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + + Ok(()) +} diff --git a/server/src/http/cloud/grafana_utils/import_template_dashboard.rs b/server/src/http/cloud/grafana_utils/import_template_dashboard.rs new file mode 100644 index 00000000..d19c4a62 --- /dev/null +++ b/server/src/http/cloud/grafana_utils/import_template_dashboard.rs @@ -0,0 +1,106 @@ +use crate::{ + statics::{DASHBOARD_TEMPLATE_UID, POSTGRES_DATASOURCE_UID, TEMPLATES_FOLDER_UID}, + structs::cloud::grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use log::{error, info, warn}; +use openapi::{ + apis::{ + configuration::Configuration, + dashboards_api::{get_dashboard_by_uid, import_dashboard}, + }, + models::{ImportDashboardInput, ImportDashboardRequest}, +}; +use serde_json::Value; +use std::{path::PathBuf, sync::Arc}; +use tokio::fs; + +pub async fn setup_templates_dashboard( + grafana_conf: &Arc, +) -> Result<(), (StatusCode, String)> { + let project_root = PathBuf::from("/root/connect"); + + // Construct the path to the JSON file + let json_path = project_root.join("grafana").join("TEMPLATE_DASHBOARD.json"); + println!( + "Attempting to read dashboard template from: {:?}", + json_path + ); + + let dashboard_blob = match fs::read(json_path).await { + Ok(content) => content, + Err(e) => { + println!("Error reading dashboard template file: {}", e); + panic!("Failed to read dashboard template file"); + } + }; + + let dashboard: Value = match serde_json::from_slice(&dashboard_blob) { + Ok(json) => json, + Err(e) => { + println!("Error deserializing dashboard JSON: {}", e); + panic!("Failed to deserialize dashboard JSON"); + } + }; + + // Check if dashboard exists if not create it + match get_dashboard_by_uid(&grafana_conf, &DASHBOARD_TEMPLATE_UID).await { + Ok(response) => match response.dashboard { + Some(_dashboard) => return Ok(()), + None => { + warn!("Failed to get dashboard data event though grafana returned 200"); + + // Try to import the dashboard anyway + let request = ImportDashboardRequest { + dashboard: Some(dashboard), + folder_id: None, + folder_uid: Some(TEMPLATES_FOLDER_UID.to_string()), + overwrite: Some(true), + inputs: Some(vec![ImportDashboardInput { + name: Some("DS_GRAFANA-POSTGRESQL-DATASOURCE".to_string()), + plugin_id: Some("grafana-postgres-datasource".to_string()), + r#type: Some("datasource".to_string()), + value: Some(POSTGRES_DATASOURCE_UID.to_string()), + }]), + path: None, + plugin_id: None, + }; + + match import_dashboard(&grafana_conf, request).await { + Ok(_) => return Ok(()), + Err(err) => { + error!("Failed to import template dashboard: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + } + }, + Err(_) => { + info!("Template dashboard does not exists, creating it"); + + // Try to import the dashboard + let request = ImportDashboardRequest { + dashboard: Some(dashboard), + folder_id: None, + folder_uid: Some(TEMPLATES_FOLDER_UID.to_string()), + overwrite: Some(true), + inputs: Some(vec![ImportDashboardInput { + name: Some("DS_GRAFANA-POSTGRESQL-DATASOURCE".to_string()), + plugin_id: Some("grafana-postgres-datasource".to_string()), + r#type: Some("datasource".to_string()), + value: Some(POSTGRES_DATASOURCE_UID.to_string()), + }]), + path: None, + plugin_id: None, + }; + + match import_dashboard(&grafana_conf, request).await { + Ok(_) => return Ok(()), + Err(err) => { + error!("Failed to import template dashboard: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + } + } +} diff --git a/server/src/http/cloud/grafana_utils/mod.rs b/server/src/http/cloud/grafana_utils/mod.rs new file mode 100644 index 00000000..90367e8e --- /dev/null +++ b/server/src/http/cloud/grafana_utils/mod.rs @@ -0,0 +1,10 @@ +pub mod add_user_to_team; +pub mod create_new_app; +pub mod create_new_team; +pub mod delete_registered_app; +pub mod delete_team; +pub mod delete_user_account; +pub mod import_template_dashboard; +pub mod remove_user_from_the_team; +pub mod setup_database_datasource; +pub mod setup_template_folder; diff --git a/server/src/http/cloud/grafana_utils/remove_user_from_the_team.rs b/server/src/http/cloud/grafana_utils/remove_user_from_the_team.rs new file mode 100644 index 00000000..41431f8a --- /dev/null +++ b/server/src/http/cloud/grafana_utils/remove_user_from_the_team.rs @@ -0,0 +1,74 @@ +use crate::structs::cloud::{ + api_cloud_errors::CloudApiErrors, grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use log::{error, warn}; +use openapi::apis::{ + configuration::Configuration, + teams_api::remove_team_member, + users_api::{get_user_by_login_or_email, get_user_teams}, +}; +use std::sync::Arc; + +pub async fn handle_grafana_remove_user_from_team( + grafana_conf: &Arc, + team_id: &String, + user_email: &String, +) -> Result<(), (StatusCode, String)> { + // Check if user exists + let user_id = match get_user_by_login_or_email(&grafana_conf, user_email).await { + Ok(user) => user.id, + Err(err) => { + warn!("Failed to get user: {:?}", err); + return Err(handle_grafana_error(err)); + } + }; + + // If for some reason user_id is not found, return error + let id = match user_id { + Some(id) => id, + None => { + error!("Failed to get user_id for email: {:?}", user_email); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Check if user is already in the team + match get_user_teams(&grafana_conf, id.clone()).await { + Ok(teams) => { + let team_id: i64 = team_id.parse().map_err(|err| { + error!("Failed to parse team_id: {:?}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + ) + })?; + + // For now we will be checking team id but in the future we might need to swap to team uid + if !teams.iter().any(|team| team.id == Some(team_id)) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotBelongsToTheTeam.to_string(), + )); + } + } + Err(err) => { + warn!("Failed to get user teams: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + + // Remove user from the team + if let Err(err) = remove_team_member(&grafana_conf, team_id, id).await { + warn!( + "Failed to add user [{:?}] to team [{:?}], error: {:?}", + user_email, team_id, err + ); + return Err(handle_grafana_error(err)); + } + + Ok(()) +} diff --git a/server/src/http/cloud/grafana_utils/setup_database_datasource.rs b/server/src/http/cloud/grafana_utils/setup_database_datasource.rs new file mode 100644 index 00000000..9730a8b0 --- /dev/null +++ b/server/src/http/cloud/grafana_utils/setup_database_datasource.rs @@ -0,0 +1,66 @@ +use crate::{ + env::DATABASE_ADDRESS, + infra_env::{DATABASE_PORT, GRAFANA_DB_PASSWORD, GRAFANA_DB_USERNAME, POSTGRES_DB}, + statics::POSTGRES_DATASOURCE_UID, + structs::cloud::grafana_error::handle_grafana_error, +}; +use axum::http::StatusCode; +use openapi::{ + apis::{ + configuration::Configuration, + datasources_api::{add_data_source, get_data_source_by_uid}, + }, + models::AddDataSourceCommand, +}; +use std::sync::Arc; + +pub async fn setup_database_datasource( + grafana_conf: &Arc, +) -> Result<(), (StatusCode, String)> { + // Check if datasource already exists, otherwise create it + if let Err(_) = get_data_source_by_uid(grafana_conf, POSTGRES_DATASOURCE_UID).await { + let mut json_data = serde_json::Map::new(); + json_data.insert("sslmode".to_string(), "disable".into()); + json_data.insert("postgresVersion".to_string(), 1500.into()); + json_data.insert("timescaledb".to_string(), true.into()); + json_data.insert("maxOpenConns".to_string(), 100.into()); + json_data.insert("maxIdleConns".to_string(), 100.into()); + json_data.insert("maxIdleConnsAuto".to_string(), true.into()); + json_data.insert("connMaxLifetime".to_string(), 14400.into()); + json_data.insert("database".to_string(), POSTGRES_DB().into()); + + let mut secure_settings = std::collections::HashMap::new(); + secure_settings.insert("password".to_string(), GRAFANA_DB_PASSWORD().to_string()); + + let request_payload = AddDataSourceCommand { + name: Some("Postgres".to_string()), + r#type: Some("grafana-postgresql-datasource".to_string()), + access: Some("proxy".to_string()), + // DATABASE ADDRESS from main env file + url: Some(format!( + "{}:{}", + DATABASE_ADDRESS().to_string(), + DATABASE_PORT() + )), + database: Some(POSTGRES_DB().to_string()), + user: Some(GRAFANA_DB_USERNAME().to_string()), + basic_auth: None, + with_credentials: Some(false), + is_default: Some(true), + json_data: Some(serde_json::Value::Object(json_data)), + uid: Some(POSTGRES_DATASOURCE_UID.to_string()), + basic_auth_user: None, + secure_json_data: Some(secure_settings), + }; + + match add_data_source(&grafana_conf, request_payload).await { + Ok(_) => return Ok(()), + Err(err) => { + println!("Failed to import database datasource: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + } + + Ok(()) +} diff --git a/server/src/http/cloud/grafana_utils/setup_template_folder.rs b/server/src/http/cloud/grafana_utils/setup_template_folder.rs new file mode 100644 index 00000000..37b385d1 --- /dev/null +++ b/server/src/http/cloud/grafana_utils/setup_template_folder.rs @@ -0,0 +1,58 @@ +use crate::{statics::TEMPLATES_FOLDER_UID, structs::cloud::grafana_error::handle_grafana_error}; +use axum::http::StatusCode; +use log::info; +use openapi::{ + apis::{ + configuration::Configuration, + folders_api::{create_folder, get_folder_by_uid}, + }, + models::CreateFolderCommand, +}; +use std::sync::Arc; + +pub async fn setup_templates_folder( + grafana_conf: &Arc, +) -> Result<(), (StatusCode, String)> { + // Check if folder exists if not create it + match get_folder_by_uid(&grafana_conf, &TEMPLATES_FOLDER_UID).await { + Ok(folder) => match folder.uid { + Some(_uid) => return Ok(()), + None => { + // Try to create the folder + let folder_request = CreateFolderCommand { + description: None, + title: Some("TEMPLATES_FOLDER".to_string()), + parent_uid: None, + uid: Some(TEMPLATES_FOLDER_UID.to_string()), + }; + + match create_folder(grafana_conf, folder_request).await { + Ok(_) => return Ok(()), + Err(err) => { + println!("Failed to create folder: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + } + }, + Err(_) => { + info!("Templates folder does not exist, creating it"); + + // Try to create the folder anyway + let folder_request = CreateFolderCommand { + description: None, + title: Some("TEMPLATES_FOLDER".to_string()), + parent_uid: None, + uid: Some(TEMPLATES_FOLDER_UID.to_string()), + }; + + match create_folder(grafana_conf, folder_request).await { + Ok(_) => return Ok(()), + Err(err) => { + println!("Failed to create folder: {:?}", err); + return Err(handle_grafana_error(err)); + } + } + } + } +} diff --git a/server/src/http/cloud/invite_user_to_team.rs b/server/src/http/cloud/invite_user_to_team.rs index 3fc62b96..1ee22d61 100644 --- a/server/src/http/cloud/invite_user_to_team.rs +++ b/server/src/http/cloud/invite_user_to_team.rs @@ -1,8 +1,13 @@ +use super::utils::{custom_validate_uuid, validate_request}; use crate::{ + mailer::{ + mail_requests::{SendEmailRequest, TeamInviteNotification}, + mailer::Mailer, + }, middlewares::auth_middleware::UserId, statics::USERS_AMOUNT_LIMIT_PER_TEAM, structs::cloud::api_cloud_errors::CloudApiErrors, - utils::{custom_validate_uuid, validate_request}, + test_env::is_test_env, }; use axum::{extract::State, http::StatusCode, Extension, Json}; use database::db::Db; @@ -27,16 +32,11 @@ pub struct HttpInviteUserToTeamRequest { pub struct HttpInviteUserToTeamResponse {} pub async fn invite_user_to_team( - State(db): State>>, + State(db): State>, + State(mailer): State>, Extension(user_id): Extension, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -51,6 +51,13 @@ pub async fn invite_user_to_team( )); } + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + // Check team type if team.personal { return Err(( @@ -182,21 +189,31 @@ pub async fn invite_user_to_team( } // Add invite to the team - match db + if let Err(err) = db .create_new_team_invite(&request.team_id, &request.user_email) .await { - Ok(_) => { - return Ok(Json(HttpInviteUserToTeamResponse {})); - } - Err(err) => { - error!("Failed to invite user to the team: {:?}", err); - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::DatabaseError.to_string(), - )); - } + error!("Failed to invite user to the team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); } + + // Send email notification + if !is_test_env() { + let request = SendEmailRequest::TeamInvite(TeamInviteNotification { + email: request.user_email.clone(), + team_name: team.team_name.clone(), + inviter_email: user.email.clone(), + }); + + // It doesn't matter if this fails + mailer.handle_email_request(&request); + } + + // Return response + Ok(Json(HttpInviteUserToTeamResponse {})) } Ok(None) => { return Err(( @@ -214,7 +231,7 @@ pub async fn invite_user_to_team( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::{ @@ -239,6 +256,7 @@ mod tests { }; use std::net::SocketAddr; use tower::ServiceExt; + use uuid7::uuid7; #[tokio::test] async fn test_invite_user_to_team() { @@ -257,8 +275,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; // unwrap err as it should have failed @@ -339,9 +355,11 @@ mod tests { let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; - // Team does not exist, use random uuid + let team_id = uuid7().to_string(); + + // Team does not exist let resp = invite_user_to_test_team( - &uuid7::uuid7().to_string(), + &team_id, &"test_user_email@gmail.com".to_string(), &auth_token, &test_app, @@ -400,8 +418,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let _ = add_test_app(&request, &auth_token, &test_app) @@ -459,8 +475,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let _ = add_test_app(&request, &auth_token, &test_app) diff --git a/server/src/http/cloud/leave_team.rs b/server/src/http/cloud/leave_team.rs new file mode 100644 index 00000000..113c79df --- /dev/null +++ b/server/src/http/cloud/leave_team.rs @@ -0,0 +1,297 @@ +use super::{ + grafana_utils::remove_user_from_the_team::handle_grafana_remove_user_from_team, + utils::{custom_validate_uuid, validate_request}, +}; +use crate::{ + env::is_env_production, + mailer::{ + mail_requests::{SendEmailRequest, TeamLeavingNotification}, + mailer::Mailer, + }, + middlewares::auth_middleware::UserId, + structs::cloud::api_cloud_errors::CloudApiErrors, +}; +use axum::{extract::State, http::StatusCode, Extension, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use openapi::apis::configuration::Configuration; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpLeaveTeamRequest { + #[garde(custom(custom_validate_uuid))] + pub team_id: String, + #[garde(alphanumeric)] + pub device: String, + #[garde(alphanumeric)] + pub browser: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpLeaveTeamResponse {} + +pub async fn leave_team( + State(db): State>, + State(grafana_conf): State>, + State(mailer): State>, + Extension(user_id): Extension, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Get team data and perform checks + match db.get_team_by_team_id(None, &request.team_id).await { + Ok(Some(team)) => { + // Check if user is a admin of this team (admin cannot leave team) + if team.team_admin_id == user_id { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AdminCannotLeaveTeam.to_string(), + )); + } + + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + // Get user data and perform checks + let user = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user)) => user, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get user by id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user already belongs to the team + match db.get_teams_and_apps_membership_by_user_id(&user_id).await { + Ok(teams) => { + // This won't check if user has permissions to all apps in the team + if !teams.iter().any(|(team_id, _)| team_id == &request.team_id) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotBelongsToTheTeam.to_string(), + )); + } + } + Err(err) => { + error!( + "Failed to get teams and apps membership by user id: {:?}", + err + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Grafana, remove user from the team + if is_env_production() { + let team_grafana_id = match team.grafana_id { + Some(grafana_id) => grafana_id, + None => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::TeamWithoutGrafanaId.to_string(), + )); + } + }; + + if let Err(err) = handle_grafana_remove_user_from_team( + &grafana_conf, + &team_grafana_id, + &user.email, + ) + .await + { + error!("Grafana, failed to left the team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + }; + } + // Remove user from the team + if let Err(err) = db + .remove_user_from_the_team(&user_id, &request.team_id) + .await + { + error!("Failed to remove user from the team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + // Send email notification + let request = SendEmailRequest::LeaveTeam(TeamLeavingNotification { + email: user.email.clone(), + team_name: team.team_name.clone(), + device: request.device.clone(), + browser: request.browser.clone(), + }); + + // It doesn't matter if this fails + mailer.handle_email_request(&request); + + // Return response + Ok(Json(HttpLeaveTeamResponse {})) + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use crate::{ + env::JWT_SECRET, + http::cloud::{ + leave_team::{HttpLeaveTeamRequest, HttpLeaveTeamResponse}, + register_new_app::HttpRegisterNewAppRequest, + }, + structs::cloud::{ + api_cloud_errors::CloudApiErrors, cloud_http_endpoints::HttpCloudEndpoint, + }, + test_utils::test_utils::{ + add_test_app, add_test_team, add_user_to_test_team, convert_response, create_test_app, + generate_valid_name, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::{ConnectInfo, Request}, + http::Method, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_leave_the_team() { + let test_app = create_test_app(false).await; + + let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; + // Register new team + let team_name = generate_valid_name(); + + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) + .await + .unwrap(); + + // Register app under the team + let app_name = generate_valid_name(); + let request = HttpRegisterNewAppRequest { + team_id: team_id.to_string(), + app_name: app_name.clone(), + }; + + // unwrap err as it should have failed + let _ = add_test_app(&request, &auth_token, &test_app) + .await + .unwrap(); + + // Register new user + let (test_user_auth_token, test_user_email, _test_user_password) = + register_and_login_random_user(&test_app).await; + + // Add user to the team + add_user_to_test_team( + &team_id.to_string(), + &test_user_email, + &auth_token, + &test_user_auth_token, + &test_app, + ) + .await + .unwrap(); + + // Remove user from the team + let request = HttpLeaveTeamRequest { + team_id: team_id.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&request).unwrap(); + let auth = test_user_auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::LeaveTeam.to_string() + )) + .extension(ip.clone()) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(response) + .await + .unwrap(); + + // Try to remove user from the team again, should fail as user is not in the team + let json = serde_json::to_string(&request).unwrap(); + let auth = test_user_auth_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::LeaveTeam.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let err = convert_response::(response) + .await + .unwrap_err(); + + assert_eq!( + err.to_string(), + CloudApiErrors::UserDoesNotBelongsToTheTeam.to_string() + ); + } +} diff --git a/server/src/http/cloud/login_with_google.rs b/server/src/http/cloud/login/login_with_google.rs similarity index 79% rename from server/src/http/cloud/login_with_google.rs rename to server/src/http/cloud/login/login_with_google.rs index c9ded013..ad9566f0 100644 --- a/server/src/http/cloud/login_with_google.rs +++ b/server/src/http/cloud/login/login_with_google.rs @@ -1,17 +1,14 @@ use crate::{ env::NONCE, + http::cloud::utils::{generate_tokens, validate_request}, structs::cloud::api_cloud_errors::CloudApiErrors, - utils::{generate_tokens, validate_request}, }; use axum::{ extract::{ConnectInfo, State}, http::StatusCode, Json, }; -use database::{ - db::Db, - tables::{grafana_users::table_struct::GrafanaUser, utils::get_current_datetime}, -}; +use database::db::Db; use garde::Validate; use log::error; use pwhash::bcrypt; @@ -24,7 +21,7 @@ use uuid7::uuid7; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] #[ts(export)] #[serde(rename_all = "camelCase")] -pub struct LoginWithGoogleResponse { +pub struct HttpLoginWithGoogleResponse { pub user_id: String, pub auth_token: String, pub refresh_token: String, @@ -51,15 +48,9 @@ pub struct GoogleResponse { pub async fn login_with_google( ConnectInfo(ip): ConnectInfo, - State(db): State>>, + State(db): State>, Json(request): Json, -) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - +) -> Result, (StatusCode, String)> { // Validate request validate_request(&request, &())?; @@ -78,9 +69,9 @@ pub async fn login_with_google( match db.get_user_by_email(&request.email).await { Ok(Some(user)) => { let (auth_token, refresh_token) = - generate_tokens(request.enforce_ip, ip, &user.user_id)?; + generate_tokens(request.enforce_ip, ip, &user.user_id, &request.email)?; - return Ok(Json(LoginWithGoogleResponse { + return Ok(Json(HttpLoginWithGoogleResponse { user_id: user.user_id, auth_token: auth_token, refresh_token: refresh_token, @@ -104,13 +95,17 @@ pub async fn login_with_google( // Register user let user_id = uuid7().to_string(); - let grafana_user = GrafanaUser { - user_id: user_id.clone(), - email: request.email.clone(), - password_hash: hashed_password, - creation_timestamp: get_current_datetime(), - }; - if let Err(err) = db.add_new_user(&grafana_user).await { + + if let Err(err) = db + .add_new_user( + &user_id, + &request.email, + Some(&hashed_password), + // None for passkeys + None, + ) + .await + { error!("Failed to create user: {:?}", err); return Err(( StatusCode::INTERNAL_SERVER_ERROR, @@ -119,9 +114,10 @@ pub async fn login_with_google( } // Generate tokens - let (auth_token, refresh_token) = generate_tokens(request.enforce_ip, ip, &user_id)?; + let (auth_token, refresh_token) = + generate_tokens(request.enforce_ip, ip, &user_id, &request.email)?; - return Ok(Json(LoginWithGoogleResponse { + return Ok(Json(HttpLoginWithGoogleResponse { user_id: user_id, auth_token: auth_token, refresh_token: refresh_token, diff --git a/server/src/http/cloud/login/login_with_passkey_finish.rs b/server/src/http/cloud/login/login_with_passkey_finish.rs new file mode 100644 index 00000000..f5edaf1d --- /dev/null +++ b/server/src/http/cloud/login/login_with_passkey_finish.rs @@ -0,0 +1,108 @@ +use crate::{ + http::cloud::utils::{generate_tokens, validate_request}, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, +}; +use axum::{ + extract::{ConnectInfo, State}, + http::StatusCode, + Json, +}; +use database::db::Db; +use garde::Validate; +use log::{error, warn}; +use serde::{Deserialize, Serialize}; +use std::{net::SocketAddr, sync::Arc}; +use ts_rs::TS; +use webauthn_rs::{prelude::PublicKeyCredential, Webauthn}; + +#[derive(Validate, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HttpLoginWithPasskeyFinishRequest { + #[garde(email)] + pub email: String, + #[garde(skip)] + pub credential: PublicKeyCredential, + #[garde(skip)] + pub enforce_ip: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpLoginWithPasskeyFinishResponse { + pub user_id: String, + pub auth_token: String, + pub refresh_token: String, +} + +pub async fn login_with_passkey_finish( + ConnectInfo(ip): ConnectInfo, + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Get session data + let sessions_key = SessionsCacheKey::PasskeyLogin(request.email.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::PasskeyLogin(session)) => session, + _ => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Finish passkey authentication + if let Err(err) = web_auth.finish_passkey_authentication( + &request.credential, + &session_data.passkey_verification_state, + ) { + warn!( + "Failed to finish passkey authentication: {:?}, user_email: {}", + err, request.email + ); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidPasskeyCredential.to_string(), + )); + } + + // Get user data + let user = match db.get_user_by_email(&request.email).await { + Ok(Some(user)) => user, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get user by email: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Generate tokens + let (auth_token, refresh_token) = + generate_tokens(request.enforce_ip, ip, &user.user_id, &user.email)?; + + return Ok(Json(HttpLoginWithPasskeyFinishResponse { + auth_token, + refresh_token, + user_id: user.user_id, + })); +} diff --git a/server/src/http/cloud/login/login_with_passkey_start.rs b/server/src/http/cloud/login/login_with_passkey_start.rs new file mode 100644 index 00000000..4134e688 --- /dev/null +++ b/server/src/http/cloud/login/login_with_passkey_start.rs @@ -0,0 +1,94 @@ +use crate::{ + http::cloud::utils::validate_request, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ + ApiSessionsCache, PasskeyLoginVerification, SessionCache, SessionsCacheKey, + }, + }, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; +use webauthn_rs::{prelude::RequestChallengeResponse, Webauthn}; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpLoginWithPasskeyStartRequest { + #[garde(email)] + pub email: String, +} + +pub type HttpLoginWithPasskeyStartResponse = RequestChallengeResponse; + +pub async fn login_with_passkey_start( + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Check if user exists + let user = match db.get_user_by_email(&request.email).await { + Ok(Some(user)) => user, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); + } + Err(err) => { + error!("Failed to get user by email: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user has passkey + let passkeys = match user.passkeys { + Some(passkeys) => passkeys, + None => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::PasskeyDoesNotExist.to_string(), + )); + } + }; + + // Save to cache passkey challenge request + let sessions_key = SessionsCacheKey::PasskeyLogin(request.email.clone()).to_string(); + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + match web_auth.start_passkey_authentication(&passkeys) { + Ok((rcr, auth_state)) => { + sessions_cache.set( + sessions_key, + SessionCache::PasskeyLogin(PasskeyLoginVerification { + email: request.email.clone(), + passkey_verification_state: auth_state, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + return Ok(Json(rcr)); + } + Err(_) => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )); + } + }; +} diff --git a/server/src/http/cloud/login_with_password.rs b/server/src/http/cloud/login/login_with_password.rs similarity index 67% rename from server/src/http/cloud/login_with_password.rs rename to server/src/http/cloud/login/login_with_password.rs index b99e62d2..47c819a8 100644 --- a/server/src/http/cloud/login_with_password.rs +++ b/server/src/http/cloud/login/login_with_password.rs @@ -1,8 +1,7 @@ use crate::{ - auth::AuthToken, - env::{JWT_SECRET, NONCE}, + env::NONCE, + http::cloud::utils::{generate_tokens, validate_request}, structs::cloud::api_cloud_errors::CloudApiErrors, - utils::validate_request, }; use axum::{ extract::{ConnectInfo, State}, @@ -23,7 +22,7 @@ use ts_rs::TS; pub struct HttpLoginRequest { #[garde(email)] pub email: String, - #[garde(ascii, length(min = 6, max = 30))] + #[garde(ascii)] pub password: String, #[garde(skip)] pub enforce_ip: bool, @@ -40,15 +39,9 @@ pub struct HttpLoginResponse { pub async fn login_with_password( ConnectInfo(ip): ConnectInfo, - State(db): State>>, + State(db): State>, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -70,12 +63,19 @@ pub async fn login_with_password( } }; + // Check if user has password + let password_hash = match user.password_hash { + Some(password_hash) => password_hash, + None => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::PasswordNotSet.to_string(), + )); + } + }; + // Verify password - if bcrypt::verify( - format!("{}_{}", NONCE(), request.password), - &user.password_hash, - ) == false - { + if bcrypt::verify(format!("{}_{}", NONCE(), request.password), &password_hash) == false { return Err(( StatusCode::BAD_REQUEST, CloudApiErrors::IncorrectPassword.to_string(), @@ -83,44 +83,26 @@ pub async fn login_with_password( } // Generate tokens - let ip = if request.enforce_ip { Some(ip) } else { None }; - // Access token - let token = match AuthToken::new_access(&user.user_id, ip).encode(JWT_SECRET()) { - Ok(token) => token, - Err(err) => { - error!("Failed to create access token: {:?}", err); - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::AccessTokenFailure.to_string(), - )); - } - }; - // Refresh token - let refresh_token = match AuthToken::new_refresh(&user.user_id, ip).encode(JWT_SECRET()) { - Ok(token) => token, - Err(err) => { - error!("Failed to create refresh token: {:?}", err); - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::RefreshTokenFailure.to_string(), - )); - } - }; + let (auth_token, refresh_token) = + generate_tokens(request.enforce_ip, ip, &user.user_id, &user.email)?; return Ok(Json(HttpLoginResponse { - auth_token: token, + auth_token, refresh_token, user_id: user.user_id, })); } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; use crate::{ - http::cloud::register_with_password::{ - HttpRegisterWithPasswordRequest, HttpRegisterWithPasswordResponse, + http::cloud::register::{ + register_with_password_finish::HttpRegisterWithPasswordFinishRequest, + register_with_password_start::{ + HttpRegisterWithPasswordStartRequest, HttpRegisterWithPasswordStartResponse, + }, }, structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, test_utils::test_utils::{convert_response, create_test_app}, @@ -148,9 +130,10 @@ mod tests { let password = format!("Password123"); // Register user - let register_payload = HttpRegisterWithPasswordRequest { + let register_payload = HttpRegisterWithPasswordStartRequest { email: email.to_string(), - password: password.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); @@ -161,7 +144,7 @@ mod tests { .header("content-type", "application/json") .uri(format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordStart.to_string() )) .extension(ip) .body(Body::from(json)) @@ -170,10 +153,36 @@ mod tests { // Send request let register_response = test_app.clone().oneshot(req).await.unwrap(); // Validate response - convert_response::(register_response) + convert_response::(register_response) .await .unwrap(); + // Validate register + let verify_register_payload = HttpRegisterWithPasswordFinishRequest { + email: email.to_string(), + // Random code for testing + auth_code: "123456".to_string(), + new_password: password.to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&verify_register_payload).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::RegisterWithPasswordFinish.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // send request to app and get response + let verify_register_response = test_app.clone().oneshot(req).await.unwrap(); + assert_eq!(verify_register_response.status(), StatusCode::OK); + // Login user let login_payload = HttpLoginRequest { email: email.to_string(), @@ -256,9 +265,10 @@ mod tests { let password = format!("Password123"); // Register user - let register_payload = HttpRegisterWithPasswordRequest { + let register_payload = HttpRegisterWithPasswordStartRequest { email: email.to_string(), - password: password.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); @@ -269,7 +279,7 @@ mod tests { .header("content-type", "application/json") .uri(format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordStart.to_string() )) .extension(ip) .body(Body::from(json)) @@ -278,11 +288,37 @@ mod tests { // Send request let register_response = test_app.clone().oneshot(req).await.unwrap(); // Validate response - convert_response::(register_response) + convert_response::(register_response) .await .unwrap(); - // Login user with wring password, should fail + // Validate register + let verify_register_payload = HttpRegisterWithPasswordFinishRequest { + email: email.to_string(), + // Random code for testing + auth_code: "123456".to_string(), + new_password: password.to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&verify_register_payload).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::RegisterWithPasswordFinish.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // send request to app and get response + let verify_register_response = test_app.clone().oneshot(req).await.unwrap(); + assert_eq!(verify_register_response.status(), StatusCode::OK); + + // Login user with wrong password, should fail let login_payload = HttpLoginRequest { email: email.to_string(), password: "WrongPassword".to_string(), diff --git a/server/src/http/cloud/login/mod.rs b/server/src/http/cloud/login/mod.rs new file mode 100644 index 00000000..251fa777 --- /dev/null +++ b/server/src/http/cloud/login/mod.rs @@ -0,0 +1,5 @@ +pub mod login_with_google; +pub mod login_with_passkey_finish; +pub mod login_with_passkey_start; +pub mod login_with_password; +pub mod refresh_token; diff --git a/server/src/http/cloud/login/refresh_token.rs b/server/src/http/cloud/login/refresh_token.rs new file mode 100644 index 00000000..5336ca2d --- /dev/null +++ b/server/src/http/cloud/login/refresh_token.rs @@ -0,0 +1,229 @@ +use crate::{ + auth::AuthToken, env::{JWT_PUBLIC_KEY, NONCE}, http::cloud::utils::refresh_auth_token, + structs::cloud::api_cloud_errors::CloudApiErrors, +}; +use axum::{extract::ConnectInfo, http::StatusCode, Json}; +use serde::{Deserialize, Serialize}; +use std::net::SocketAddr; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpRefreshRequest { + pub refresh_token: String, + pub enforce_ip: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpRefreshResponse { + pub auth_token: String, +} + +pub async fn refresh_token( + ConnectInfo(ip): ConnectInfo, + Json(request): Json, +) -> Result, (StatusCode, String)> { + let refresh_token = match AuthToken::decode(&request.refresh_token, &JWT_PUBLIC_KEY(), ip) { + Ok(token) => token, + Err(err) => { + println!("Failed to decode refresh token: {:?}", err); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::RefreshTokenFailure.to_string(), + )); + } + }; + + if refresh_token.nonce != NONCE() { + return Err((StatusCode::UNAUTHORIZED, "Expired token".to_string())); + } + + let ip = match request.enforce_ip { + true => Some(ip), + false => None, + }; + + // Refresh token + let auth_token = refresh_auth_token(refresh_token, ip)?; + + return Ok(Json(HttpRefreshResponse { auth_token })); +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + http::cloud::{ + get_user_metadata::HttpUserMetadataResponse, + login::login_with_password::{HttpLoginRequest, HttpLoginResponse}, + register::{ + register_with_password_finish::HttpRegisterWithPasswordFinishRequest, + register_with_password_start::{ + HttpRegisterWithPasswordStartRequest, HttpRegisterWithPasswordStartResponse, + }, + }, + }, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{convert_response, create_test_app}, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use rand::{distributions::Alphanumeric, thread_rng, Rng}; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_refresh_token() { + let test_app = create_test_app(false).await; + + let rand_string: String = thread_rng() + .sample_iter(&Alphanumeric) + .take(30) + .map(char::from) + .collect(); + + let email = format!("{rand_string}@gmail.com"); + let password = format!("Password123"); + + // Register user + let register_payload = HttpRegisterWithPasswordStartRequest { + email: email.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(®ister_payload).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::RegisterWithPasswordStart.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let register_response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(register_response) + .await + .unwrap(); + + // Validate register + let verify_register_payload = HttpRegisterWithPasswordFinishRequest { + email: email.to_string(), + // Random code for testing + auth_code: "123456".to_string(), + new_password: password.to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&verify_register_payload).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::RegisterWithPasswordFinish.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // send request to app and get response + let verify_register_response = test_app.clone().oneshot(req).await.unwrap(); + assert_eq!(verify_register_response.status(), StatusCode::OK); + + // Login user + let login_payload = HttpLoginRequest { + email: email.to_string(), + password: password.to_string(), + enforce_ip: false, + }; + + let json = serde_json::to_string(&login_payload).unwrap(); + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::LoginWithPassword.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let login_response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let login = convert_response::(login_response) + .await + .unwrap(); + + // Refresh token + let refresh_payload = HttpRefreshRequest { + refresh_token: login.refresh_token, + enforce_ip: false, + }; + + let json = serde_json::to_string(&refresh_payload).unwrap(); + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::RefreshToken.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let refresh_response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let refresh = convert_response::(refresh_response) + .await + .unwrap(); + + assert_ne!(login.auth_token, refresh.auth_token); + + // Test if new auth token is valid + // Get user metadata endpoint + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let auth = refresh.auth_token; + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::GetUserMetadata.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + let res = convert_response::(response) + .await + .unwrap(); + + assert_eq!(res.email, email); + assert_eq!(res.password_set, true); + assert_eq!(res.passkey_ids.len(), 0); + } +} diff --git a/server/src/http/cloud/mod.rs b/server/src/http/cloud/mod.rs index 38ca1e5f..fc593519 100644 --- a/server/src/http/cloud/mod.rs +++ b/server/src/http/cloud/mod.rs @@ -1,15 +1,32 @@ pub mod accept_team_invite; +pub mod add_passkey_finish; +pub mod add_passkey_start; pub mod cancel_team_user_invite; pub mod cancel_user_team_invite; +pub mod change_user_privileges; +pub mod delete_account_finish; +pub mod delete_account_start; +pub mod delete_app; +pub mod delete_passkey; +pub mod delete_team; +pub mod domains; pub mod events; pub mod get_events; +pub mod get_passkey_challenge; +pub mod get_team_metadata; pub mod get_team_user_invites; +pub mod get_team_users_privileges; pub mod get_user_joined_teams; +pub mod get_user_metadata; pub mod get_user_team_invites; +pub mod grafana_utils; pub mod invite_user_to_team; -pub mod login_with_google; -pub mod login_with_password; +pub mod leave_team; +pub mod login; +pub mod register; pub mod register_new_app; pub mod register_new_team; -pub mod register_with_password; pub mod remove_user_from_team; +pub mod reset_credentials; +pub mod utils; +pub mod verify_code; diff --git a/server/src/http/cloud/register/mod.rs b/server/src/http/cloud/register/mod.rs new file mode 100644 index 00000000..bee81985 --- /dev/null +++ b/server/src/http/cloud/register/mod.rs @@ -0,0 +1,4 @@ +pub mod register_with_passkey_finish; +pub mod register_with_passkey_start; +pub mod register_with_password_finish; +pub mod register_with_password_start; diff --git a/server/src/http/cloud/register/register_with_passkey_finish.rs b/server/src/http/cloud/register/register_with_passkey_finish.rs new file mode 100644 index 00000000..f7700911 --- /dev/null +++ b/server/src/http/cloud/register/register_with_passkey_finish.rs @@ -0,0 +1,129 @@ +use crate::{ + http::cloud::utils::{check_auth_code, generate_tokens, validate_request}, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, +}; +use axum::{ + extract::{ConnectInfo, State}, + http::StatusCode, + Json, +}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::{net::SocketAddr, sync::Arc}; + +use ts_rs::TS; +use uuid7::uuid7; +use webauthn_rs::prelude::RegisterPublicKeyCredential; +use webauthn_rs::Webauthn; + +#[derive(Validate, Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HttpRegisterWithPasskeyFinishRequest { + #[garde(email)] + pub email: String, + #[garde(skip)] + pub credential: RegisterPublicKeyCredential, + #[garde(skip)] + pub auth_code: String, + #[garde(skip)] + pub enforce_ip: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpRegisterWithPasskeyFinishResponse { + pub user_id: String, + pub auth_token: String, + pub refresh_token: String, +} + +pub async fn register_with_passkey_finish( + ConnectInfo(ip): ConnectInfo, + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Get cache data + let sessions_key = SessionsCacheKey::PasskeyVerification(request.email.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::VerifyPasskeyRegister(session)) => session, + _ => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Validate auth code + if !check_auth_code( + &request.auth_code, + &session_data.authentication_code, + session_data.created_at, + ) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredAuthCode.to_string(), + )); + } + + // Validate passkey register + let passkey = match web_auth.finish_passkey_registration( + &request.credential, + &session_data.passkey_registration_state, + ) { + Ok(sk) => sk, + Err(err) => { + error!("Failed to finish passkey registration: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )); + } + }; + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Save user to database + let user_id = uuid7().to_string(); + + match db + .add_new_user( + &user_id, + &request.email, + // None for password + None, + Some(&passkey), + ) + .await + { + Ok(_) => { + // Generate tokens + let (auth_token, refresh_token) = + generate_tokens(request.enforce_ip, ip, &user_id, &request.email)?; + return Ok(Json(HttpRegisterWithPasskeyFinishResponse { + auth_token, + refresh_token, + user_id, + })); + } + Err(err) => { + error!("Failed to create user: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } +} diff --git a/server/src/http/cloud/register/register_with_passkey_start.rs b/server/src/http/cloud/register/register_with_passkey_start.rs new file mode 100644 index 00000000..d6cb042c --- /dev/null +++ b/server/src/http/cloud/register/register_with_passkey_start.rs @@ -0,0 +1,119 @@ +use crate::{ + http::cloud::utils::{generate_verification_code, validate_request}, + mailer::{ + mail_requests::{EmailConfirmationRequest, SendEmailRequest}, + mailer::Mailer, + }, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, PasskeyVerification, SessionCache, SessionsCacheKey}, + }, + test_env::is_test_env, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; +use webauthn_rs::prelude::{CreationChallengeResponse, Uuid}; +use webauthn_rs::Webauthn; + +#[derive(Validate, Clone, Debug, Deserialize, Serialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpRegisterWithPasskeyStartRequest { + #[garde(email)] + pub email: String, + #[garde(alphanumeric)] + pub device: String, + #[garde(alphanumeric)] + pub browser: String, +} + +pub type HttpRegisterWithPasskeyStartResponse = CreationChallengeResponse; + +pub async fn register_with_passkey_start( + State(db): State>, + State(web_auth): State>, + State(mailer): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Check if user already exists + match db.get_user_by_email(&request.email).await { + Ok(Some(_)) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::EmailAlreadyExists.to_string(), + )) + } + Ok(None) => { + // Continue + } + Err(err) => { + error!("Failed to check if user exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Save to cache register request + let sessions_key = SessionsCacheKey::PasskeyVerification(request.email.clone()).to_string(); + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Generate challenge + let temp_user_id = Uuid::new_v4(); + let res = + web_auth.start_passkey_registration(temp_user_id, &request.email, &request.email, None); + + let (ccr, reg_state) = match res { + Ok((ccr, reg_state)) => (ccr, reg_state), + Err(_) => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )) + } + }; + + // Generate verification code, if not in production use a static code + let code = generate_verification_code(); + + // Send email with code + let email_request = SendEmailRequest::EmailConfirmation(EmailConfirmationRequest { + email: request.email.clone(), + code: code.clone(), + device: request.device.clone(), + browser: request.browser.clone(), + }); + + if !is_test_env() { + // It doesn't matter if this fails + mailer.handle_email_request(&email_request); + } + + // Save the challenge to the cache + sessions_cache.set( + sessions_key, + SessionCache::VerifyPasskeyRegister(PasskeyVerification { + email: request.email, + passkey_registration_state: reg_state, + verification_code: code, + authentication_code: None, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + + return Ok(Json(ccr)); +} diff --git a/server/src/http/cloud/register_with_password.rs b/server/src/http/cloud/register/register_with_password_finish.rs similarity index 65% rename from server/src/http/cloud/register_with_password.rs rename to server/src/http/cloud/register/register_with_password_finish.rs index 4a38cc15..a11adb7a 100644 --- a/server/src/http/cloud/register_with_password.rs +++ b/server/src/http/cloud/register/register_with_password_finish.rs @@ -1,13 +1,13 @@ use crate::{ env::NONCE, - structs::cloud::api_cloud_errors::CloudApiErrors, - utils::{custom_validate_new_password, validate_request}, + http::cloud::utils::{check_auth_code, custom_validate_new_password, validate_request}, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, }; use axum::{extract::State, http::StatusCode, Json}; -use database::{ - db::Db, - tables::{grafana_users::table_struct::GrafanaUser, utils::get_current_datetime}, -}; +use database::db::Db; use garde::Validate; use log::error; use pwhash::bcrypt; @@ -19,54 +19,52 @@ use uuid7::uuid7; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] #[ts(export)] #[serde(rename_all = "camelCase")] -pub struct HttpRegisterWithPasswordRequest { +pub struct HttpRegisterWithPasswordFinishRequest { #[garde(email)] pub email: String, #[garde(custom(custom_validate_new_password))] - pub password: String, + pub new_password: String, + #[garde(skip)] + pub auth_code: String, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] #[ts(export)] -#[serde(rename_all = "camelCase")] -pub struct HttpRegisterWithPasswordResponse { - pub user_id: String, -} - -pub async fn register_with_password( - State(db): State>>, - Json(request): Json, -) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; +pub struct HttpRegisterWithPasswordFinishResponse {} +pub async fn register_with_password_finish( + State(db): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { // Validate request validate_request(&request, &())?; - // Check if user already exists - match db.get_user_by_email(&request.email).await { - Ok(Some(_)) => { - return Err(( - StatusCode::BAD_REQUEST, - CloudApiErrors::EmailAlreadyExists.to_string(), - )) - } - Ok(None) => { - // Continue - } - Err(err) => { - error!("Failed to check if user exists: {:?}", err); + // Get session data + let sessions_key = SessionsCacheKey::RegisterVerification(request.email.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::VerifyRegister(session)) => session, + _ => { return Err(( StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::DatabaseError.to_string(), + CloudApiErrors::InternalServerError.to_string(), )); } + }; + + // Validate auth code + if !check_auth_code( + &request.auth_code, + &session_data.authentication_code, + session_data.created_at, + ) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredAuthCode.to_string(), + )); } - let hashed_password = bcrypt::hash(format!("{}_{}", NONCE(), request.password.clone())) + let hashed_password = bcrypt::hash(format!("{}_{}", NONCE(), request.new_password.clone())) .map_err(|e| { error!("Failed to hash password: {:?}", e); ( @@ -75,16 +73,22 @@ pub async fn register_with_password( ) })?; - // Create new user + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Save the user to the database let user_id = uuid7().to_string(); - let grafana_user = GrafanaUser { - user_id: user_id.clone(), - email: request.email.clone(), - password_hash: hashed_password, - creation_timestamp: get_current_datetime(), - }; - if let Err(err) = db.add_new_user(&grafana_user).await { + if let Err(err) = db + .add_new_user( + &user_id, + &request.email, + Some(&hashed_password), + // None for passkeys + None, + ) + .await + { error!("Failed to create user: {:?}", err); return Err(( StatusCode::INTERNAL_SERVER_ERROR, @@ -92,14 +96,17 @@ pub async fn register_with_password( )); } - return Ok(Json(HttpRegisterWithPasswordResponse { user_id })); + return Ok(Json(HttpRegisterWithPasswordFinishResponse {})); } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use super::*; use crate::{ + http::cloud::register::register_with_password_start::{ + HttpRegisterWithPasswordStartRequest, HttpRegisterWithPasswordStartResponse, + }, structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, test_utils::test_utils::{ convert_response, convert_response_into_error_string, create_test_app, @@ -128,9 +135,10 @@ mod tests { let password = format!("Password123"); // Register user - let register_payload = HttpRegisterWithPasswordRequest { + let register_payload = HttpRegisterWithPasswordStartRequest { email: email.to_string(), - password: password.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); @@ -141,7 +149,7 @@ mod tests { .header("content-type", "application/json") .uri(format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordStart.to_string() )) .extension(ip) .body(Body::from(json)) @@ -150,36 +158,35 @@ mod tests { // Send request let register_response = test_app.clone().oneshot(req).await.unwrap(); // Validate response - convert_response::(register_response) + convert_response::(register_response) .await .unwrap(); - // Try to register the same user again, should fail - let register_payload = HttpRegisterWithPasswordRequest { + // Validate register + let verify_register_payload = HttpRegisterWithPasswordFinishRequest { email: email.to_string(), - password: password.to_string(), + new_password: password.to_string(), + // Random code for testing + auth_code: "123456".to_string(), }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); - let json = serde_json::to_string(®ister_payload).unwrap(); + let json = serde_json::to_string(&verify_register_payload).unwrap(); let req = Request::builder() .method(Method::POST) .header("content-type", "application/json") .uri(format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordFinish.to_string() )) .extension(ip) .body(Body::from(json)) .unwrap(); - // Send request - let register_response = test_app.clone().oneshot(req).await.unwrap(); - // Validate response - convert_response::(register_response) - .await - .unwrap_err(); + // send request to app and get response + let verify_register_response = test_app.clone().oneshot(req).await.unwrap(); + assert_eq!(verify_register_response.status(), StatusCode::OK); } #[tokio::test] @@ -187,12 +194,12 @@ mod tests { let test_app = create_test_app(false).await; let email = format!("@gmail.com"); - let password = format!("Password123"); // Register user - let register_payload = HttpRegisterWithPasswordRequest { + let register_payload = HttpRegisterWithPasswordStartRequest { email: email.to_string(), - password: password.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); @@ -203,7 +210,7 @@ mod tests { .header("content-type", "application/json") .uri(format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordStart.to_string() )) .extension(ip) .body(Body::from(json)) @@ -212,7 +219,7 @@ mod tests { // Send request let register_response = test_app.clone().oneshot(req).await.unwrap(); // Validate response, should be an error - convert_response::(register_response) + convert_response::(register_response) .await .unwrap_err(); @@ -220,9 +227,10 @@ mod tests { let email = format!("@gmail.com"); // Register user - let register_payload = HttpRegisterWithPasswordRequest { + let register_payload = HttpRegisterWithPasswordStartRequest { email: email.to_string(), - password: password.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); @@ -233,7 +241,7 @@ mod tests { .header("content-type", "application/json") .uri(format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordStart.to_string() )) .extension(ip) .body(Body::from(json)) @@ -242,7 +250,7 @@ mod tests { // Send request let register_response = test_app.clone().oneshot(req).await.unwrap(); // Validate response, should be an error - convert_response::(register_response) + convert_response::(register_response) .await .unwrap_err(); } @@ -254,14 +262,15 @@ mod tests { let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); let uri = format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordFinish.to_string() ); { let app = test_app.clone(); - let payload = HttpRegisterWithPasswordRequest { + let payload = HttpRegisterWithPasswordFinishRequest { email: "test@test.com".to_string(), - password: "dfsdsfa2asdada".to_string(), + new_password: "dfsdsfa2asdada".to_string(), + auth_code: "123456".to_string(), }; let json = serde_json::to_string(&payload).unwrap(); @@ -282,9 +291,10 @@ mod tests { } { let app = test_app.clone(); - let payload = HttpRegisterWithPasswordRequest { + let payload = HttpRegisterWithPasswordFinishRequest { email: "test@test.com".to_string(), - password: "dA4ds".to_string(), + auth_code: "123456".to_string(), + new_password: "dA4ds".to_string(), }; let json = serde_json::to_string(&payload).unwrap(); @@ -304,9 +314,10 @@ mod tests { } { let app = test_app.clone(); - let payload = HttpRegisterWithPasswordRequest { + let payload = HttpRegisterWithPasswordFinishRequest { email: "test@test.com".to_string(), - password: "Ab1aaaaaa¡".to_string(), + auth_code: "123456".to_string(), + new_password: "Ab1aaaaaa¡".to_string(), }; let json = serde_json::to_string(&payload).unwrap(); diff --git a/server/src/http/cloud/register/register_with_password_start.rs b/server/src/http/cloud/register/register_with_password_start.rs new file mode 100644 index 00000000..93dcb04c --- /dev/null +++ b/server/src/http/cloud/register/register_with_password_start.rs @@ -0,0 +1,101 @@ +use crate::{ + http::cloud::utils::{generate_verification_code, validate_request}, + mailer::{ + mail_requests::{EmailConfirmationRequest, SendEmailRequest}, + mailer::Mailer, + }, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, RegisterVerification, SessionCache, SessionsCacheKey}, + }, + test_env::is_test_env, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpRegisterWithPasswordStartRequest { + #[garde(email)] + pub email: String, + #[garde(alphanumeric)] + pub device: String, + #[garde(alphanumeric)] + pub browser: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpRegisterWithPasswordStartResponse {} + +pub async fn register_with_password_start( + State(db): State>, + State(sessions_cache): State>, + State(mailer): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Check if user already exists + match db.get_user_by_email(&request.email).await { + Ok(Some(_)) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::EmailAlreadyExists.to_string(), + )) + } + Ok(None) => { + // Continue + } + Err(err) => { + error!("Failed to check if user exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Save to cache register request + let sessions_key = SessionsCacheKey::RegisterVerification(request.email.clone()).to_string(); + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Generate verification code, if not in production use a static code + let code = generate_verification_code(); + + sessions_cache.set( + sessions_key, + SessionCache::VerifyRegister(RegisterVerification { + email: request.email.clone(), + verification_code: code.clone(), + authentication_code: None, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + + if !is_test_env() { + // Send code via email + let request = SendEmailRequest::EmailConfirmation(EmailConfirmationRequest { + email: request.email, + code: code, + device: request.device.clone(), + browser: request.browser.clone(), + }); + + // It doesn't matter if this fails + mailer.handle_email_request(&request); + } + + return Ok(Json(HttpRegisterWithPasswordStartResponse {})); +} diff --git a/server/src/http/cloud/register_new_app.rs b/server/src/http/cloud/register_new_app.rs index 5b188775..8b0ad8ea 100644 --- a/server/src/http/cloud/register_new_app.rs +++ b/server/src/http/cloud/register_new_app.rs @@ -1,15 +1,19 @@ -use crate::{ - middlewares::auth_middleware::UserId, - statics::REGISTERED_APPS_LIMIT_PER_TEAM, - structs::cloud::api_cloud_errors::CloudApiErrors, +use super::{ + grafana_utils::create_new_app::handle_grafana_create_new_app, utils::{custom_validate_name, custom_validate_uuid, validate_request}, }; +use crate::{ + env::is_env_production, middlewares::auth_middleware::UserId, + statics::REGISTERED_APPS_LIMIT_PER_TEAM, structs::cloud::api_cloud_errors::CloudApiErrors, + utils::start_transaction, +}; use axum::{extract::State, http::StatusCode, Extension, Json}; use database::{ db::Db, structs::privilege_level::PrivilegeLevel, tables::utils::get_current_datetime, }; use garde::Validate; use log::error; +use openapi::apis::configuration::Configuration; use serde::{Deserialize, Serialize}; use std::sync::Arc; use ts_rs::TS; @@ -23,10 +27,6 @@ pub struct HttpRegisterNewAppRequest { pub team_id: String, #[garde(custom(custom_validate_name))] pub app_name: String, - #[garde(skip)] - pub whitelisted_domains: Vec, - #[garde(skip)] - pub ack_public_keys: Vec, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] @@ -37,16 +37,11 @@ pub struct HttpRegisterNewAppResponse { } pub async fn register_new_app( - State(db): State>>, + State(db): State>, + State(grafana_conf): State>, Extension(user_id): Extension, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -61,17 +56,24 @@ pub async fn register_new_app( CloudApiErrors::InsufficientPermissions.to_string(), )); } - + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } // Check if user has already registered an app with this name in this team match db .get_registered_app_by_app_name_and_team_id(&request.app_name, &request.team_id) .await { - Ok(Some(_)) => { - return Err(( - StatusCode::BAD_REQUEST, - CloudApiErrors::AppAlreadyExists.to_string(), - )); + Ok(Some(team)) => { + if team.deactivated_at == None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::AppAlreadyExists.to_string(), + )); + } } Ok(None) => {} Err(err) => { @@ -104,21 +106,52 @@ pub async fn register_new_app( )); } } + // Generate a new app id + let app_id = uuid7().to_string(); + + // Grafana, add new app + // TODO, fix this by fixing methods for setting up grafana datasource + if is_env_production() { + let team_grafana_id = match team.grafana_id { + Some(grafana_id) => grafana_id, + None => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::TeamWithoutGrafanaId.to_string(), + )); + } + }; + + if let Err(err) = handle_grafana_create_new_app( + &grafana_conf, + &request.app_name, + &app_id, + &team_grafana_id, + ) + .await + { + error!("Failed to create new app in grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + }; + } // Register a new app under this team // Start a transaction - let mut tx = db.connection_pool.begin().await.unwrap(); + let mut tx = start_transaction(&db).await?; // Register a new app - let app_id = uuid7().to_string(); let db_registered_app = database::tables::registered_app::table_struct::DbRegisteredApp { app_id: app_id.clone(), team_id: team.team_id.clone(), app_name: request.app_name.clone(), - ack_public_keys: request.ack_public_keys.clone(), - whitelisted_domains: request.whitelisted_domains.clone(), + ack_public_keys: vec![], + whitelisted_domains: vec![], registration_timestamp: get_current_datetime(), + deactivated_at: None, }; if let Err(err) = db @@ -182,7 +215,14 @@ pub async fn register_new_app( } // If nothing failed commit the transaction - tx.commit().await.unwrap(); + // Commit transaction + if let Err(err) = tx.commit().await { + error!("Failed to commit transaction: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } return Ok(Json(HttpRegisterNewAppResponse { app_id })); } Ok(None) => { @@ -201,7 +241,7 @@ pub async fn register_new_app( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::{ @@ -240,8 +280,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); @@ -271,8 +309,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let json = serde_json::to_string(&request).unwrap(); @@ -318,8 +354,6 @@ mod tests { let request = HttpRegisterNewAppRequest { team_id: team_id.clone(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); diff --git a/server/src/http/cloud/register_new_team.rs b/server/src/http/cloud/register_new_team.rs index 643ac682..1df882cf 100644 --- a/server/src/http/cloud/register_new_team.rs +++ b/server/src/http/cloud/register_new_team.rs @@ -1,9 +1,11 @@ -use crate::{ - middlewares::auth_middleware::UserId, - statics::TEAMS_AMOUNT_LIMIT_PER_USER, - structs::cloud::api_cloud_errors::CloudApiErrors, +use super::{ + grafana_utils::create_new_team::handle_grafana_create_new_team, utils::{custom_validate_name, validate_request}, }; +use crate::{ + env::is_env_production, middlewares::auth_middleware::UserId, + statics::TEAMS_AMOUNT_LIMIT_PER_USER, structs::cloud::api_cloud_errors::CloudApiErrors, +}; use axum::{extract::State, http::StatusCode, Extension, Json}; use database::{ db::Db, @@ -11,6 +13,7 @@ use database::{ }; use garde::Validate; use log::error; +use openapi::apis::configuration::Configuration; use serde::{Deserialize, Serialize}; use std::sync::Arc; use ts_rs::TS; @@ -34,16 +37,11 @@ pub struct HttpRegisterNewTeamResponse { } pub async fn register_new_team( - State(db): State>>, + State(db): State>, + State(grafana_conf): State>, Extension(user_id): Extension, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -53,13 +51,16 @@ pub async fn register_new_team( .get_team_by_team_name_and_admin_id(&request.team_name, &user_id) .await { - Ok(Some(_)) => { - return Err(( - StatusCode::BAD_REQUEST, - CloudApiErrors::TeamAlreadyExists.to_string(), - )); - } - Ok(None) => { + Ok(team) => { + if let Some(team) = team { + if team.deactivated_at == None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamAlreadyExists.to_string(), + )); + } + } + // Check how many teams the user has match db.get_user_created_teams_without_personal(&user_id).await { Ok(teams) => { @@ -104,15 +105,56 @@ pub async fn register_new_team( } } - // Create a new team + // Get team admin email + let admin_email = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user)) => user.email, + Ok(None) => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + Err(err) => { + error!("Failed to get user by user_id: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + let mut grafana_team_id: Option = None; + // Grafana, add new team + if is_env_production() { + grafana_team_id = match handle_grafana_create_new_team( + &grafana_conf, + &admin_email, + &request.team_name, + ) + .await + { + Ok(id) => Some(id.to_string()), + Err(err) => { + error!("Failed to create team in grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + } + } + } + // Generate a new app id let team_id = uuid7().to_string(); + + // Create a new team let team = Team { - team_id: team_id.clone(), + team_id: team_id.to_string(), + grafana_id: grafana_team_id, team_name: request.team_name.clone(), team_admin_id: user_id.clone(), subscription: None, personal: request.personal, registration_timestamp: get_current_datetime(), + deactivated_at: None, }; if let Err(err) = db.create_new_team(&team).await { @@ -123,7 +165,9 @@ pub async fn register_new_team( )); } - return Ok(Json(HttpRegisterNewTeamResponse { team_id })); + return Ok(Json(HttpRegisterNewTeamResponse { + team_id: team_id.to_string(), + })); } Err(err) => { error!("Failed to get team by team name and admin id: {:?}", err); @@ -135,7 +179,7 @@ pub async fn register_new_team( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::{ diff --git a/server/src/http/cloud/remove_user_from_team.rs b/server/src/http/cloud/remove_user_from_team.rs index fae4f962..e66356c5 100644 --- a/server/src/http/cloud/remove_user_from_team.rs +++ b/server/src/http/cloud/remove_user_from_team.rs @@ -1,12 +1,21 @@ +use super::{ + grafana_utils::remove_user_from_the_team::handle_grafana_remove_user_from_team, + utils::{custom_validate_uuid, validate_request}, +}; use crate::{ + env::is_env_production, + mailer::{ + mail_requests::{SendEmailRequest, TeamRemovalNotification}, + mailer::Mailer, + }, middlewares::auth_middleware::UserId, structs::cloud::api_cloud_errors::CloudApiErrors, - utils::{custom_validate_uuid, validate_request}, }; use axum::{extract::State, http::StatusCode, Extension, Json}; use database::db::Db; use garde::Validate; use log::error; +use openapi::apis::configuration::Configuration; use serde::{Deserialize, Serialize}; use std::sync::Arc; use ts_rs::TS; @@ -26,16 +35,12 @@ pub struct HttpRemoveUserFromTeamRequest { pub struct HttpRemoveUserFromTeamResponse {} pub async fn remove_user_from_team( - State(db): State>>, + State(db): State>, + State(grafana_conf): State>, + State(mailer): State>, Extension(user_id): Extension, Json(request): Json, ) -> Result, (StatusCode, String)> { - // Db connection has already been checked in the middleware - let db = db.as_ref().ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::CloudFeatureDisabled.to_string(), - ))?; - // Validate request validate_request(&request, &())?; @@ -50,6 +55,13 @@ pub async fn remove_user_from_team( )); } + if team.deactivated_at != None { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::TeamDoesNotExist.to_string(), + )); + } + // Get user data and perform checks let user = match db.get_user_by_email(&request.user_email).await { Ok(Some(user)) => user, @@ -94,22 +106,73 @@ pub async fn remove_user_from_team( } } + // Grafana, remove user from the team + if is_env_production() { + let team_grafana_id = match team.grafana_id { + Some(grafana_id) => grafana_id, + None => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::TeamWithoutGrafanaId.to_string(), + )); + } + }; + + if let Err(err) = handle_grafana_remove_user_from_team( + &grafana_conf, + &team_grafana_id, + &request.user_email, + ) + .await + { + error!("Failed to remove user from the team in grafana: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::GrafanaError.to_string(), + )); + }; + } // Remove user from the team - match db + if let Err(err) = db .remove_user_from_the_team(&user.user_id, &request.team_id) .await { - Ok(_) => { - return Ok(Json(HttpRemoveUserFromTeamResponse {})); + error!("Failed to remove user from the team: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + // Get user data and perform checks + let remover = match db.get_user_by_user_id(&user_id).await { + Ok(Some(user)) => user, + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); } Err(err) => { - error!("Failed to remove user from the team: {:?}", err); + error!("Failed to get user by id: {:?}", err); return Err(( StatusCode::INTERNAL_SERVER_ERROR, CloudApiErrors::DatabaseError.to_string(), )); } - } + }; + + // Send email notification + let request = SendEmailRequest::TeamRemoval(TeamRemovalNotification { + email: user.email.clone(), + team_name: team.team_name.clone(), + remover_email: remover.email.clone(), + }); + + // It doesn't matter if this fails + mailer.handle_email_request(&request); + + // Return response + Ok(Json(HttpRemoveUserFromTeamResponse {})) } Ok(None) => { return Err(( @@ -127,7 +190,7 @@ pub async fn remove_user_from_team( } } -#[cfg(feature = "cloud_db_tests")] +#[cfg(feature = "cloud_integration_tests")] #[cfg(test)] mod tests { use crate::{ @@ -153,15 +216,16 @@ mod tests { }; use std::net::SocketAddr; use tower::ServiceExt; + use uuid7::uuid7; #[tokio::test] async fn test_remove_user_from_team() { let test_app = create_test_app(false).await; let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; - // Register new team let team_name = generate_valid_name(); + let team_id = add_test_team(&team_name, &auth_token, &test_app, false) .await .unwrap(); @@ -169,10 +233,8 @@ mod tests { // Register app under the team let app_name = generate_valid_name(); let request = HttpRegisterNewAppRequest { - team_id: team_id.clone(), + team_id: team_id.to_string(), app_name: app_name.clone(), - whitelisted_domains: vec![], - ack_public_keys: vec![], }; // unwrap err as it should have failed @@ -186,7 +248,7 @@ mod tests { // Add user to the team add_user_to_test_team( - &team_id, + &team_id.to_string(), &test_user_email, &auth_token, &test_user_auth_token, @@ -197,7 +259,7 @@ mod tests { // Remove user from the team let request = HttpRemoveUserFromTeamRequest { - team_id: team_id.clone(), + team_id: team_id.to_string(), user_email: test_user_email.clone(), }; @@ -259,9 +321,11 @@ mod tests { let (auth_token, _email, _password) = register_and_login_random_user(&test_app).await; - // Team does not exist, use random uuid + let team_id = uuid7().to_string(); + + // Team does not exist let resp = remove_user_from_test_team( - &uuid7::uuid7().to_string(), + &team_id, &"test_user_email@gmail.com".to_string(), &auth_token, &test_app, diff --git a/server/src/http/cloud/reset_credentials/mod.rs b/server/src/http/cloud/reset_credentials/mod.rs new file mode 100644 index 00000000..32322733 --- /dev/null +++ b/server/src/http/cloud/reset_credentials/mod.rs @@ -0,0 +1,4 @@ +pub mod reset_passkey_finish; +pub mod reset_passkey_start; +pub mod reset_password_finish; +pub mod reset_password_start; diff --git a/server/src/http/cloud/reset_credentials/reset_passkey_finish.rs b/server/src/http/cloud/reset_credentials/reset_passkey_finish.rs new file mode 100644 index 00000000..9aba69f7 --- /dev/null +++ b/server/src/http/cloud/reset_credentials/reset_passkey_finish.rs @@ -0,0 +1,151 @@ +use crate::{ + http::cloud::utils::{check_auth_code, validate_request}, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, +}; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use garde::Validate; +use log::{error, warn}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; +use webauthn_rs::prelude::RegisterPublicKeyCredential; +use webauthn_rs::Webauthn; + +#[derive(Validate, Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HttpResetPasskeyFinishRequest { + #[garde(email)] + pub email: String, + #[garde(skip)] + pub credential: RegisterPublicKeyCredential, + #[garde(skip)] + pub auth_code: String, +} + +#[derive(Validate, Clone, Debug, Deserialize, Serialize, TS)] +#[ts(export)] +pub struct HttpResetPasskeyFinishResponse {} + +pub async fn reset_passkey_finish( + State(db): State>, + State(web_auth): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Get cache data + let sessions_key = + SessionsCacheKey::ResetPasskeyVerification(request.email.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::ResetPasskey(session)) => session, + _ => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Validate auth code + if !check_auth_code( + &request.auth_code, + &session_data.authentication_code, + session_data.created_at, + ) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredAuthCode.to_string(), + )); + } + + // Validate passkey reset + let passkey = match web_auth.finish_passkey_registration( + &request.credential, + &session_data.passkey_registration_state, + ) { + Ok(sk) => sk, + Err(err) => { + error!( + "Failed to finish passkey reset: {:?}, user_email: {}", + err, &request.email + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )); + } + }; + + // Validate new passkey + // Get user data + let user_data = match db.get_user_by_email(&request.email).await { + Ok(Some(user_data)) => user_data, + Ok(None) => { + warn!("Reaching this place [Passkey reset finish, user does not exist] should not be possible as we have already checked it during reset start method, user email: {}", &request.email); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )); + } + Err(err) => { + error!( + "Failed to get user data: {:?}, user_email: {}", + err, &request.email + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + }; + + // Check if user has already added this passkey + let mut passkeys = match user_data.passkeys { + Some(passkeys) => { + if passkeys.contains(&passkey) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::PasskeyAlreadyExists.to_string(), + )); + } + + passkeys + } + None => { + warn!("Reaching this place [Passkey reset finish, user does not have passkey] should not be possible as we have already checked it during reset start method, user email: {}", &request.email); + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotHavePasskey.to_string(), + )); + } + }; + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Add new passkey + passkeys.push(passkey); + + // Update passkeys in database + match db.update_passkeys(&request.email, &passkeys).await { + Ok(_) => { + return Ok(Json(HttpResetPasskeyFinishResponse {})); + } + Err(err) => { + error!( + "Failed to update user passkeys: {:?}, user_email: {}", + err, &request.email + ); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } +} diff --git a/server/src/http/cloud/reset_credentials/reset_passkey_start.rs b/server/src/http/cloud/reset_credentials/reset_passkey_start.rs new file mode 100644 index 00000000..828a0f28 --- /dev/null +++ b/server/src/http/cloud/reset_credentials/reset_passkey_start.rs @@ -0,0 +1,125 @@ +use crate::{ + http::cloud::utils::{generate_verification_code, validate_request}, + mailer::{ + mail_requests::{EmailConfirmationRequest, SendEmailRequest}, + mailer::Mailer, + }, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, PasskeyVerification, SessionCache, SessionsCacheKey}, + }, + test_env::is_test_env, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; +use webauthn_rs::prelude::{CreationChallengeResponse, Uuid}; +use webauthn_rs::Webauthn; + +#[derive(Validate, Clone, Debug, Deserialize, Serialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpResetPasskeyStartRequest { + #[garde(email)] + pub email: String, + #[garde(alphanumeric)] + pub device: String, + #[garde(alphanumeric)] + pub browser: String, +} + +pub type HttpResetPasskeyStartResponse = CreationChallengeResponse; + +pub async fn reset_passkey_start( + State(db): State>, + State(web_auth): State>, + State(mailer): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Check if user already exists + match db.get_user_by_email(&request.email).await { + Ok(Some(user_data)) => { + // Check if user has a passkey + if user_data.passkeys.is_none() { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotHavePasskey.to_string(), + )); + } + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )) + } + Err(err) => { + error!("Failed to check if user exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Save to cache register request + let sessions_key = SessionsCacheKey::PasskeyVerification(request.email.clone()).to_string(); + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Generate challenge + let temp_user_id = Uuid::new_v4(); + let res = + web_auth.start_passkey_registration(temp_user_id, &request.email, &request.email, None); + + let (ccr, reg_state) = match res { + Ok((ccr, reg_state)) => (ccr, reg_state), + Err(_) => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::WebAuthnError.to_string(), + )) + } + }; + + // Generate verification code, if not in production use a static code + let code = generate_verification_code(); + + // Send email with code + let email_request = SendEmailRequest::EmailConfirmation(EmailConfirmationRequest { + email: request.email.clone(), + code: code.clone(), + device: request.device.clone(), + browser: request.browser.clone(), + }); + + if !is_test_env() { + // It doesn't matter if this fails + mailer.handle_email_request(&email_request); + } + + // Save the challenge to the cache + sessions_cache.set( + sessions_key, + SessionCache::VerifyPasskeyRegister(PasskeyVerification { + email: request.email.clone(), + passkey_registration_state: reg_state, + verification_code: code, + authentication_code: None, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + + return Ok(Json(ccr)); +} diff --git a/server/src/http/cloud/reset_credentials/reset_password_finish.rs b/server/src/http/cloud/reset_credentials/reset_password_finish.rs new file mode 100644 index 00000000..c410d284 --- /dev/null +++ b/server/src/http/cloud/reset_credentials/reset_password_finish.rs @@ -0,0 +1,208 @@ +use crate::{ + env::NONCE, + http::cloud::utils::{check_auth_code, custom_validate_new_password, validate_request}, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, SessionsCacheKey}, + }, +}; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use pwhash::bcrypt; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpResetPasswordFinishRequest { + #[garde(email)] + pub email: String, + #[garde(custom(custom_validate_new_password))] + pub new_password: String, + #[garde(skip)] + pub auth_code: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpResetPasswordFinishResponse {} + +pub async fn reset_password_finish( + State(db): State>, + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Get session data + let sessions_key = + SessionsCacheKey::ResetPasswordVerification(request.email.clone()).to_string(); + let session_data = match sessions_cache.get(&sessions_key) { + Some(SessionCache::ResetPassword(session)) => session, + _ => { + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + )); + } + }; + + // Validate auth code + if !check_auth_code( + &request.auth_code, + &session_data.authentication_code, + session_data.created_at, + ) { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredAuthCode.to_string(), + )); + } + + let hashed_password = bcrypt::hash(format!("{}_{}", NONCE(), request.new_password.clone())) + .map_err(|e| { + error!("Failed to hash password: {:?}", e); + ( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::InternalServerError.to_string(), + ) + })?; + + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Update user password + if let Err(err) = db + .set_new_password(&session_data.email, &hashed_password) + .await + { + error!("Failed to set new password: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + + return Ok(Json(HttpResetPasswordFinishResponse {})); +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + http::cloud::{ + login::login_with_password::{HttpLoginRequest, HttpLoginResponse}, + reset_credentials::reset_password_start::{ + HttpResetPasswordStartRequest, HttpResetPasswordStartResponse, + }, + }, + structs::cloud::cloud_http_endpoints::HttpCloudEndpoint, + test_utils::test_utils::{ + convert_response, create_test_app, register_and_login_random_user, + }, + }; + use axum::{ + body::Body, + extract::ConnectInfo, + http::{Method, Request}, + }; + use std::net::SocketAddr; + use tower::ServiceExt; + + #[tokio::test] + async fn test_reset_password() { + let test_app = create_test_app(false).await; + + // Register new user + let (_auth_token, email, _password) = register_and_login_random_user(&test_app).await; + + // Start password reset + let new_password = "NewValidPassword123".to_string(); + + let password_reset_start_payload = HttpResetPasswordStartRequest { + email: email.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&password_reset_start_payload).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::ResetPasswordStart.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let register_response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(register_response) + .await + .unwrap(); + + // Validate new password change + let verify_register_payload = HttpResetPasswordFinishRequest { + email: email.to_string(), + new_password: new_password.to_string(), + // Random code for testing + auth_code: "123456789".to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&verify_register_payload).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::ResetPasswordFinish.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // send request to app and get response + let verify_register_response = test_app.clone().oneshot(req).await.unwrap(); + assert_eq!(verify_register_response.status(), StatusCode::OK); + + // Log in using new password + // Login user + let login_payload = HttpLoginRequest { + email: email.to_string(), + password: new_password.to_string(), + enforce_ip: false, + }; + + let json = serde_json::to_string(&login_payload).unwrap(); + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::LoginWithPassword.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let login_response = test_app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(login_response) + .await + .unwrap(); + } +} diff --git a/server/src/http/cloud/reset_credentials/reset_password_start.rs b/server/src/http/cloud/reset_credentials/reset_password_start.rs new file mode 100644 index 00000000..04425313 --- /dev/null +++ b/server/src/http/cloud/reset_credentials/reset_password_start.rs @@ -0,0 +1,103 @@ +use crate::{ + http::cloud::utils::{generate_verification_code, validate_request}, + mailer::{ + mail_requests::{ResetPasswordRequest, SendEmailRequest}, + mailer::Mailer, + }, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ + ApiSessionsCache, ResetPasswordVerification, SessionCache, SessionsCacheKey, + }, + }, + test_env::is_test_env, + utils::get_timestamp_in_milliseconds, +}; +use axum::{extract::State, http::StatusCode, Json}; +use database::db::Db; +use garde::Validate; +use log::error; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpResetPasswordStartRequest { + #[garde(email)] + pub email: String, + #[garde(alphanumeric)] + pub device: String, + #[garde(alphanumeric)] + pub browser: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +pub struct HttpResetPasswordStartResponse {} + +pub async fn reset_password_start( + State(db): State>, + State(sessions_cache): State>, + State(mailer): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Check if user exists + match db.get_user_by_email(&request.email).await { + Ok(Some(_)) => { + // Continue + } + Ok(None) => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::UserDoesNotExist.to_string(), + )) + } + Err(err) => { + error!("Failed to check if user exists: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )); + } + } + + // Save to cache password reset request + let sessions_key = + SessionsCacheKey::ResetPasswordVerification(request.email.clone()).to_string(); + // Remove leftover session data + sessions_cache.remove(&sessions_key); + + // Generate verification code, if not in production use a static code + let code = generate_verification_code(); + + sessions_cache.set( + sessions_key, + SessionCache::ResetPassword(ResetPasswordVerification { + email: request.email.clone(), + verification_code: code.clone(), + authentication_code: None, + created_at: get_timestamp_in_milliseconds(), + }), + None, + ); + + // Send code via email, only on PROD + let email_request = SendEmailRequest::ResetPassword(ResetPasswordRequest { + email: request.email, + code: code, + device: request.device.clone(), + browser: request.browser.clone(), + }); + + if !is_test_env() { + // It doesn't matter if this fails + mailer.handle_email_request(&email_request); + } + + return Ok(Json(HttpResetPasswordStartResponse {})); +} diff --git a/server/src/http/cloud/utils.rs b/server/src/http/cloud/utils.rs new file mode 100644 index 00000000..b8afeb01 --- /dev/null +++ b/server/src/http/cloud/utils.rs @@ -0,0 +1,393 @@ +use crate::{ + auth::AuthToken, + env::{is_env_production, JWT_SECRET, NONCE}, + ip_geolocation::GeolocationRequester, + statics::{CODE_REGEX, NAME_REGEX, REGISTER_PASSWORD_VALIDATOR}, + structs::cloud::api_cloud_errors::CloudApiErrors, + test_env::is_test_env, + utils::get_timestamp_in_milliseconds, +}; +use addr::parse_domain_name; +use anyhow::bail; +use axum::http::StatusCode; +use database::{ + db::Db, + structs::{ + consts::DAY_IN_SECONDS, geo_location::Geolocation, pagination_cursor::PaginationCursor, + }, + tables::{ip_addresses::table_struct::IpAddressEntry, utils::get_current_datetime}, +}; +use garde::Validate; +use log::{error, info, warn}; +use rand::{ + distributions::{Alphanumeric, Uniform}, + Rng, +}; +use reqwest::Url; +use sha256::digest; +use std::{net::SocketAddr, str::FromStr, sync::Arc, time::Duration}; +use uuid7::Uuid; + +pub fn validate_request(payload: T, ctx: &T::Context) -> Result<(), (StatusCode, String)> +where + T: Validate, +{ + payload.validate(ctx).map_err(|report| { + let error_message = match report.iter().next() { + Some((_, error)) => error.message().to_string(), + None => "Unknown error".to_string(), + }; + + (StatusCode::BAD_REQUEST, format!("{}", error_message)) + })?; + return Ok(()); +} + +pub fn custom_validate_uuid(string_uuid: &String, _context: &()) -> garde::Result { + Uuid::from_str(&string_uuid) + .map_err(|_| garde::Error::new("Invalid UUID format".to_string()))?; + Ok(()) +} + +pub fn custom_validate_name(name: &String, _context: &()) -> garde::Result { + NAME_REGEX + .is_match(name) + .then(|| ()) + .ok_or_else(|| garde::Error::new(CloudApiErrors::InvalidName.to_string())) +} + +pub fn custom_validate_new_password(password: &String, _context: &()) -> garde::Result { + if !password.is_ascii() { + return Err(garde::Error::new("Password contains non-ascii characters")); + } + for validator in REGISTER_PASSWORD_VALIDATOR.iter() { + if !validator.re.is_match(password) { + return Err(garde::Error::new(validator.error.as_str())); + } + } + Ok(()) +} + +pub fn custom_validate_optional_pagination_cursor( + cursor: &Option, + _context: &(), +) -> garde::Result { + match cursor { + Some(cursor) => { + if cursor.0.is_empty() { + return Err(garde::Error::new( + CloudApiErrors::InvalidPaginationCursor.to_string(), + )); + } + Ok(()) + } + None => Ok(()), + } +} + +pub fn custom_validate_verification_code(name: &String, _context: &()) -> garde::Result { + CODE_REGEX.is_match(name).then(|| ()).ok_or_else(|| { + garde::Error::new(CloudApiErrors::InvalidOrExpiredVerificationCode.to_string()) + }) +} + +pub fn generate_verification_code() -> String { + if !is_env_production() || is_test_env() { + return "123456".to_string(); + } + + let mut rng = rand::thread_rng(); + let range = Uniform::new(0, 10); + let code = (0..6).map(|_| rng.sample(&range).to_string()).collect(); + code +} + +pub fn generate_authentication_code() -> (String, String) { + let auth_code: String = rand::thread_rng() + .sample_iter(&Alphanumeric) + .take(30) + .map(char::from) + .collect(); + + let encrypted_auth_code = digest(format!("{}{}", NONCE(), auth_code)); + + (auth_code, encrypted_auth_code) +} + +pub fn check_verification_code(code: &String, verification_code: &String, created_at: u64) -> bool { + if code != verification_code { + return false; + } + + let current_time = get_timestamp_in_milliseconds(); + let time_diff = current_time - created_at; + + // Code expires after 5 minutes (5 * 60 * 1000 = 300_000 ms) + if time_diff > 300_000 { + return false; + } + + true +} + +pub fn check_auth_code( + auth_code: &String, + encrypted_auth_code: &Option, + created_at: u64, +) -> bool { + if is_test_env() { + if encrypted_auth_code.is_none() { + println!("Encrypted auth code is missing"); + } + + return true; + } + + let encrypted_auth_code = match encrypted_auth_code { + Some(auth_code) => auth_code, + None => return false, + }; + + if encrypted_auth_code != &digest(format!("{}{}", NONCE(), auth_code)) { + return false; + } + + let current_time = get_timestamp_in_milliseconds(); + let time_diff = current_time - created_at; + + // Code expires after 5 minutes (5 * 60 * 1000 = 300_000 ms) + if time_diff > 300_000 { + return false; + } + + true +} + +pub async fn get_geolocation_data( + db: &Arc, + geo_loc_requester: &Arc, + ip: &SocketAddr, +) -> Option { + // Check if we already have the data in the database + match db.get_ip_address(&ip.to_string()).await { + Ok(Some(ip_address)) => { + // Check if the data is not older than 24 hours + let current_time = get_current_datetime(); + + if ip_address.last_updated_at + Duration::from_secs(DAY_IN_SECONDS) > current_time { + return Some(Geolocation { + country: ip_address.country, + city: ip_address.city, + lat: ip_address.lat, + lon: ip_address.lon, + }); + } + } + Ok(None) => { + // Do nothing, we will fetch the data from the geolocation service + } + Err(err) => { + warn!("Failed to get geolocation, ip: [{}], err: [{}]", ip, err); + return None; + } + } + + // Skip requesting geolocation data if the ip is localhost + if ip.ip().is_loopback() { + info!("Skipping geolocation request for localhost ip: [{}]", ip); + return None; + } + + // Fetch data from the geolocation service and update the database + match geo_loc_requester.get_geolocation(&ip.to_string()).await { + Ok(geo_location) => match (geo_location.lat, geo_location.lon) { + (Some(_), Some(_)) => { + let ip_address_entry = IpAddressEntry { + ip_addr: ip.to_string(), + last_updated_at: get_current_datetime(), + country: geo_location.country.clone(), + city: geo_location.city.clone(), + lat: geo_location.lat.clone(), + lon: geo_location.lon.clone(), + }; + + // Try to safely insert the new ip address + if let Err(err) = db.upsert_ip_address(&ip_address_entry).await { + warn!( + "Failed to insert new ip address, ip: [{}], err: [{}]", + ip, err + ); + } + + // Return the geolocation data, no matter if the we managed to save the data to the database + Some(geo_location.into()) + } + _ => { + warn!( + "Failed to get geolocation, ip: [{}], err: [{}]", + ip, "Latitude or longitude is missing" + ); + None + } + }, + Err(err) => { + warn!("Failed to get geolocation, ip: [{}], err: [{}]", ip, err); + None + } + } +} + +pub fn generate_tokens( + enforce_ip: bool, + ip: SocketAddr, + user_id: &String, + user_email: &String, + // (Auth Token, Refresh Token) +) -> Result<(String, String), (StatusCode, String)> { + // Generate tokens + let ip = if enforce_ip { Some(ip) } else { None }; + // Access token + let token = match AuthToken::new_access(&user_id, &user_email, ip).encode(JWT_SECRET()) { + Ok(token) => token, + Err(err) => { + error!("Failed to create access token: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::AccessTokenFailure.to_string(), + )); + } + }; + // Refresh token + let refresh_token = match AuthToken::new_refresh(&user_id, &user_email, ip).encode(JWT_SECRET()) + { + Ok(token) => token, + Err(err) => { + error!("Failed to create refresh token: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::RefreshTokenFailure.to_string(), + )); + } + }; + + Ok((token, refresh_token)) +} + +pub fn refresh_auth_token( + refresh_token: AuthToken, + ip: Option, +) -> Result { + match AuthToken::new_access(&refresh_token.user_id, &refresh_token.sub, ip).encode(JWT_SECRET()) + { + Ok(token) => return Ok(token), + Err(err) => { + error!("Failed to create access token: {:?}", err); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::AccessTokenFailure.to_string(), + )); + } + }; +} + +pub fn custom_validate_domain_name(domain_name: &String) -> anyhow::Result { + let mut domain = domain_name.trim(); + + // Remove 'https://', 'http://', 'www.' prefix or path if present + if let Some(stripped) = domain.strip_prefix("https://") { + domain = stripped; + } else if let Some(stripped) = domain.strip_prefix("http://") { + domain = stripped; + } + + if let Some(stripped) = domain.strip_prefix("www.") { + domain = stripped; + } + + if let Some((base_domain, _)) = domain.split_once('/') { + domain = base_domain; + } + + // Check if the domain name is empty + if domain.is_empty() { + warn!("Domain name is empty: {:?}", domain_name); + bail!(CloudApiErrors::InvalidDomainName); + } + + match parse_domain_name(domain) { + Ok(name) => { + return Ok(name.to_string()); + } + Err(err) => { + warn!("Failed to convert domain name to ascii: {:?}", err); + bail!(CloudApiErrors::InvalidDomainName); + } + } +} + +pub fn extract_domain_name(origin: &String) -> Result { + let parsed_url = Url::parse(origin).map_err(|err| { + format!("Failed to parse origin: {:?}, err: {:?}", origin, err).to_string() + })?; + + // Extract the domain name + let domain_name = parsed_url.domain().ok_or_else(|| { + format!( + "Failed to extract domain from parsed_url: {:?}, origin: {:?}", + parsed_url, origin + ) + .to_string() + })?; + + Ok(domain_name.to_string()) +} + +#[cfg(feature = "cloud_integration_tests")] +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_valid_ascii_domain() { + let domain_name = String::from("example.com"); + assert!(custom_validate_domain_name(&domain_name).is_ok()); + } + + #[test] + fn test_valid_unicode_domain() { + let domain_name = String::from("münchen.de"); + assert!(custom_validate_domain_name(&domain_name).is_ok()); + } + + #[test] + fn test_invalid_domain() { + let domain_name = String::from("this is not a domain"); + assert!(custom_validate_domain_name(&domain_name).is_err()); + let domain_name = String::from("https://www.figma.com/"); + assert_eq!( + custom_validate_domain_name(&domain_name).unwrap(), + "figma.com".to_string() + ); + let domain_name = String::from("http://www.figma.com"); + assert_eq!( + custom_validate_domain_name(&domain_name).unwrap(), + "figma.com".to_string() + ); + let domain_name = String::from("www.figma.com"); + assert_eq!( + custom_validate_domain_name(&domain_name).unwrap(), + "figma.com".to_string() + ); + let domain_name = String::from("https://www.figma.com/dfgsg"); + assert_eq!( + custom_validate_domain_name(&domain_name).unwrap(), + "figma.com".to_string() + ); + } + + #[test] + fn test_empty_domain() { + let domain_name = String::from(""); + assert!(custom_validate_domain_name(&domain_name).is_err()); + } +} diff --git a/server/src/http/cloud/verify_code.rs b/server/src/http/cloud/verify_code.rs new file mode 100644 index 00000000..584d24c0 --- /dev/null +++ b/server/src/http/cloud/verify_code.rs @@ -0,0 +1,158 @@ +use super::utils::{check_verification_code, generate_authentication_code}; +use crate::{ + http::cloud::utils::{custom_validate_verification_code, validate_request}, + structs::{ + cloud::api_cloud_errors::CloudApiErrors, + session_cache::{ApiSessionsCache, SessionCache, VerificationAction}, + }, +}; +use axum::{extract::State, http::StatusCode, Json}; +use garde::Validate; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS, Validate)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpVerifyCodeRequest { + #[garde(email)] + pub email: String, + #[garde(custom(custom_validate_verification_code))] + pub code: String, + #[garde(skip)] + pub action: VerificationAction, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct HttpVerifyCodeResponse { + pub verification_code: String, +} + +pub async fn verify_code( + State(sessions_cache): State>, + Json(request): Json, +) -> Result, (StatusCode, String)> { + // Validate request + validate_request(&request, &())?; + + // Read session data + let sessions_key = request + .action + .to_session_key(request.email.clone()) + .to_string(); + + // Retrieve session data + let (auth_code, cache_entry) = match sessions_cache.get(&sessions_key) { + Some(SessionCache::VerifyRegister(mut session)) => { + // Check if code is correct and not expired + if check_verification_code( + &session.verification_code, + &request.code, + session.created_at, + ) { + // Generate authentication code + let (auth_code, encrypted_auth_code) = generate_authentication_code(); + session.authentication_code = Some(encrypted_auth_code); + + (auth_code, SessionCache::VerifyRegister(session)) + } else { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredVerificationCode.to_string(), + )); + } + } + Some(SessionCache::VerifyPasskeyRegister(mut session)) => { + // Check if code is correct and not expired + if check_verification_code( + &session.verification_code, + &request.code, + session.created_at, + ) { + // Generate authentication code + let (auth_code, encrypted_auth_code) = generate_authentication_code(); + session.authentication_code = Some(encrypted_auth_code); + + (auth_code, SessionCache::VerifyPasskeyRegister(session)) + } else { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredVerificationCode.to_string(), + )); + } + } + Some(SessionCache::ResetPassword(mut session)) => { + // Check if code is correct and not expired + if check_verification_code( + &session.verification_code, + &request.code, + session.created_at, + ) { + // Generate authentication code + let (auth_code, encrypted_auth_code) = generate_authentication_code(); + session.authentication_code = Some(encrypted_auth_code); + + (auth_code, SessionCache::ResetPassword(session)) + } else { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredVerificationCode.to_string(), + )); + } + } + Some(SessionCache::ResetPasskey(mut session)) => { + // Check if code is correct and not expired + if check_verification_code( + &session.verification_code, + &request.code, + session.created_at, + ) { + // Generate authentication code + let (auth_code, encrypted_auth_code) = generate_authentication_code(); + session.authentication_code = Some(encrypted_auth_code); + + (auth_code, SessionCache::ResetPasskey(session)) + } else { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredVerificationCode.to_string(), + )); + } + } + Some(SessionCache::DeleteAccount(mut session)) => { + // Check if code is correct and not expired + if check_verification_code( + &session.verification_code, + &request.code, + session.created_at, + ) { + // Generate authentication code + let (auth_code, encrypted_auth_code) = generate_authentication_code(); + session.authentication_code = Some(encrypted_auth_code); + + (auth_code, SessionCache::DeleteAccount(session)) + } else { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidOrExpiredVerificationCode.to_string(), + )); + } + } + _ => { + return Err(( + StatusCode::BAD_REQUEST, + CloudApiErrors::InvalidAction.to_string(), + )); + } + }; + + // Update cache entry + sessions_cache.set(sessions_key, cache_entry, None); + + Ok(Json(HttpVerifyCodeResponse { + verification_code: auth_code, + })) +} diff --git a/server/src/http/relay/connect_session.rs b/server/src/http/relay/connect_session.rs index 7e7c8c75..16e05715 100644 --- a/server/src/http/relay/connect_session.rs +++ b/server/src/http/relay/connect_session.rs @@ -1,9 +1,10 @@ use crate::{ errors::NightlyError, state::{ClientToSessions, ModifySession, SessionToApp, SessionToAppMap, Sessions}, - structs::common::{Device, Notification}, + structs::common::Notification, }; use axum::{extract::State, http::StatusCode, Json}; +use database::structs::device_metadata::Device; use serde::{Deserialize, Serialize}; use ts_rs::TS; diff --git a/server/src/infra_env.rs b/server/src/infra_env.rs new file mode 100644 index 00000000..27970b51 --- /dev/null +++ b/server/src/infra_env.rs @@ -0,0 +1,182 @@ +#![allow(non_snake_case)] +use once_cell::sync::OnceCell; + +#[derive(Debug)] +pub struct INFRA_ENV { + pub ENVIRONMENT: String, + pub ONLY_DATABASE: bool, + pub DATABASE_ADDRESS: String, + pub DATABASE_PORT: String, + pub POSTGRES_USER: String, + pub POSTGRES_PASSWORD: String, + pub POSTGRES_DB: String, + pub PG_DATA: String, + pub GRAFANA_DB_USERNAME: String, + pub GRAFANA_DB_PASSWORD: String, + pub TIMESCALEDB_IMAGE: String, + pub OFELIA_IMAGE: String, + pub TIMESCALEDB_DATA: String, + pub TIMESCALEDB_BACKUPS: String, + pub TIMESCALEDB_LOGS: String, + pub TIMESCALEDB_PGBACKREST_CONFIG: String, + pub OFELIA_LOGS: String, + pub MANUAL_BACKUPS: String, + pub CUSTOM_ENTRYPOINT: String, + pub OFELIA_SMTP_HOST: String, + pub OFELIA_SMTP_PORT: String, + pub OFELIA_SMTP_USER: String, + pub OFELIA_SMTP_PASSWORD: String, + pub OFELIA_EMAIL_FROM: String, + pub OFELIA_EMAIL_TO: String, +} + +pub fn get_env() -> &'static INFRA_ENV { + static INSTANCE: OnceCell = OnceCell::new(); + + INSTANCE.get_or_init(|| { + dotenvy::from_filename(".env").ok(); + + let env = INFRA_ENV { + ENVIRONMENT: std::env::var("ENV").unwrap_or_else(|_| "DEV".to_string()), // Default to DEV if not set + ONLY_DATABASE: std::env::var("ONLY_DATABASE") + .unwrap_or_else(|_| "false".to_string()) + .eq_ignore_ascii_case("true"), + DATABASE_ADDRESS: std::env::var("DATABASE_ADDRESS") + .expect("Failed to get DATABASE_ADDRESS env"), + DATABASE_PORT: std::env::var("DATABASE_PORT").unwrap_or_else(|_| "5432".to_string()), // Default to 5432 if not set + POSTGRES_USER: std::env::var("POSTGRES_USER").expect("Failed to get POSTGRES_USER env"), + POSTGRES_PASSWORD: std::env::var("POSTGRES_PASSWORD") + .expect("Failed to get POSTGRES_PASSWORD env"), + POSTGRES_DB: std::env::var("POSTGRES_DB").expect("Failed to get POSTGRES_DB env"), + PG_DATA: std::env::var("PG_DATA").expect("Failed to get PG_DATA env"), + GRAFANA_DB_USERNAME: std::env::var("GRAFANA_DB_USERNAME") + .expect("Failed to get GRAFANA_DB_USERNAME env"), + GRAFANA_DB_PASSWORD: std::env::var("GRAFANA_DB_PASSWORD") + .expect("Failed to get GRAFANA_DB_PASSWORD env"), + TIMESCALEDB_IMAGE: std::env::var("TIMESCALEDB_IMAGE") + .expect("Failed to get TIMESCALEDB_IMAGE env"), + OFELIA_IMAGE: std::env::var("OFELIA_IMAGE").expect("Failed to get OFELIA_IMAGE env"), + TIMESCALEDB_DATA: std::env::var("TIMESCALEDB_DATA") + .expect("Failed to get TIMESCALEDB_DATA env"), + TIMESCALEDB_BACKUPS: std::env::var("TIMESCALEDB_BACKUPS") + .expect("Failed to get TIMESCALEDB_BACKUPS env"), + TIMESCALEDB_LOGS: std::env::var("TIMESCALEDB_LOGS") + .expect("Failed to get TIMESCALEDB_LOGS env"), + TIMESCALEDB_PGBACKREST_CONFIG: std::env::var("TIMESCALEDB_PGBACKREST_CONFIG") + .expect("Failed to get TIMESCALEDB_PGBACKREST_CONFIG env"), + OFELIA_LOGS: std::env::var("OFELIA_LOGS").expect("Failed to get OFELIA_LOGS env"), + MANUAL_BACKUPS: std::env::var("MANUAL_BACKUPS") + .expect("Failed to get MANUAL_BACKUPS env"), + CUSTOM_ENTRYPOINT: std::env::var("CUSTOM_ENTRYPOINT") + .expect("Failed to get CUSTOM_ENTRYPOINT env"), + OFELIA_SMTP_HOST: std::env::var("OFELIA_SMTP_HOST") + .expect("Failed to get OFELIA_SMTP_HOST env"), + OFELIA_SMTP_PORT: std::env::var("OFELIA_SMTP_PORT") + .expect("Failed to get OFELIA_SMTP_PORT env"), + OFELIA_SMTP_USER: std::env::var("OFELIA_SMTP_USER") + .expect("Failed to get OFELIA_SMTP_USER env"), + OFELIA_SMTP_PASSWORD: std::env::var("OFELIA_SMTP_PASSWORD") + .expect("Failed to get OFELIA_SMTP_PASSWORD env"), + OFELIA_EMAIL_FROM: std::env::var("OFELIA_EMAIL_FROM") + .expect("Failed to get OFELIA_EMAIL_FROM env"), + OFELIA_EMAIL_TO: std::env::var("OFELIA_EMAIL_TO") + .expect("Failed to get OFELIA_EMAIL_TO env"), + }; + return env; + }) +} +pub fn ONLY_DATABASE() -> bool { + get_env().ONLY_DATABASE +} + +pub fn DATABASE_ADDRESS() -> &'static str { + get_env().DATABASE_ADDRESS.as_str() +} + +pub fn DATABASE_PORT() -> &'static str { + get_env().DATABASE_PORT.as_str() +} + +pub fn POSTGRES_USER() -> &'static str { + get_env().POSTGRES_USER.as_str() +} + +pub fn POSTGRES_PASSWORD() -> &'static str { + get_env().POSTGRES_PASSWORD.as_str() +} + +pub fn POSTGRES_DB() -> &'static str { + get_env().POSTGRES_DB.as_str() +} + +pub fn PG_DATA() -> &'static str { + get_env().PG_DATA.as_str() +} + +pub fn TIMESCALEDB_IMAGE() -> &'static str { + get_env().TIMESCALEDB_IMAGE.as_str() +} + +pub fn OFELIA_IMAGE() -> &'static str { + get_env().OFELIA_IMAGE.as_str() +} + +pub fn TIMESCALEDB_DATA() -> &'static str { + get_env().TIMESCALEDB_DATA.as_str() +} + +pub fn TIMESCALEDB_BACKUPS() -> &'static str { + get_env().TIMESCALEDB_BACKUPS.as_str() +} + +pub fn TIMESCALEDB_LOGS() -> &'static str { + get_env().TIMESCALEDB_LOGS.as_str() +} + +pub fn TIMESCALEDB_PGBACKREST_CONFIG() -> &'static str { + get_env().TIMESCALEDB_PGBACKREST_CONFIG.as_str() +} + +pub fn OFELIA_LOGS() -> &'static str { + get_env().OFELIA_LOGS.as_str() +} + +pub fn MANUAL_BACKUPS() -> &'static str { + get_env().MANUAL_BACKUPS.as_str() +} + +pub fn CUSTOM_ENTRYPOINT() -> &'static str { + get_env().CUSTOM_ENTRYPOINT.as_str() +} + +pub fn OFELIA_SMTP_HOST() -> &'static str { + get_env().OFELIA_SMTP_HOST.as_str() +} + +pub fn OFELIA_SMTP_PORT() -> &'static str { + get_env().OFELIA_SMTP_PORT.as_str() +} + +pub fn OFELIA_SMTP_USER() -> &'static str { + get_env().OFELIA_SMTP_USER.as_str() +} + +pub fn OFELIA_SMTP_PASSWORD() -> &'static str { + get_env().OFELIA_SMTP_PASSWORD.as_str() +} + +pub fn OFELIA_EMAIL_FROM() -> &'static str { + get_env().OFELIA_EMAIL_FROM.as_str() +} + +pub fn OFELIA_EMAIL_TO() -> &'static str { + get_env().OFELIA_EMAIL_TO.as_str() +} + +pub fn GRAFANA_DB_USERNAME() -> &'static str { + get_env().GRAFANA_DB_USERNAME.as_str() +} + +pub fn GRAFANA_DB_PASSWORD() -> &'static str { + get_env().GRAFANA_DB_PASSWORD.as_str() +} diff --git a/server/src/lib.rs b/server/src/lib.rs index b3609b44..381ac02f 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1,15 +1,19 @@ pub mod auth; +pub mod cloud_state; pub mod env; pub mod errors; pub mod handle_error; pub mod http; +pub mod infra_env; pub mod ip_geolocation; +pub mod mailer; pub mod middlewares; pub mod routes; mod sesssion_cleaner; pub mod state; pub mod statics; pub mod structs; +pub mod test_env; pub mod test_utils; pub mod utils; pub mod ws; diff --git a/server/src/mailer/entry.rs b/server/src/mailer/entry.rs new file mode 100644 index 00000000..3640d2ae --- /dev/null +++ b/server/src/mailer/entry.rs @@ -0,0 +1,9 @@ +use super::mailer::Mailer; +use crate::env::{MAILER_ADDRESS, MAILER_PASSWORD}; +use anyhow::Result; + +pub async fn run_mailer() -> Result { + let mailer = Mailer::init(MAILER_ADDRESS().to_string(), MAILER_PASSWORD().to_string()).await; + + Ok(mailer) +} diff --git a/server/src/mailer/mail_requests.rs b/server/src/mailer/mail_requests.rs new file mode 100644 index 00000000..178b9f03 --- /dev/null +++ b/server/src/mailer/mail_requests.rs @@ -0,0 +1,62 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum SendEmailRequest { + EmailConfirmation(EmailConfirmationRequest), + ResetPassword(ResetPasswordRequest), + TeamInvite(TeamInviteNotification), + TeamRemoval(TeamRemovalNotification), + LeaveTeam(TeamLeavingNotification), + DeleteAccount(DeleteAccountNotification), +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct SendEmailResponse { + pub error_message: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct EmailConfirmationRequest { + pub email: String, + pub code: String, + pub device: String, + pub browser: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct ResetPasswordRequest { + pub email: String, + pub code: String, + pub device: String, + pub browser: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct TeamInviteNotification { + pub email: String, + pub team_name: String, + pub inviter_email: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct TeamRemovalNotification { + pub email: String, + pub team_name: String, + pub remover_email: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct TeamLeavingNotification { + pub email: String, + pub team_name: String, + pub device: String, + pub browser: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct DeleteAccountNotification { + pub email: String, + pub code: String, + pub device: String, + pub browser: String, +} diff --git a/server/src/mailer/mailer.rs b/server/src/mailer/mailer.rs new file mode 100644 index 00000000..0f532776 --- /dev/null +++ b/server/src/mailer/mailer.rs @@ -0,0 +1,39 @@ +use super::templates::templates::{get_templates, Templates}; +use lettre::{ + message::Mailbox, transport::smtp::authentication::Credentials, Address, SmtpTransport, +}; +use std::{collections::HashMap, sync::Arc}; +use strum::IntoEnumIterator; + +pub struct Mailer { + pub transport: Arc, + pub templates: Arc>, + pub mailbox: Mailbox, +} + +impl Mailer { + pub async fn init(username: String, password: String) -> Self { + let creds = Credentials::new(username.clone(), password); + let mailer = SmtpTransport::relay("mail.privateemail.com") + .expect("Could not create mailer") + .credentials(creds) + .build(); + + // load templates + let templates = get_templates(); + + // just in case make sure all templates are loaded + Templates::iter().for_each(|template| { + assert!(templates.contains_key(&template)); + }); + + let address = username.parse::
().expect("Invalid address"); + let mailbox = Mailbox::new(Some("Nightly".to_string()), address); + + Self { + transport: Arc::new(mailer), + templates: Arc::new(templates), + mailbox, + } + } +} diff --git a/server/src/mailer/mod.rs b/server/src/mailer/mod.rs new file mode 100644 index 00000000..334d53a0 --- /dev/null +++ b/server/src/mailer/mod.rs @@ -0,0 +1,5 @@ +pub mod entry; +pub mod mail_requests; +pub mod mailer; +pub mod request_handler; +pub mod templates; diff --git a/server/src/mailer/request_handler/handle_requests.rs b/server/src/mailer/request_handler/handle_requests.rs new file mode 100644 index 00000000..30af4b66 --- /dev/null +++ b/server/src/mailer/request_handler/handle_requests.rs @@ -0,0 +1,134 @@ +use chrono::Datelike; +use database::tables::utils::get_current_datetime; +use log::error; + +use super::processors::{ + account_removal_notification::send_account_removal_notification, email_confirmation::send_email_confirmation, reset_password::send_password_reset, team_invite_notification::send_team_invite_notification, team_leaving_notification::send_team_leaving_notification, team_removal_notification::send_team_removal_notification +}; +use crate::{ + env::MAILER_ACTIVE, + mailer::{mail_requests::SendEmailRequest, mailer::Mailer}, +}; + +fn get_date() -> (String, String) { + let now = get_current_datetime(); + let day = now.day(); + let month = now.format("%B").to_string(); + let year = now.year(); + let time = now.format("%H:%M:%S").to_string(); + let day_suffix = match day { + 1 | 21 | 31 => "st", + 2 | 22 => "nd", + 3 | 23 => "rd", + _ => "th", + }; + let date_string = format!("{}{} {} {}", day, day_suffix, month, year); + + let time_string = time; + return (date_string, time_string); +} + +impl Mailer { + pub fn handle_email_request(&self, request: &SendEmailRequest) { + // Check if mailer is active, safe usage of flag, validation performed during state initialization + if !MAILER_ACTIVE() { + // Simulate success + return; + } + + let templates = self.templates.clone(); + let mail_sender = self.transport.clone(); + let mailbox = self.mailbox.clone(); + let request = request.clone(); + + tokio::spawn(async move { + match request { + SendEmailRequest::EmailConfirmation(request) => { + let date = get_date(); + if let Some(err) = send_email_confirmation( + &templates, + mailbox.clone(), + &mail_sender, + &request, + date.0, + date.1, + ) + .error_message + { + error!("Failed to send email: {:?}, request: {:?}", err, request); + } + } + SendEmailRequest::ResetPassword(request) => { + let date = get_date(); + if let Some(err) = send_password_reset( + &templates, + mailbox.clone(), + &mail_sender, + &request, + date.0, + date.1, + ) + .error_message + { + error!("Failed to send email: {:?}, request: {:?}", err, request); + } + } + SendEmailRequest::TeamInvite(request) => { + if let Some(err) = send_team_invite_notification( + &templates, + mailbox.clone(), + &mail_sender, + &request, + ) + .error_message + { + error!("Failed to send email: {:?}, request: {:?}", err, request); + } + } + SendEmailRequest::TeamRemoval(request) => { + if let Some(err) = send_team_removal_notification( + &templates, + mailbox.clone(), + &mail_sender, + &request, + ) + .error_message + { + error!("Failed to send email: {:?}, request: {:?}", err, request); + } + } + SendEmailRequest::LeaveTeam(request) => { + let date = get_date(); + if let Some(err) = send_team_leaving_notification( + &templates, + mailbox.clone(), + &mail_sender, + &request, + date.0, + date.1, + ) + .error_message + { + error!("Failed to send email: {:?}, request: {:?}", err, request); + } + } + SendEmailRequest::DeleteAccount(request) => { + let date = get_date(); + if let Some(err) = send_account_removal_notification( + &templates, + mailbox.clone(), + &mail_sender, + &request, + date.0, + date.1, + ) + .error_message + { + error!("Failed to send email: {:?}, request: {:?}", err, request); + } + } + } + }); + return; + } +} diff --git a/server/src/mailer/request_handler/mod.rs b/server/src/mailer/request_handler/mod.rs new file mode 100644 index 00000000..a6e9c055 --- /dev/null +++ b/server/src/mailer/request_handler/mod.rs @@ -0,0 +1,3 @@ +pub mod handle_requests; +pub mod processors; +pub mod utils; diff --git a/server/src/mailer/request_handler/processors/account_removal_notification.rs b/server/src/mailer/request_handler/processors/account_removal_notification.rs new file mode 100644 index 00000000..2a333e88 --- /dev/null +++ b/server/src/mailer/request_handler/processors/account_removal_notification.rs @@ -0,0 +1,64 @@ +use crate::mailer::{ + mail_requests::{DeleteAccountNotification, SendEmailResponse}, + request_handler::utils::create_message, + templates::templates::Templates, +}; +use lettre::{message::Mailbox, SmtpTransport, Transport}; +use log::{error, warn}; +use std::{collections::HashMap, sync::Arc}; + +pub fn send_account_removal_notification( + templates: &Arc>, + mailbox: Mailbox, + mail_sender: &Arc, + request: &DeleteAccountNotification, + date: String, + time: String, +) -> SendEmailResponse { + let html = match templates.get(&Templates::AccountRemovalNotification) { + Some(template) => template + .replace("EMAIL_CONFIRMATION_CODE", &request.code) + .replace("EMAIL_ACTION_DEVICE", &request.device) + .replace("EMAIL_ACTION_BROWSER", &request.browser) + .replace("EMAIL_ACTION_DATE", &date) + .replace("EMAIL_ACTION_TIME", &time), + None => { + // Only possible if someone messes with the templates, print error and go along + error!( + "MAILER: Could not find account removal notification template under: {:?}", + Templates::AccountRemovalNotification + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + }; + match create_message( + html, + mailbox, + &request.email, + "Nightly Connect Cloud - Remove your account".to_string(), + ) { + Ok(message) => { + if let Err(e) = mail_sender.send(&message) { + warn!("MAILER: Failed to send account removal notification: {:?}", e); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } else { + return SendEmailResponse { + error_message: None, + }; + } + } + Err(err) => { + warn!( + "MAILER: Failed to create account removal notification: {:?}", + err + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + } +} diff --git a/server/src/mailer/request_handler/processors/email_confirmation.rs b/server/src/mailer/request_handler/processors/email_confirmation.rs new file mode 100644 index 00000000..94c7aeb3 --- /dev/null +++ b/server/src/mailer/request_handler/processors/email_confirmation.rs @@ -0,0 +1,62 @@ +use crate::mailer::{ + mail_requests::{EmailConfirmationRequest, SendEmailResponse}, + request_handler::utils::create_message, + templates::templates::Templates, +}; +use lettre::{message::Mailbox, SmtpTransport, Transport}; +use log::{error, warn}; +use std::sync::Arc; + +pub fn send_email_confirmation( + templates: &Arc>, + mailbox: Mailbox, + mail_sender: &Arc, + request: &EmailConfirmationRequest, + date: String, + time: String, +) -> SendEmailResponse { + let html = match templates.get(&Templates::EmailConfirmation) { + Some(template) => template + .replace("EMAIL_CONFIRMATION_CODE", &request.code) + .replace("EMAIL_ACTION_DEVICE", &request.device) + .replace("EMAIL_ACTION_BROWSER", &request.browser) + .replace("EMAIL_ACTION_DATE", &date) + .replace("EMAIL_ACTION_TIME", &time), + None => { + // Only possible if someone messes with the templates, print error and go along + error!( + "MAILER: Could not find email confirmation template under: {:?}", + Templates::EmailConfirmation + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + }; + + match create_message( + html, + mailbox, + &request.email, + "Nightly Connect Cloud - Confirm your email address".to_string(), + ) { + Ok(message) => { + if let Err(e) = mail_sender.send(&message) { + warn!("MAILER: Failed to send email confirmation: {:?}", e); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } else { + return SendEmailResponse { + error_message: None, + }; + } + } + Err(err) => { + warn!("MAILER: Failed to create email: {:?}", err); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + } +} diff --git a/server/src/mailer/request_handler/processors/mod.rs b/server/src/mailer/request_handler/processors/mod.rs new file mode 100644 index 00000000..b914bf3c --- /dev/null +++ b/server/src/mailer/request_handler/processors/mod.rs @@ -0,0 +1,6 @@ +pub mod email_confirmation; +pub mod reset_password; +pub mod team_invite_notification; +pub mod team_leaving_notification; +pub mod team_removal_notification; +pub mod account_removal_notification; \ No newline at end of file diff --git a/server/src/mailer/request_handler/processors/reset_password.rs b/server/src/mailer/request_handler/processors/reset_password.rs new file mode 100644 index 00000000..b40f0cbb --- /dev/null +++ b/server/src/mailer/request_handler/processors/reset_password.rs @@ -0,0 +1,62 @@ +use crate::mailer::{ + mail_requests::{ResetPasswordRequest, SendEmailResponse}, + request_handler::utils::create_message, + templates::templates::Templates, +}; +use lettre::{message::Mailbox, SmtpTransport, Transport}; +use log::{error, warn}; +use std::sync::Arc; + +pub fn send_password_reset( + templates: &Arc>, + mailbox: Mailbox, + mail_sender: &Arc, + request: &ResetPasswordRequest, + date: String, + time: String, +) -> SendEmailResponse { + let html = match templates.get(&Templates::ResetPassword) { + Some(template) => template + .replace("EMAIL_PASSWORD_RESET_CODE", &request.code) + .replace("EMAIL_ACTION_DEVICE", &request.device) + .replace("EMAIL_ACTION_BROWSER", &request.browser) + .replace("EMAIL_ACTION_DATE", &date) + .replace("EMAIL_ACTION_TIME", &time), + None => { + // Only possible if someone messes with the templates, print error and go along + error!( + "MAILER: Could not find email confirmation template under: {:?}", + Templates::ResetPassword + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + }; + + match create_message( + html, + mailbox, + &request.email, + "Nightly Connect Cloud - Change password request".to_string(), + ) { + Ok(message) => { + if let Err(e) = mail_sender.send(&message) { + warn!("MAILER: Failed to send password reset email: {:?}", e); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } else { + return SendEmailResponse { + error_message: None, + }; + } + } + Err(err) => { + warn!("MAILER: Failed to create email: {:?}", err); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + } +} diff --git a/server/src/mailer/request_handler/processors/team_invite_notification.rs b/server/src/mailer/request_handler/processors/team_invite_notification.rs new file mode 100644 index 00000000..6ed16e85 --- /dev/null +++ b/server/src/mailer/request_handler/processors/team_invite_notification.rs @@ -0,0 +1,63 @@ +use crate::mailer::{ + mail_requests::{SendEmailResponse, TeamInviteNotification}, + request_handler::utils::create_message, + templates::templates::Templates, +}; +use lettre::{message::Mailbox, SmtpTransport, Transport}; +use log::{error, warn}; +use std::{collections::HashMap, sync::Arc}; + +pub fn send_team_invite_notification( + templates: &Arc>, + mailbox: Mailbox, + mail_sender: &Arc, + request: &TeamInviteNotification, +) -> SendEmailResponse { + let html = match templates.get(&Templates::TeamInviteNotification) { + // TODO For now simply pass team_name, fix when template is ready, this will require two fields to update + // 1. message created from request in format "{inviter_email} invited you to join {team_name} on Nightly Connect Cloud" + // 2. link which will navigate user to his invites page + Some(template) => template + .replace("EMAIL_TEAM_LINK", "https://cloud.nightly.app/settings") + .replace("EMAIL_TEAM_NAME", &request.team_name), + None => { + // Only possible if someone messes with the templates, print error and go along + error!( + "MAILER: Could not find team invite notification template under: {:?}", + Templates::TeamInviteNotification + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + }; + + match create_message( + html, + mailbox, + &request.email, + "Nightly Connect Cloud - New team invite".to_string(), + ) { + Ok(message) => { + if let Err(e) = mail_sender.send(&message) { + warn!("MAILER: Failed to send team invite notification: {:?}", e); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } else { + return SendEmailResponse { + error_message: None, + }; + } + } + Err(err) => { + warn!( + "MAILER: Failed to create team invite notification: {:?}", + err + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + } +} diff --git a/server/src/mailer/request_handler/processors/team_leaving_notification.rs b/server/src/mailer/request_handler/processors/team_leaving_notification.rs new file mode 100644 index 00000000..2b1d54ae --- /dev/null +++ b/server/src/mailer/request_handler/processors/team_leaving_notification.rs @@ -0,0 +1,65 @@ +use crate::mailer::{ + mail_requests::{SendEmailResponse, TeamLeavingNotification}, + request_handler::utils::create_message, + templates::templates::Templates, +}; +use lettre::{message::Mailbox, SmtpTransport, Transport}; +use log::{error, warn}; +use std::{collections::HashMap, sync::Arc}; + +pub fn send_team_leaving_notification( + templates: &Arc>, + mailbox: Mailbox, + mail_sender: &Arc, + request: &TeamLeavingNotification, + date: String, + time: String, +) -> SendEmailResponse { + let html = match templates.get(&Templates::TeamLeavingNotification) { + Some(template) => template + .replace("EMAIL_TEAM_NAME", &request.team_name) + .replace("EMAIL_ACTION_DEVICE", &request.device) + .replace("EMAIL_ACTION_BROWSER", &request.browser) + .replace("EMAIL_ACTION_DATE", &date) + .replace("EMAIL_ACTION_TIME", &time), + None => { + // Only possible if someone messes with the templates, print error and go along + error!( + "MAILER: Could not find team leaving notification template under: {:?}", + Templates::TeamLeavingNotification + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + }; + + match create_message( + html, + mailbox, + &request.email, + "Nightly Connect Cloud - Left the team".to_string(), + ) { + Ok(message) => { + if let Err(e) = mail_sender.send(&message) { + warn!("MAILER: Failed to send team leaving notification: {:?}", e); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } else { + return SendEmailResponse { + error_message: None, + }; + } + } + Err(err) => { + warn!( + "MAILER: Failed to create team leaving notification: {:?}", + err + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + } +} diff --git a/server/src/mailer/request_handler/processors/team_removal_notification.rs b/server/src/mailer/request_handler/processors/team_removal_notification.rs new file mode 100644 index 00000000..f3703bea --- /dev/null +++ b/server/src/mailer/request_handler/processors/team_removal_notification.rs @@ -0,0 +1,60 @@ +use crate::mailer::{ + mail_requests::{SendEmailResponse, TeamRemovalNotification}, + request_handler::utils::create_message, + templates::templates::Templates, +}; +use lettre::{message::Mailbox, SmtpTransport, Transport}; +use log::{error, warn}; +use std::{collections::HashMap, sync::Arc}; + +pub fn send_team_removal_notification( + templates: &Arc>, + mailbox: Mailbox, + mail_sender: &Arc, + request: &TeamRemovalNotification, +) -> SendEmailResponse { + let html = match templates.get(&Templates::TeamRemovalNotification) { + Some(template) => template + .replace("EMAIL_TEAM_NAME", &request.team_name) + .replace("EMAIL_ADMIN_ADDRESS", &request.remover_email), + None => { + // Only possible if someone messes with the templates, print error and go along + error!( + "MAILER: Could not find team invite notification template under: {:?}", + Templates::TeamInviteNotification + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + }; + + match create_message( + html, + mailbox, + &request.email, + "Nightly Connect Cloud - Removed from team".to_string(), + ) { + Ok(message) => { + if let Err(e) = mail_sender.send(&message) { + warn!("MAILER: Failed to send team removal notification: {:?}", e); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } else { + return SendEmailResponse { + error_message: None, + }; + } + } + Err(err) => { + warn!( + "MAILER: Failed to create team removal notification: {:?}", + err + ); + return SendEmailResponse { + error_message: Some("Internal Error".to_string()), + }; + } + } +} diff --git a/server/src/mailer/request_handler/utils.rs b/server/src/mailer/request_handler/utils.rs new file mode 100644 index 00000000..422b8ef5 --- /dev/null +++ b/server/src/mailer/request_handler/utils.rs @@ -0,0 +1,22 @@ +use anyhow::Result; +use lettre::{ + message::{header::ContentType, Mailbox}, + Message, +}; + +pub fn create_message( + body: String, + mailbox: Mailbox, + receiver: &String, + subject: String, +) -> Result { + Message::builder() + .from(mailbox) + .to(format!("Hello <{receiver}>") + .parse() + .map_err(|e| anyhow::anyhow!("Could not parse to: {:?}", e))?) + .subject(subject) + .header(ContentType::TEXT_HTML) + .body(body) + .map_err(|e| anyhow::anyhow!("Could not build email: {:?}", e)) +} diff --git a/server/src/mailer/templates/accountRemovalConfirmation.rs b/server/src/mailer/templates/accountRemovalConfirmation.rs new file mode 100644 index 00000000..165dd36b --- /dev/null +++ b/server/src/mailer/templates/accountRemovalConfirmation.rs @@ -0,0 +1,245 @@ +pub static DELETE_ACCOUNT_EMAIL_TEMPLATE: &str = r##" + + + + + Password reset + + + + + + + +
+ +

+ Bye bye bye! +

+

+ As far as we know, You decided to delete your account. To keep it + brief, grab the verification code: +

+

+ EMAIL_CONFIRMATION_CODE +

+

+ Don’t forget to enter it in the modal to finish deleting Your + account! +

+

+ Before you go, remember: + this action is irreversible and cannot be recovered! +

+
+
+ You do not recall this action? Catch the details below: +
+
+ EMAIL_ACTION_DEVICE, EMAIL_ACTION_BROWSER, EMAIL_ACTION_DATE, + EMAIL_ACTION_TIME. +
+
+

+ If it was not you, please contact our support team as soon as + possible! +

+ +

+ We wish to see you again, +
Nightly's Team +

+
+

+ Hit us up here +

+ +
+
+ + + + +
+ +
+ + + +"##; diff --git a/server/src/mailer/templates/emailConfirmation.rs b/server/src/mailer/templates/emailConfirmation.rs new file mode 100644 index 00000000..194501c0 --- /dev/null +++ b/server/src/mailer/templates/emailConfirmation.rs @@ -0,0 +1,209 @@ +pub static EMAIL_CONFIRMATION_TEMPLATE: &str = r##" + + + + + Verification code + + + + + + + +
+ +

+ Verification code +

+

+ Your verification code: +

+

+ EMAIL_CONFIRMATION_CODE +

+

+ This code will expire in 15 minutes. +

+

+ Action details: EMAIL_ACTION_DEVICE, EMAIL_ACTION_BROWSER, EMAIL_ACTION_DATE, EMAIL_ACTION_TIME. +

+

+ If it was not you, please contact our support team as soon as + possible! +

+ +

+ Best regards, +
Nightly's Team +

+
+

+ Hit us up here +

+ +
+
+ + + + +
+ +
+ + + +"##; diff --git a/server/src/mailer/templates/mod.rs b/server/src/mailer/templates/mod.rs new file mode 100644 index 00000000..d7f716c1 --- /dev/null +++ b/server/src/mailer/templates/mod.rs @@ -0,0 +1,8 @@ +#![allow(non_snake_case)] +pub mod accountRemovalConfirmation; +pub mod emailConfirmation; +pub mod resetPassword; +pub mod teamInviteNotification; +pub mod teamLeavingNotification; +pub mod teamRemovalNotification; +pub mod templates; diff --git a/server/src/mailer/templates/resetPassword.rs b/server/src/mailer/templates/resetPassword.rs new file mode 100644 index 00000000..2e3e0b1f --- /dev/null +++ b/server/src/mailer/templates/resetPassword.rs @@ -0,0 +1,208 @@ +pub static RESET_PASSWORD_TEMPLATE: &str = r##" + + + + + Password reset + + + + + + + +
+ +

+ Password reset +

+

+ Your password reset code: +

+

+ EMAIL_PASSWORD_RESET_CODE +

+

+ This code will expire in 15 minutes. +

+

+ Action details: EMAIL_ACTION_DEVICE, EMAIL_ACTION_BROWSER, EMAIL_ACTION_DATE, EMAIL_ACTION_TIME. +

+

+ If it was not you, please contact our support team as soon as + possible! +

+ +

+ Best regards, +
Nightly's Team +

+
+

+ Hit us up here +

+ +
+
+ + + + +
+ +
+ + + +"##; diff --git a/server/src/mailer/templates/teamInviteNotification.rs b/server/src/mailer/templates/teamInviteNotification.rs new file mode 100644 index 00000000..1e60fc13 --- /dev/null +++ b/server/src/mailer/templates/teamInviteNotification.rs @@ -0,0 +1,190 @@ +pub static TEAM_INVITE_NOTIFICATION_TEMPLATE: &str = r##" + + + + + Team invite + + + + + + + +
+ +

+ Welcome to the team! +

+

+ You just got invited to the special group of people EMAIL_TEAM_NAME! + Are You willing to accept this invitation? We hope so, click link + below to log and say yes! +

+ + EMAIL_TEAM_LINK + +

+ The invitation has no expiry date, but do not make your crew wait + too long for You to join them! +

+

+ We wish you great time creating together, +
Nightly's Team +

+
+

+ Hit us up here +

+ +
+
+ + + + +
+ +
+ + +"##; diff --git a/server/src/mailer/templates/teamLeavingNotification.rs b/server/src/mailer/templates/teamLeavingNotification.rs new file mode 100644 index 00000000..87e1452e --- /dev/null +++ b/server/src/mailer/templates/teamLeavingNotification.rs @@ -0,0 +1,187 @@ +pub static TEAM_LEAVING_NOTIFICATION_TEMPLATE: &str = r##" + + + + + Team leave + + + + + + + +
+ +

+ See you again! +

+

+ You decided to leave the team EMAIL_TEAM_NAME! +
+ You do not recall this action? Catch the details below: +

+ +

+ Action details: EMAIL_ACTION_DEVICE, EMAIL_ACTION_BROWSER, EMAIL_ACTION_DATE, EMAIL_ACTION_TIME. +

+ +

+ If it was not you, please contact our support team as soon as + possible! +

+

+ We wish to see you again, +
Nightly's Team +

+
+

+ Hit us up here +

+ +
+
+ + + + +
+ +
+ + + +"##; diff --git a/server/src/mailer/templates/teamRemovalNotification.rs b/server/src/mailer/templates/teamRemovalNotification.rs new file mode 100644 index 00000000..0692467e --- /dev/null +++ b/server/src/mailer/templates/teamRemovalNotification.rs @@ -0,0 +1,163 @@ +pub static TEAM_REMOVAL_NOTIFICATION_TEMPLATE: &str = r##" + + + + + Team throw out + + + + + + + +
+ +

+ Say bye to the team! +

+

+ You got kicked out from the team EMAIL_TEAM_NAME! If you are not sure of + this action, we kindly ask you to talk it out with Team’s Admin + EMAIL_ADMIN_ADDRESS. +

+ +

+ We wish to see you again, +
Nightly's Team +

+ +
+

+ Hit us up here +

+ +
+
+ + + + +
+ +
+ + + +"##; diff --git a/server/src/mailer/templates/templates.rs b/server/src/mailer/templates/templates.rs new file mode 100644 index 00000000..ede8c3db --- /dev/null +++ b/server/src/mailer/templates/templates.rs @@ -0,0 +1,50 @@ +use super::{ + accountRemovalConfirmation::DELETE_ACCOUNT_EMAIL_TEMPLATE, + emailConfirmation::EMAIL_CONFIRMATION_TEMPLATE, resetPassword::RESET_PASSWORD_TEMPLATE, + teamInviteNotification::TEAM_INVITE_NOTIFICATION_TEMPLATE, + teamLeavingNotification::TEAM_LEAVING_NOTIFICATION_TEMPLATE, + teamRemovalNotification::TEAM_REMOVAL_NOTIFICATION_TEMPLATE, +}; +use std::collections::HashMap; +use strum::EnumIter; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, EnumIter)] +pub enum Templates { + EmailConfirmation, + ResetPassword, + TeamInviteNotification, + TeamRemovalNotification, + TeamLeavingNotification, + AccountRemovalNotification, +} + +pub fn get_templates() -> HashMap { + let mut templates = HashMap::new(); + + templates.insert( + Templates::EmailConfirmation, + EMAIL_CONFIRMATION_TEMPLATE.to_string(), + ); + templates.insert( + Templates::ResetPassword, + RESET_PASSWORD_TEMPLATE.to_string(), + ); + templates.insert( + Templates::TeamInviteNotification, + TEAM_INVITE_NOTIFICATION_TEMPLATE.to_string(), + ); + templates.insert( + Templates::TeamRemovalNotification, + TEAM_REMOVAL_NOTIFICATION_TEMPLATE.to_string(), + ); + templates.insert( + Templates::TeamLeavingNotification, + TEAM_LEAVING_NOTIFICATION_TEMPLATE.to_string(), + ); + templates.insert( + Templates::AccountRemovalNotification, + DELETE_ACCOUNT_EMAIL_TEMPLATE.to_string(), + ); + + templates +} diff --git a/server/src/middlewares/auth_middleware.rs b/server/src/middlewares/auth_middleware.rs index 78ce412e..855871c3 100644 --- a/server/src/middlewares/auth_middleware.rs +++ b/server/src/middlewares/auth_middleware.rs @@ -1,5 +1,5 @@ use crate::auth::{auth_token_type::AuthTokenType, AuthToken}; -use crate::env::JWT_PUBLIC_KEY; +use crate::env::{JWT_PUBLIC_KEY, NONCE}; use axum::{ extract::{ConnectInfo, Request}, http::{HeaderMap, StatusCode}, @@ -39,6 +39,12 @@ pub async fn access_auth_middleware( } None => return Err((StatusCode::UNAUTHORIZED, "No auth token".to_string())), }; + + // Check if nonce is the same + if auth_token.nonce != NONCE() { + return Err((StatusCode::UNAUTHORIZED, "Expired token".to_string())); + } + // Insert the user_id into the request extensions req.extensions_mut() .insert(auth_token.user_id.clone() as UserId); diff --git a/server/src/middlewares/cloud_middleware.rs b/server/src/middlewares/cloud_middleware.rs index 60a75626..3da2b50d 100644 --- a/server/src/middlewares/cloud_middleware.rs +++ b/server/src/middlewares/cloud_middleware.rs @@ -1,25 +1,19 @@ use crate::state::ServerState; -use axum::{ - extract::{Request, State}, - http::StatusCode, - middleware::Next, - response::IntoResponse, -}; +use axum::extract::State; +use axum::{extract::Request, http::StatusCode, middleware::Next, response::IntoResponse}; -pub async fn db_cloud_middleware( - State(state): State, +pub async fn cloud_middleware( + State(server_state): State, req: Request, next: Next, ) -> Result { - // Check if the database is connected - if state.db.is_some() { - // If the database is connected, pass the request to the next middleware or handler - Ok(next.run(req).await) - } else { - // If the database is not connected, return an error response - Err(( + if let None = server_state.cloud_state { + return Err(( StatusCode::FORBIDDEN, "Cloud endpoints are disabled".to_string(), - )) + )); } + + let response = next.run(req).await; + Ok(response) } diff --git a/server/src/middlewares/origin_middleware.rs b/server/src/middlewares/origin_middleware.rs index 7f7cf2de..2e460ca1 100644 --- a/server/src/middlewares/origin_middleware.rs +++ b/server/src/middlewares/origin_middleware.rs @@ -3,9 +3,10 @@ use axum::{ extract::FromRequestParts, http::{header::ORIGIN, request::Parts, StatusCode}, }; +use log::warn; #[derive(Debug, Clone)] -pub struct Origin(pub String); +pub struct Origin(pub Option); #[async_trait] impl FromRequestParts for Origin @@ -15,19 +16,27 @@ where type Rejection = (StatusCode, String); async fn from_request_parts(req: &mut Parts, _state: &B) -> Result { - let origin = req - .headers - .get(ORIGIN) - .and_then(|value| value.to_str().ok()) - .map(|s| s.to_owned()) - .ok_or_else(|| { - ( - StatusCode::BAD_REQUEST, - "Origin header is required".to_string(), - ) - })?; + match req.headers.get(ORIGIN) { + Some(value) => + // If anything goes wrong, return empty origin + { + match value.to_str() { + Ok(origin) => { + if origin.is_empty() { + warn!("Empty Origin header"); + return Ok(Origin(None)); + } - Ok(Origin(origin)) + Ok(Origin(Some(origin.to_owned()))) + } + Err(e) => { + warn!("Failed to parse Origin header {:?}", e); + Ok(Origin(None)) + } + } + } + None => Ok(Origin(None)), + } } } @@ -43,7 +52,9 @@ mod tests { }; use tower::ServiceExt; - async fn origin_as_body(Origin(origin): Origin) -> Result, (StatusCode, String)> { + async fn origin_as_body( + Origin(origin): Origin, + ) -> Result>, (StatusCode, String)> { Ok(Json(origin)) } @@ -62,21 +73,24 @@ mod tests { .unwrap(); let response = app.oneshot(request).await.unwrap(); - let resp = convert_response::(response).await.unwrap(); + let resp = convert_response::>(response).await.unwrap(); - assert_eq!(resp, "https://www.example.com"); + assert_eq!(resp, Some("https://www.example.com".to_string())); } #[tokio::test] - async fn missing_origin_header() { + async fn origin_header_empty() { let app = app(); - let request = Request::builder().uri("/").body(Body::empty()).unwrap(); + let request = Request::builder() + .uri("/") + .header("Origin", "") + .body(Body::empty()) + .unwrap(); let response = app.oneshot(request).await.unwrap(); - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + let resp = convert_response::>(response).await.unwrap(); - let err = convert_response::(response).await.unwrap_err(); - assert_eq!(err.to_string(), "Origin header is required"); + assert_eq!(resp, None); } } diff --git a/server/src/routes/cloud_router.rs b/server/src/routes/cloud_router.rs index 67eb02e4..24da0c3a 100644 --- a/server/src/routes/cloud_router.rs +++ b/server/src/routes/cloud_router.rs @@ -1,13 +1,53 @@ use crate::{ http::cloud::{ - accept_team_invite::accept_team_invite, cancel_team_user_invite::cancel_team_user_invite, - cancel_user_team_invite::cancel_user_team_invite, get_events::events, - get_team_user_invites::get_team_user_invites, get_user_joined_teams::get_user_joined_teams, - get_user_team_invites::get_user_team_invites, invite_user_to_team::invite_user_to_team, - login_with_google::login_with_google, login_with_password::login_with_password, - register_new_app::register_new_app, register_new_team::register_new_team, - register_with_password::register_with_password, + accept_team_invite::accept_team_invite, + add_passkey_finish::add_passkey_finish, + add_passkey_start::add_passkey_start, + cancel_team_user_invite::cancel_team_user_invite, + cancel_user_team_invite::cancel_user_team_invite, + change_user_privileges::change_user_privileges, + delete_account_finish::delete_account_finish, + delete_account_start::delete_account_start, + delete_app::delete_app, + delete_passkey::delete_passkey, + delete_team::delete_team, + domains::{ + cancel_pending_domain_request::cancel_pending_domain_request, + remove_whitelisted_domain::remove_whitelisted_domain, + verify_domain_finish::verify_domain_finish, verify_domain_start::verify_domain_start, + }, + events::events::events, + get_events::get_events, + get_passkey_challenge::get_passkey_challenge, + get_team_metadata::get_team_metadata, + get_team_user_invites::get_team_user_invites, + get_team_users_privileges::get_team_users_privileges, + get_user_joined_teams::get_user_joined_teams, + get_user_metadata::get_user_metadata, + get_user_team_invites::get_user_team_invites, + invite_user_to_team::invite_user_to_team, + leave_team::leave_team, + login::{ + login_with_google::login_with_google, + login_with_passkey_finish::login_with_passkey_finish, + login_with_passkey_start::login_with_passkey_start, + login_with_password::login_with_password, refresh_token::refresh_token, + }, + register::{ + register_with_passkey_finish::register_with_passkey_finish, + register_with_passkey_start::register_with_passkey_start, + register_with_password_finish::register_with_password_finish, + register_with_password_start::register_with_password_start, + }, + register_new_app::register_new_app, + register_new_team::register_new_team, remove_user_from_team::remove_user_from_team, + reset_credentials::{ + reset_passkey_finish::reset_passkey_finish, reset_passkey_start::reset_passkey_start, + reset_password_finish::reset_password_finish, + reset_password_start::reset_password_start, + }, + verify_code::verify_code, }, middlewares::auth_middleware::access_auth_middleware, state::ServerState, @@ -43,8 +83,52 @@ pub fn public_router(state: ServerState) -> Router { post(login_with_google), ) .route( - &HttpCloudEndpoint::RegisterWithPassword.to_string(), - post(register_with_password), + &HttpCloudEndpoint::LoginWithPasskeyStart.to_string(), + post(login_with_passkey_start), + ) + .route( + &HttpCloudEndpoint::LoginWithPasskeyFinish.to_string(), + post(login_with_passkey_finish), + ) + .route( + &HttpCloudEndpoint::RefreshToken.to_string(), + post(refresh_token), + ) + .route( + &HttpCloudEndpoint::RegisterWithPasswordStart.to_string(), + post(register_with_password_start), + ) + .route( + &HttpCloudEndpoint::RegisterWithPasswordFinish.to_string(), + post(register_with_password_finish), + ) + .route( + &HttpCloudEndpoint::ResetPasswordStart.to_string(), + post(reset_password_start), + ) + .route( + &HttpCloudEndpoint::ResetPasswordFinish.to_string(), + post(reset_password_finish), + ) + .route( + &HttpCloudEndpoint::RegisterWithPasskeyStart.to_string(), + post(register_with_passkey_start), + ) + .route( + &HttpCloudEndpoint::RegisterWithPasskeyFinish.to_string(), + post(register_with_passkey_finish), + ) + .route( + &HttpCloudEndpoint::ResetPasskeyStart.to_string(), + post(reset_passkey_start), + ) + .route( + &HttpCloudEndpoint::ResetPasskeyFinish.to_string(), + post(reset_passkey_finish), + ) + .route( + &HttpCloudEndpoint::VerifyCode.to_string(), + post(verify_code), ) .route(&HttpCloudEndpoint::Events.to_string(), post(events)) .with_state(state) @@ -92,5 +176,68 @@ pub fn private_router(state: ServerState) -> Router { &HttpCloudEndpoint::CancelUserTeamInvite.to_string(), post(cancel_user_team_invite), ) + .route(&HttpCloudEndpoint::GetEvents.to_string(), get(get_events)) + .route( + &HttpCloudEndpoint::VerifyDomainStart.to_string(), + post(verify_domain_start), + ) + .route( + &HttpCloudEndpoint::VerifyDomainFinish.to_string(), + post(verify_domain_finish), + ) + .route( + &HttpCloudEndpoint::RemoveWhitelistedDomain.to_string(), + post(remove_whitelisted_domain), + ) + .route( + &HttpCloudEndpoint::CancelPendingDomainVerification.to_string(), + post(cancel_pending_domain_request), + ) + .route( + &HttpCloudEndpoint::GetPasskeyChallenge.to_string(), + get(get_passkey_challenge), + ) + .route( + &HttpCloudEndpoint::DeletePasskey.to_string(), + post(delete_passkey), + ) + .route( + &HttpCloudEndpoint::AddPasskeyStart.to_string(), + post(add_passkey_start), + ) + .route( + &HttpCloudEndpoint::AddPasskeyFinish.to_string(), + post(add_passkey_finish), + ) + .route( + &HttpCloudEndpoint::GetUserMetadata.to_string(), + get(get_user_metadata), + ) + .route( + &HttpCloudEndpoint::GetTeamMetadata.to_string(), + get(get_team_metadata), + ) + .route( + &HttpCloudEndpoint::GetTeamUserPrivileges.to_string(), + get(get_team_users_privileges), + ) + .route( + &HttpCloudEndpoint::ChangeUserPrivileges.to_string(), + post(change_user_privileges), + ) + .route(&HttpCloudEndpoint::DeleteApp.to_string(), post(delete_app)) + .route(&HttpCloudEndpoint::LeaveTeam.to_string(), post(leave_team)) + .route( + &HttpCloudEndpoint::DeleteTeam.to_string(), + post(delete_team), + ) + .route( + &HttpCloudEndpoint::DeleteAccountStart.to_string(), + post(delete_account_start), + ) + .route( + &HttpCloudEndpoint::DeleteAccountFinish.to_string(), + post(delete_account_finish), + ) .with_state(state) } diff --git a/server/src/routes/router.rs b/server/src/routes/router.rs index fa2cc749..13b9ad51 100644 --- a/server/src/routes/router.rs +++ b/server/src/routes/router.rs @@ -1,5 +1,7 @@ use super::cloud_router::cloud_router; use crate::{ + cloud_state::CloudState, + env::{is_env_production, MAILER_ACTIVE}, handle_error::handle_error, http::relay::{ connect_session::connect_session, drop_sessions::drop_sessions, @@ -7,8 +9,7 @@ use crate::{ get_session_info::get_session_info, get_sessions::get_sessions, get_wallets_metadata::get_wallets_metadata, resolve_request::resolve_request, }, - ip_geolocation::GeolocationRequester, - middlewares::cloud_middleware::db_cloud_middleware, + middlewares::cloud_middleware::cloud_middleware, sesssion_cleaner::start_cleaning_sessions, state::ServerState, structs::http_endpoints::HttpEndpoint, @@ -24,19 +25,20 @@ use axum::{ routing::{get, post}, Router, }; -use database::db::Db; use std::{sync::Arc, time::Duration}; use tower::ServiceBuilder; use tower_http::trace::TraceLayer; pub async fn get_router(only_relay_service: bool) -> Router { - let (db, geo_loc_requester) = if only_relay_service { - (None, None) + let cloud_state = if only_relay_service { + None } else { - ( - Some(Arc::new(Db::connect_to_the_pool().await)), - Some(Arc::new(GeolocationRequester::new().await)), - ) + // Check mailer flag + if !MAILER_ACTIVE() && is_env_production() { + panic!("Mailer is not active in production"); + } + + Some(Arc::new(CloudState::new().await)) }; let state = ServerState { @@ -45,8 +47,7 @@ pub async fn get_router(only_relay_service: bool) -> Router { client_to_sockets: Default::default(), wallets_metadata: Arc::new(get_wallets_metadata_vec()), session_to_app_map: Default::default(), - db, - geo_location: geo_loc_requester, + cloud_state: cloud_state, }; // Start cleaning outdated sessions @@ -65,7 +66,7 @@ pub async fn get_router(only_relay_service: bool) -> Router { "/cloud", cloud_router(state.clone()).route_layer(middleware::from_fn_with_state( state.clone(), - db_cloud_middleware, + cloud_middleware, )), ) .with_state(state.clone()) diff --git a/server/src/sesssion_cleaner.rs b/server/src/sesssion_cleaner.rs index ce403b74..6465a32d 100644 --- a/server/src/sesssion_cleaner.rs +++ b/server/src/sesssion_cleaner.rs @@ -3,7 +3,7 @@ use crate::{ utils::get_timestamp_in_milliseconds, }; use futures::SinkExt; -use log::info; +use log::{error, info}; use std::{collections::HashMap, time::Duration, vec}; pub fn start_cleaning_sessions( @@ -78,12 +78,26 @@ pub fn start_cleaning_sessions( // Remove all sessions that expired for (app_id, session_id) in sessions_to_remove { - // safe unwrap because we just checked if the session exists - let app_sessions = sessions_write.get_mut(&app_id).unwrap(); + let app_sessions = match sessions_write.get_mut(&app_id) { + Some(app_sessions) => app_sessions, + None => { + error!("App: [{}] does not have any sessions", app_id); + return; + } + }; let mut app_sessions_write = app_sessions.write().await; for session_id in session_id { - let session = app_sessions_write.get_mut(&session_id).unwrap(); + let session = match app_sessions_write.get_mut(&session_id) { + Some(session) => session, + None => { + error!( + "App: [{}] does not have session with id: [{}]", + app_id, session_id + ); + return; + } + }; let mut session_write = session.write().await; // Remove session from client_to_sessions diff --git a/server/src/state.rs b/server/src/state.rs index 0456b2e1..349fff08 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -1,8 +1,10 @@ use crate::{ + cloud_state::{CloudState, DnsResolver}, ip_geolocation::GeolocationRequester, + mailer::mailer::Mailer, structs::{ client_messages::client_messages::ServerToClient, session::Session, - wallet_metadata::WalletMetadata, + session_cache::ApiSessionsCache, wallet_metadata::WalletMetadata, }, }; use anyhow::Result; @@ -13,12 +15,14 @@ use axum::extract::{ }; use database::db::Db; use futures::{stream::SplitSink, SinkExt}; -use log::info; +use log::{error, info}; +use openapi::apis::configuration::Configuration; use std::{ collections::{HashMap, HashSet}, sync::Arc, }; use tokio::sync::RwLock; +use webauthn_rs::Webauthn; pub type SessionId = String; pub type ClientId = String; @@ -34,8 +38,54 @@ pub struct ServerState { pub client_to_sessions: ClientToSessions, pub wallets_metadata: Arc>, pub session_to_app_map: SessionToAppMap, - pub db: Option>, - pub geo_location: Option>, + pub cloud_state: Option>, +} + +impl FromRef for Arc { + fn from_ref(state: &ServerState) -> Self { + // Safe as middleware will prevent this from being None + state.cloud_state.as_ref().unwrap().db.clone() + } +} +impl FromRef for Arc { + fn from_ref(state: &ServerState) -> Self { + // Safe as middleware will prevent this from being None + state.cloud_state.as_ref().unwrap().geo_location.clone() + } +} +impl FromRef for Arc { + fn from_ref(state: &ServerState) -> Self { + // Safe as middleware will prevent this from being None + state.cloud_state.as_ref().unwrap().sessions_cache.clone() + } +} +impl FromRef for Arc { + fn from_ref(state: &ServerState) -> Self { + // Safe as middleware will prevent this from being None + state.cloud_state.as_ref().unwrap().mailer.clone() + } +} +impl FromRef for Arc { + fn from_ref(state: &ServerState) -> Self { + state.cloud_state.as_ref().unwrap().dns_resolver.clone() + } +} +impl FromRef for Arc { + fn from_ref(state: &ServerState) -> Self { + // Safe as middleware will prevent this from being None + state.cloud_state.as_ref().unwrap().webauthn.clone() + } +} +impl FromRef for Arc { + fn from_ref(state: &ServerState) -> Self { + // Safe as middleware will prevent this from being None + state + .cloud_state + .as_ref() + .unwrap() + .grafana_client_conf + .clone() + } } #[async_trait] @@ -75,12 +125,18 @@ impl SendToClient for ClientSockets { match self.read().await.get(&client_id) { Some(client_socket) => { info!("Send to client {}, msg: {:?}", client_id, msg); + let serialized_msg = match serde_json::to_string(&msg) { + Ok(serialized_msg) => serialized_msg, + Err(err) => { + error!("Failed to serialize message: {:?}", err); + return Err(anyhow::anyhow!("Failed to serialize message: {:?}", err)); + } + }; + return Ok(client_socket .write() .await - .send(Message::Text( - serde_json::to_string(&msg).expect("Serialization should work"), - )) + .send(Message::Text(serialized_msg)) .await?); } None => Err(anyhow::anyhow!("No client socket found for session")), diff --git a/server/src/statics.rs b/server/src/statics.rs index 44717e26..8c2952dc 100644 --- a/server/src/statics.rs +++ b/server/src/statics.rs @@ -5,10 +5,18 @@ pub const TEAMS_AMOUNT_LIMIT_PER_USER: usize = 10; pub const REGISTERED_APPS_LIMIT_PER_TEAM: usize = 20; pub const USERS_AMOUNT_LIMIT_PER_TEAM: usize = 50; +pub const DASHBOARD_TEMPLATE_UID: &str = "TEMPLATE_UID"; +pub const TEMPLATES_FOLDER_UID: &str = "TEMPLATE_FOLDER_UID"; +pub const POSTGRES_DATASOURCE_UID: &str = "POSTGRES_DATASOURCE_UID"; + // Name must be 3-30 characters long and include only alphanumeric characters, underscores, or slashes. pub static NAME_REGEX: Lazy = Lazy::new(|| Regex::new(r"^[a-zA-Z0-9_-]{3,30}$").expect("Regex creation failed")); +// Code must be 6 digits long. +pub static CODE_REGEX: Lazy = + Lazy::new(|| Regex::new(r"^\d{6}$").expect("Regex creation failed")); + pub struct PasswordValidator { pub re: Regex, pub error: String, diff --git a/server/src/structs/app_messages/initialize.rs b/server/src/structs/app_messages/initialize.rs index bba92984..b7072b10 100644 --- a/server/src/structs/app_messages/initialize.rs +++ b/server/src/structs/app_messages/initialize.rs @@ -14,6 +14,8 @@ pub struct InitializeRequest { pub persistent: bool, #[ts(optional)] pub persistent_session_id: Option, + #[ts(optional)] + pub app_id: Option, } #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] @@ -26,4 +28,5 @@ pub struct InitializeResponse { pub public_keys: Vec, // if session was restored, this is the list of public keys that were restored #[ts(optional)] pub metadata: Option, // if session was restored, this is the metadata that was restored + pub app_id: String, } diff --git a/server/src/structs/client_messages/connect.rs b/server/src/structs/client_messages/connect.rs index a480e24b..e73e4703 100644 --- a/server/src/structs/client_messages/connect.rs +++ b/server/src/structs/client_messages/connect.rs @@ -1,4 +1,5 @@ -use crate::structs::common::{Device, Notification}; +use crate::structs::common::Notification; +use database::structs::device_metadata::Device; use serde::{Deserialize, Serialize}; use ts_rs::TS; diff --git a/server/src/structs/cloud/api_cloud_errors.rs b/server/src/structs/cloud/api_cloud_errors.rs index c298569d..5ae4dc1d 100644 --- a/server/src/structs/cloud/api_cloud_errors.rs +++ b/server/src/structs/cloud/api_cloud_errors.rs @@ -32,4 +32,28 @@ pub enum CloudApiErrors { ActionForbiddenForPersonalTeam, InviteDoesNotExist, InvalidPaginationCursor, + InvalidOrExpiredVerificationCode, + InvalidOrExpiredAuthCode, + InvalidDomainName, + DomainAlreadyVerified, + DomainVerificationFailure, + DomainNotFound, + DomainVerificationNotStarted, + DomainAlreadyVerifiedByAnotherApp, + NoPendingDomainVerification, + WebAuthnError, + PasswordNotSet, + UserDoesNotHavePasskey, + PasskeyAlreadyExists, + InvalidPasskeyCredential, + PasskeyDoesNotExist, + FailedToCreateTeam, + DashboardImportFail, + OriginHeaderRequired, + InvalidOrigin, + InvalidAction, + AdminCannotLeaveTeam, + GrafanaError, + TeamWithoutGrafanaId, + UserDoesNotExistInGrafana, } diff --git a/server/src/structs/cloud/app_info.rs b/server/src/structs/cloud/app_info.rs index e7af7fc6..43690f6b 100644 --- a/server/src/structs/cloud/app_info.rs +++ b/server/src/structs/cloud/app_info.rs @@ -1,7 +1,10 @@ use super::joined_team::TeamId; use crate::state::AppId; use chrono::{DateTime, Utc}; -use database::tables::registered_app::table_struct::DbRegisteredApp; +use database::{ + structs::whitelisted_domain::WhitelistedDomain, + tables::registered_app::table_struct::DbRegisteredApp, +}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -13,18 +16,20 @@ pub struct AppInfo { pub app_id: AppId, pub app_name: String, pub registered_at: DateTime, - pub whitelisted_domains: Vec, + pub whitelisted_domains: Vec, pub ack_public_keys: Vec, } impl From for AppInfo { fn from(app_info: DbRegisteredApp) -> Self { + let whitelisted_domains = app_info.get_whitelisted_domains(); + AppInfo { team_id: app_info.team_id, app_id: app_info.app_id, app_name: app_info.app_name, registered_at: app_info.registration_timestamp, - whitelisted_domains: app_info.whitelisted_domains, + whitelisted_domains: whitelisted_domains, ack_public_keys: app_info.ack_public_keys, } } diff --git a/server/src/structs/cloud/cloud_events/event_types/app_connect_event.rs b/server/src/structs/cloud/cloud_events/event_types/app_connect_event.rs index 160bb641..dc9193f8 100644 --- a/server/src/structs/cloud/cloud_events/event_types/app_connect_event.rs +++ b/server/src/structs/cloud/cloud_events/event_types/app_connect_event.rs @@ -1,4 +1,4 @@ -use crate::structs::cloud::device_metadata::DeviceMetadata; +use database::structs::device_metadata::DeviceMetadata; use serde::{Deserialize, Serialize}; use ts_rs::TS; diff --git a/server/src/structs/cloud/cloud_events/event_types/change_network_resolve_event.rs b/server/src/structs/cloud/cloud_events/event_types/change_network_resolve_event.rs index 1175ee72..a8c1d9b2 100644 --- a/server/src/structs/cloud/cloud_events/event_types/change_network_resolve_event.rs +++ b/server/src/structs/cloud/cloud_events/event_types/change_network_resolve_event.rs @@ -8,6 +8,7 @@ use ts_rs::TS; pub struct ChangeNetworkResolveEvent { pub session_id: String, pub request_id: String, + #[ts(optional)] pub new_network: Option, #[ts(optional)] pub failure_reason: Option, diff --git a/server/src/structs/cloud/cloud_events/event_types/sign_and_send_transaction_resolve_event.rs b/server/src/structs/cloud/cloud_events/event_types/sign_and_send_transaction_resolve_event.rs index 4e9ab5f6..cd0669e4 100644 --- a/server/src/structs/cloud/cloud_events/event_types/sign_and_send_transaction_resolve_event.rs +++ b/server/src/structs/cloud/cloud_events/event_types/sign_and_send_transaction_resolve_event.rs @@ -8,7 +8,7 @@ use ts_rs::TS; pub struct SignAndSendTransactionResolveEvent { pub session_id: String, pub request_id: String, - pub network: String, + #[ts(optional)] pub tx_hash: Option, #[ts(optional)] pub failure_reason: Option, diff --git a/server/src/structs/cloud/cloud_events/event_types/sign_transaction_resolve_event.rs b/server/src/structs/cloud/cloud_events/event_types/sign_transaction_resolve_event.rs index 0403bad1..da9cdf49 100644 --- a/server/src/structs/cloud/cloud_events/event_types/sign_transaction_resolve_event.rs +++ b/server/src/structs/cloud/cloud_events/event_types/sign_transaction_resolve_event.rs @@ -8,6 +8,7 @@ use ts_rs::TS; pub struct SignTransactionResolveEvent { pub session_id: String, pub request_id: String, + #[ts(optional)] pub tx_hash: Option, #[ts(optional)] pub failure_reason: Option, diff --git a/server/src/structs/cloud/cloud_events/events.rs b/server/src/structs/cloud/cloud_events/events.rs index 03316ec3..3df0413a 100644 --- a/server/src/structs/cloud/cloud_events/events.rs +++ b/server/src/structs/cloud/cloud_events/events.rs @@ -1,6 +1,8 @@ use super::event_types::{ app_connect_event::AppConnectEvent, app_disconnect_event::AppDisconnectEvent, - change_network_event::ChangeNetworkEvent, change_wallet_event::ChangeWalletEvent, + change_network_event::ChangeNetworkEvent, + change_network_resolve_event::ChangeNetworkResolveEvent, + change_wallet_event::ChangeWalletEvent, change_wallet_resolve_event::ChangeWalletResolveEvent, client_connect_event::ClientConnectEvent, client_connect_resolve_event::ClientConnectResolveEvent, client_disconnect_event::ClientDisconnectEvent, @@ -29,5 +31,7 @@ pub enum EventData { SignAndSendTransaction(SignAndSendTransactionEvent), SignAndSendTransactionResolve(SignAndSendTransactionResolveEvent), ChangeNetwork(ChangeNetworkEvent), + ChangeNetworkResolve(ChangeNetworkResolveEvent), ChangeWallet(ChangeWalletEvent), + ChangeWalletResolve(ChangeWalletResolveEvent), } diff --git a/server/src/structs/cloud/cloud_http_endpoints.rs b/server/src/structs/cloud/cloud_http_endpoints.rs index 9ab1fa33..04c5aa4c 100644 --- a/server/src/structs/cloud/cloud_http_endpoints.rs +++ b/server/src/structs/cloud/cloud_http_endpoints.rs @@ -6,12 +6,16 @@ use ts_rs::TS; pub enum HttpCloudEndpoint { #[serde(rename = "/register_new_app")] RegisterNewApp, - #[serde(rename = "/register_with_password")] - RegisterWithPassword, + #[serde(rename = "/register_with_password_start")] + RegisterWithPasswordStart, + #[serde(rename = "/register_with_password_finish")] + RegisterWithPasswordFinish, #[serde(rename = "/login_with_password")] LoginWithPassword, #[serde(rename = "/login_with_google")] LoginWithGoogle, + #[serde(rename = "/refresh_token")] + RefreshToken, #[serde(rename = "/register_new_team")] RegisterNewTeam, #[serde(rename = "/remove_user_from_team")] @@ -30,15 +34,74 @@ pub enum HttpCloudEndpoint { GetUserTeamInvites, #[serde(rename = "/cancel_team_user_invite")] CancelTeamUserInvite, - #[serde(rename = "/cancel_team_user_invite")] + #[serde(rename = "/cancel_user_team_invite")] CancelUserTeamInvite, + #[serde(rename = "/get_app_events")] + GetEvents, + #[serde(rename = "/reset_password_start")] + ResetPasswordStart, + #[serde(rename = "/reset_password_finish")] + ResetPasswordFinish, + #[serde(rename = "/verify_domain_start")] + VerifyDomainStart, + #[serde(rename = "/verify_domain_finish")] + VerifyDomainFinish, + #[serde(rename = "/remove_whitelisted_domain")] + RemoveWhitelistedDomain, + #[serde(rename = "/cancel_pending_domain_verification")] + CancelPendingDomainVerification, + #[serde(rename = "/register_with_passkey_start")] + RegisterWithPasskeyStart, + #[serde(rename = "/register_with_passkey_finish")] + RegisterWithPasskeyFinish, + #[serde(rename = "/reset_passkey_start")] + ResetPasskeyStart, + #[serde(rename = "/reset_passkey_finish")] + ResetPasskeyFinish, + #[serde(rename = "/get_passkey_challenge")] + GetPasskeyChallenge, + #[serde(rename = "/delete_passkey")] + DeletePasskey, + #[serde(rename = "/add_passkey_start")] + AddPasskeyStart, + #[serde(rename = "/add_passkey_finish")] + AddPasskeyFinish, + #[serde(rename = "/get_user_metadata")] + GetUserMetadata, + #[serde(rename = "/get_team_metadata")] + GetTeamMetadata, + #[serde(rename = "/get_team_users_privileges")] + GetTeamUserPrivileges, + #[serde(rename = "/change_user_privileges")] + ChangeUserPrivileges, + #[serde(rename = "/login_with_passkey_start")] + LoginWithPasskeyStart, + #[serde(rename = "/login_with_passkey_finish")] + LoginWithPasskeyFinish, + #[serde(rename = "/verify_code")] + VerifyCode, + #[serde(rename = "/leave_team")] + LeaveTeam, + #[serde(rename = "/delete_app")] + DeleteApp, + #[serde(rename = "/delete_team")] + DeleteTeam, + #[serde(rename = "/delete_account_start")] + DeleteAccountStart, + #[serde(rename = "/delete_account_finish")] + DeleteAccountFinish, } impl HttpCloudEndpoint { pub fn to_string(&self) -> String { match self { HttpCloudEndpoint::RegisterNewApp => "/register_new_app".to_string(), - HttpCloudEndpoint::RegisterWithPassword => "/register_with_password".to_string(), + HttpCloudEndpoint::RegisterWithPasswordStart => { + "/register_with_password_start".to_string() + } + HttpCloudEndpoint::RegisterWithPasswordFinish => { + "/register_with_password_finish".to_string() + } HttpCloudEndpoint::LoginWithPassword => "/login_with_password".to_string(), HttpCloudEndpoint::LoginWithGoogle => "/login_with_google".to_string(), HttpCloudEndpoint::RegisterNewTeam => "/register_new_team".to_string(), @@ -51,6 +114,40 @@ impl HttpCloudEndpoint { HttpCloudEndpoint::GetUserTeamInvites => "/get_user_team_invites".to_string(), HttpCloudEndpoint::CancelTeamUserInvite => "/cancel_team_user_invite".to_string(), HttpCloudEndpoint::CancelUserTeamInvite => "/cancel_user_team_invite".to_string(), + HttpCloudEndpoint::GetEvents => "/get_app_events".to_string(), + HttpCloudEndpoint::ResetPasswordStart => "/reset_password_start".to_string(), + HttpCloudEndpoint::ResetPasswordFinish => "/reset_password_finish".to_string(), + HttpCloudEndpoint::VerifyDomainStart => "/verify_domain_start".to_string(), + HttpCloudEndpoint::VerifyDomainFinish => "/verify_domain_finish".to_string(), + HttpCloudEndpoint::RemoveWhitelistedDomain => "/remove_whitelisted_domain".to_string(), + HttpCloudEndpoint::CancelPendingDomainVerification => { + "/cancel_pending_domain_verification".to_string() + } + HttpCloudEndpoint::RegisterWithPasskeyStart => { + "/register_with_passkey_start".to_string() + } + HttpCloudEndpoint::RegisterWithPasskeyFinish => { + "/register_with_passkey_finish".to_string() + } + HttpCloudEndpoint::ResetPasskeyStart => "/reset_passkey_start".to_string(), + HttpCloudEndpoint::ResetPasskeyFinish => "/reset_passkey_finish".to_string(), + HttpCloudEndpoint::DeletePasskey => "/delete_passkey".to_string(), + HttpCloudEndpoint::GetPasskeyChallenge => "/get_passkey_challenge".to_string(), + HttpCloudEndpoint::AddPasskeyStart => "/add_passkey_start".to_string(), + HttpCloudEndpoint::AddPasskeyFinish => "/add_passkey_finish".to_string(), + HttpCloudEndpoint::GetUserMetadata => "/get_user_metadata".to_string(), + HttpCloudEndpoint::GetTeamMetadata => "/get_team_metadata".to_string(), + HttpCloudEndpoint::GetTeamUserPrivileges => "/get_team_users_privileges".to_string(), + HttpCloudEndpoint::ChangeUserPrivileges => "/change_user_privileges".to_string(), + HttpCloudEndpoint::LoginWithPasskeyStart => "/login_with_passkey_start".to_string(), + HttpCloudEndpoint::LoginWithPasskeyFinish => "/login_with_passkey_finish".to_string(), + HttpCloudEndpoint::RefreshToken => "/refresh_token".to_string(), + HttpCloudEndpoint::VerifyCode => "/verify_code".to_string(), + HttpCloudEndpoint::LeaveTeam => "/leave_team".to_string(), + HttpCloudEndpoint::DeleteApp => "/delete_app".to_string(), + HttpCloudEndpoint::DeleteTeam => "/delete_team".to_string(), + HttpCloudEndpoint::DeleteAccountStart => "/delete_account_start".to_string(), + HttpCloudEndpoint::DeleteAccountFinish => "/delete_account_finish".to_string(), } } } diff --git a/server/src/structs/cloud/grafana_error.rs b/server/src/structs/cloud/grafana_error.rs new file mode 100644 index 00000000..f939039b --- /dev/null +++ b/server/src/structs/cloud/grafana_error.rs @@ -0,0 +1,60 @@ +use axum::http::StatusCode; +use log::{info, warn}; +use openapi::{apis::Error, models::ErrorResponseBody}; +use serde::Serialize; +use std::fmt; + +pub fn handle_grafana_error(error: Error) -> (StatusCode, String) +where + T: Serialize + fmt::Debug, +{ + match error { + Error::Reqwest(err) => { + warn!("Network error: {}", err); + ( + StatusCode::BAD_GATEWAY, + "Network error occurred".to_string(), + ) + } + Error::Serde(err) => { + warn!("Serialization/deserialization error: {}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + "Error processing data".to_string(), + ) + } + Error::Io(err) => { + warn!("I/O error: {}", err); + ( + StatusCode::INTERNAL_SERVER_ERROR, + "I/O error occurred".to_string(), + ) + } + Error::ResponseError(response_content) => { + info!( + "HTTP error with status {}: {}, entity: {:?}", + response_content.status, response_content.content, response_content.entity + ); + let message = match &response_content.entity { + Some(entity) => { + let serialized = + serde_json::to_string(entity).unwrap_or_else(|_| "{}".to_string()); + serde_json::from_str::(&serialized).map_or_else( + |_| { + warn!("Failed to extract ErrorResponseBody, using original content"); + response_content.content.clone() + }, + |body| body.message, + ) + } + None => response_content.content.clone(), + }; + let status_code = StatusCode::from_u16(response_content.status.as_u16()) + .unwrap_or_else(|_| { + warn!("Failed to convert status code: {}", response_content.status); + StatusCode::INTERNAL_SERVER_ERROR + }); + (status_code, message) + } + } +} diff --git a/server/src/structs/cloud/mod.rs b/server/src/structs/cloud/mod.rs index d8be411b..1e8eadba 100644 --- a/server/src/structs/cloud/mod.rs +++ b/server/src/structs/cloud/mod.rs @@ -3,7 +3,10 @@ pub mod app_event; pub mod app_info; pub mod cloud_events; pub mod cloud_http_endpoints; -pub mod device_metadata; +pub mod grafana_error; pub mod joined_team; +pub mod new_user_privilege_level; pub mod team_invite; +pub mod team_metadata; +pub mod team_user_privilege; pub mod user_privilege; diff --git a/server/src/structs/cloud/new_user_privilege_level.rs b/server/src/structs/cloud/new_user_privilege_level.rs new file mode 100644 index 00000000..1a62ca0f --- /dev/null +++ b/server/src/structs/cloud/new_user_privilege_level.rs @@ -0,0 +1,22 @@ +use database::structs::privilege_level::PrivilegeLevel; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub enum NewUserPrivilegeLevel { + Read, + Edit, + NoAccess, +} + +impl NewUserPrivilegeLevel { + pub fn to_privilege_level(&self) -> Option { + match self { + NewUserPrivilegeLevel::Read => Some(PrivilegeLevel::Read), + NewUserPrivilegeLevel::Edit => Some(PrivilegeLevel::Edit), + NewUserPrivilegeLevel::NoAccess => None, + } + } +} diff --git a/server/src/structs/cloud/team_invite.rs b/server/src/structs/cloud/team_invite.rs index fbc84441..8c6d4ca8 100644 --- a/server/src/structs/cloud/team_invite.rs +++ b/server/src/structs/cloud/team_invite.rs @@ -6,6 +6,7 @@ use ts_rs::TS; #[ts(export)] #[serde(rename_all = "camelCase")] pub struct TeamInvite { + pub team_id: String, pub creator_email: String, pub team_name: String, pub user_email: String, @@ -15,6 +16,7 @@ pub struct TeamInvite { impl From for TeamInvite { fn from(db_team_invite: DbTeamInvite) -> Self { Self { + team_id: db_team_invite.team_id, creator_email: db_team_invite.admin_email, team_name: db_team_invite.team_name, user_email: db_team_invite.user_email, diff --git a/server/src/structs/cloud/team_metadata.rs b/server/src/structs/cloud/team_metadata.rs new file mode 100644 index 00000000..1688cf5d --- /dev/null +++ b/server/src/structs/cloud/team_metadata.rs @@ -0,0 +1,16 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +use super::joined_team::TeamId; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct TeamMetadata { + pub creator_email: String, + pub team_id: TeamId, + pub team_name: String, + pub personal_team: bool, + pub created_at: DateTime, +} diff --git a/server/src/structs/cloud/team_user_privilege.rs b/server/src/structs/cloud/team_user_privilege.rs new file mode 100644 index 00000000..fe40fff4 --- /dev/null +++ b/server/src/structs/cloud/team_user_privilege.rs @@ -0,0 +1,13 @@ +use crate::state::AppId; +use database::structs::privilege_level::PrivilegeLevel; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub struct TeamUserPrivilege { + pub app_id: AppId, + pub user_email: String, + pub privilege: PrivilegeLevel, +} diff --git a/server/src/structs/common.rs b/server/src/structs/common.rs index 0612eaa8..3b9572e9 100644 --- a/server/src/structs/common.rs +++ b/server/src/structs/common.rs @@ -38,14 +38,6 @@ pub enum SessionStatus { Idle, // Both disconnected, but session is still alive for a while in case client reconnects } -#[derive(Debug, Display, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] -#[ts(export)] -pub enum Device { - Apple, - Android, - Unknown, -} - #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] #[ts(export)] #[serde(rename_all = "camelCase")] diff --git a/server/src/structs/mod.rs b/server/src/structs/mod.rs index ecc8c117..6e0cfe77 100644 --- a/server/src/structs/mod.rs +++ b/server/src/structs/mod.rs @@ -5,6 +5,7 @@ pub mod common; pub mod http_endpoints; pub mod notification_msg; pub mod session; +pub mod session_cache; pub mod wallet_metadata; pub mod wallet_type; pub mod wallets; diff --git a/server/src/structs/notification_msg.rs b/server/src/structs/notification_msg.rs index 3c23c522..263d1188 100644 --- a/server/src/structs/notification_msg.rs +++ b/server/src/structs/notification_msg.rs @@ -1,5 +1,6 @@ -use super::common::{AppMetadata, Device, Network}; +use super::common::{AppMetadata, Network}; use anyhow::Result; +use database::structs::device_metadata::Device; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -21,7 +22,13 @@ pub async fn trigger_notification( notification: NotificationPayload, ) -> Result<()> { tokio::spawn(async move { - let body = serde_json::to_string(¬ification).expect("Failed to serialize notification"); + let body = match serde_json::to_string(¬ification) { + Ok(body) => body, + Err(e) => { + log::error!("Failed to serialize notification: {:?}", e); + return false; + } + }; let client = reqwest::Client::new(); return client .post(endpoint) diff --git a/server/src/structs/session.rs b/server/src/structs/session.rs index b95323d3..b6c5b30b 100644 --- a/server/src/structs/session.rs +++ b/server/src/structs/session.rs @@ -3,11 +3,12 @@ use super::{ app_messages::ServerToApp, initialize::InitializeRequest, user_connected_event::UserConnectedEvent, user_disconnected_event::UserDisconnectedEvent, }, - common::{AppMetadata, Device, Network, Notification, PendingRequest, SessionStatus, Version}, + common::{AppMetadata, Network, Notification, PendingRequest, SessionStatus, Version}, }; use crate::{state::ClientId, utils::get_timestamp_in_milliseconds}; use anyhow::{bail, Result}; use axum::extract::ws::{Message, WebSocket}; +use database::structs::device_metadata::Device; use futures::{stream::SplitSink, SinkExt}; use log::{info, warn}; use std::collections::HashMap; @@ -30,11 +31,18 @@ impl Session { pub async fn send_to_app(&mut self, msg: ServerToApp) -> Result<()> { // Send to all apps for (_, socket) in &mut self.app_state.app_socket { - info!("Send to app {}, msg: {:?}", self.session_id, msg); + info!( + "Send to app from session: {}, msg: {:?}", + self.session_id, msg + ); + let serialized_msg = match serde_json::to_string(&msg) { + Ok(serialized_msg) => serialized_msg, + Err(e) => { + bail!("Failed to serialize message: {:?}", e); + } + }; socket - .send(Message::Text( - serde_json::to_string(&msg).expect("Serialization should work"), - )) + .send(Message::Text(serialized_msg)) .await .unwrap_or_default(); } @@ -170,7 +178,7 @@ pub struct AppState { pub metadata: AppMetadata, pub app_socket: HashMap>, } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct ClientState { pub client_id: Option, pub device: Option, diff --git a/server/src/structs/session_cache.rs b/server/src/structs/session_cache.rs new file mode 100644 index 00000000..867e067a --- /dev/null +++ b/server/src/structs/session_cache.rs @@ -0,0 +1,135 @@ +use r_cache::cache::Cache; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +pub type ApiSessionsCache = Cache; + +#[derive(Debug, Clone)] +pub enum SessionCache { + VerifyRegister(RegisterVerification), + ResetPassword(ResetPasswordVerification), + VerifyPasskeyRegister(PasskeyVerification), + ResetPasskey(ResetPasskeyVerification), + Passkey2FA(Passkey2FAVerification), + VerifyAddPasskey(AddPasskeyVerification), + PasskeyLogin(PasskeyLoginVerification), + DeleteAccount(DeleteAccountVerification), +} + +pub enum SessionsCacheKey { + RegisterVerification(String), // user email + ResetPasswordVerification(String), // user email + PasskeyVerification(String), // user email + ResetPasskeyVerification(String), // user email + Passkey2FA(String), // user id + AddPasskey(String), // user id + PasskeyLogin(String), // user email + DeleteAccount(String), // user email +} + +impl SessionsCacheKey { + pub fn to_string(&self) -> String { + match self { + SessionsCacheKey::RegisterVerification(email) => format!("reg_ver_{}", email), + SessionsCacheKey::ResetPasswordVerification(email) => format!("pass_res_{}", email), + SessionsCacheKey::PasskeyVerification(email) => format!("pass_reg_{}", email), + SessionsCacheKey::ResetPasskeyVerification(email) => format!("pass_res_{}", email), + SessionsCacheKey::Passkey2FA(user_id) => format!("pass_chal_{}", user_id), + SessionsCacheKey::AddPasskey(email) => format!("add_pass_{}", email), + SessionsCacheKey::PasskeyLogin(email) => format!("pass_login_{}", email), + SessionsCacheKey::DeleteAccount(email) => format!("del_acc_{}", email), + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts(export)] +#[serde(rename_all = "camelCase")] +pub enum VerificationAction { + RegisterPassword, + RegisterPasskey, + ResetPassword, + ResetPasskey, + DeleteAccount, +} + +impl VerificationAction { + pub fn to_session_key(&self, user_data: String) -> SessionsCacheKey { + match self { + VerificationAction::RegisterPassword => { + SessionsCacheKey::RegisterVerification(user_data) + } + VerificationAction::RegisterPasskey => SessionsCacheKey::PasskeyVerification(user_data), + VerificationAction::ResetPassword => { + SessionsCacheKey::ResetPasswordVerification(user_data) + } + VerificationAction::ResetPasskey => { + SessionsCacheKey::ResetPasskeyVerification(user_data) + } + VerificationAction::DeleteAccount => SessionsCacheKey::DeleteAccount(user_data), + } + } +} + +#[derive(Debug, Clone)] +pub struct RegisterVerification { + pub email: String, + pub verification_code: String, + pub authentication_code: Option, + pub created_at: u64, +} + +#[derive(Debug, Clone)] +pub struct ResetPasswordVerification { + pub email: String, + pub verification_code: String, + pub authentication_code: Option, + pub created_at: u64, +} + +#[derive(Debug, Clone)] +pub struct PasskeyVerification { + pub email: String, + pub verification_code: String, + pub authentication_code: Option, + pub passkey_registration_state: webauthn_rs::prelude::PasskeyRegistration, + pub created_at: u64, +} + +#[derive(Debug, Clone)] +pub struct ResetPasskeyVerification { + pub email: String, + pub verification_code: String, + pub authentication_code: Option, + pub passkey_registration_state: webauthn_rs::prelude::PasskeyRegistration, + pub created_at: u64, +} + +#[derive(Debug, Clone)] +pub struct AddPasskeyVerification { + pub user_id: String, + pub passkey_registration_state: webauthn_rs::prelude::PasskeyRegistration, + pub created_at: u64, +} + +#[derive(Debug, Clone)] +pub struct Passkey2FAVerification { + pub email: String, + pub passkey_verification_state: webauthn_rs::prelude::PasskeyAuthentication, + pub created_at: u64, +} + +#[derive(Debug, Clone)] +pub struct PasskeyLoginVerification { + pub email: String, + pub passkey_verification_state: webauthn_rs::prelude::PasskeyAuthentication, + pub created_at: u64, +} + +#[derive(Debug, Clone)] +pub struct DeleteAccountVerification { + pub email: String, + pub verification_code: String, + pub authentication_code: Option, + pub created_at: u64, +} diff --git a/server/src/test_env.rs b/server/src/test_env.rs new file mode 100644 index 00000000..67e8df94 --- /dev/null +++ b/server/src/test_env.rs @@ -0,0 +1,21 @@ +use std::sync::atomic::{AtomicBool, Ordering}; + +static IS_TEST_ENV: AtomicBool = AtomicBool::new(false); + +pub fn is_test_env() -> bool { + IS_TEST_ENV.load(Ordering::Relaxed) +} + +#[cfg(test)] +pub mod test_detection { + use super::IS_TEST_ENV; + use std::sync::{atomic::Ordering, Once}; + + static INIT: Once = Once::new(); + + pub fn setup() { + INIT.call_once(|| { + IS_TEST_ENV.store(true, Ordering::Relaxed); + }); + } +} diff --git a/server/src/test_utils.rs b/server/src/test_utils.rs index 1c67b0e3..96c54fda 100644 --- a/server/src/test_utils.rs +++ b/server/src/test_utils.rs @@ -2,26 +2,40 @@ pub mod test_utils { use crate::{ auth::AuthToken, - env::{JWT_PUBLIC_KEY, JWT_SECRET}, + env::{ + GF_SECURITY_ADMIN_PASSWORD, GF_SECURITY_ADMIN_USER, GRAFANA_BASE_PATH, JWT_PUBLIC_KEY, + JWT_SECRET, + }, http::cloud::{ accept_team_invite::{HttpAcceptTeamInviteRequest, HttpAcceptTeamInviteResponse}, - get_team_user_invites::{ - HttpGetTeamUserInvitesRequest, HttpGetTeamUserInvitesResponse, + domains::{ + verify_domain_finish::{ + HttpVerifyDomainFinishRequest, HttpVerifyDomainFinishResponse, + }, + verify_domain_start::{ + HttpVerifyDomainStartRequest, HttpVerifyDomainStartResponse, + }, }, + get_team_metadata::HttpGetTeamMetadataResponse, + get_team_user_invites::HttpGetTeamUserInvitesResponse, get_user_joined_teams::HttpGetUserJoinedTeamsResponse, get_user_team_invites::HttpGetUserTeamInvitesResponse, invite_user_to_team::{HttpInviteUserToTeamRequest, HttpInviteUserToTeamResponse}, - login_with_password::{HttpLoginRequest, HttpLoginResponse}, + login::login_with_password::{HttpLoginRequest, HttpLoginResponse}, + register::{ + register_with_password_finish::HttpRegisterWithPasswordFinishRequest, + register_with_password_start::HttpRegisterWithPasswordStartRequest, + }, register_new_app::{HttpRegisterNewAppRequest, HttpRegisterNewAppResponse}, register_new_team::{HttpRegisterNewTeamRequest, HttpRegisterNewTeamResponse}, - register_with_password::HttpRegisterWithPasswordRequest, remove_user_from_team::{ HttpRemoveUserFromTeamRequest, HttpRemoveUserFromTeamResponse, }, }, routes::router::get_router, statics::NAME_REGEX, - structs::cloud::{cloud_http_endpoints::HttpCloudEndpoint, team_invite::TeamInvite}, + structs::cloud::{app_info::AppInfo, cloud_http_endpoints::HttpCloudEndpoint}, + test_env::test_detection::setup, }; use anyhow::bail; use axum::{ @@ -31,15 +45,17 @@ pub mod test_utils { Router, }; use database::db::Db; + use openapi::apis::configuration::Configuration; use rand::{ distributions::{Alphanumeric, Uniform}, thread_rng, Rng, }; use sqlx::Row; - use std::net::SocketAddr; + use std::{net::SocketAddr, sync::Arc}; use tower::ServiceExt; pub async fn create_test_app(only_relay: bool) -> Router { + setup(); let app = get_router(only_relay).await; let listener = tokio::net::TcpListener::bind(&"127.0.0.1:6969") @@ -110,9 +126,10 @@ pub mod test_utils { let password = format!("Password123"); // Register user - let register_payload = HttpRegisterWithPasswordRequest { + let register_payload = HttpRegisterWithPasswordStartRequest { email: email.to_string(), - password: password.to_string(), + device: "device".to_string(), + browser: "browser".to_string(), }; let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); @@ -123,7 +140,7 @@ pub mod test_utils { .header("content-type", "application/json") .uri(format!( "/cloud/public{}", - HttpCloudEndpoint::RegisterWithPassword.to_string() + HttpCloudEndpoint::RegisterWithPasswordStart.to_string() )) .extension(ip) .body(Body::from(json)) @@ -133,6 +150,32 @@ pub mod test_utils { let register_response = app.clone().oneshot(req).await.unwrap(); assert_eq!(register_response.status(), StatusCode::OK); + // Validate register + let verify_register_payload = HttpRegisterWithPasswordFinishRequest { + email: email.to_string(), + // Random code + auth_code: "123456789".to_string(), + new_password: password.to_string(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&verify_register_payload).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .uri(format!( + "/cloud/public{}", + HttpCloudEndpoint::RegisterWithPasswordFinish.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // send request to app and get response + let verify_register_response = app.clone().oneshot(req).await.unwrap(); + assert_eq!(verify_register_response.status(), StatusCode::OK); + // Login user let login_payload = HttpLoginRequest { email: email.to_string(), @@ -320,12 +363,7 @@ pub mod test_utils { app: &Router, ) -> anyhow::Result { // Get team invites for users - let request = HttpGetTeamUserInvitesRequest { - team_id: team_id.clone(), - }; - let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); - let json = serde_json::to_string(&request).unwrap(); let auth = user_token.encode(JWT_SECRET()).unwrap(); let req = Request::builder() @@ -333,11 +371,11 @@ pub mod test_utils { .header("content-type", "application/json") .header("authorization", format!("Bearer {auth}")) .uri(format!( - "/cloud/private{}", + "/cloud/private{}?teamId={team_id}", HttpCloudEndpoint::GetTeamUserInvites.to_string() )) .extension(ip) - .body(Body::from(json)) + .body(Body::empty()) .unwrap(); // Send request @@ -434,6 +472,110 @@ pub mod test_utils { convert_response::(response).await } + pub async fn verify_new_domain( + domain_name: &String, + app_id: &String, + admin_token: &AuthToken, + app: &Router, + ) -> anyhow::Result<()> { + // Start domain verification + let request = HttpVerifyDomainStartRequest { + domain_name: domain_name.clone(), + app_id: app_id.clone(), + }; + + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let json = serde_json::to_string(&request).unwrap(); + let auth = admin_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::VerifyDomainStart.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(response).await?; + + // Finish domain verification + let request = HttpVerifyDomainFinishRequest { + domain_name: domain_name.clone(), + app_id: app_id.clone(), + }; + + let json = serde_json::to_string(&request).unwrap(); + let auth = admin_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::POST) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}", + HttpCloudEndpoint::VerifyDomainFinish.to_string() + )) + .extension(ip) + .body(Body::from(json)) + .unwrap(); + + // Send request + let response = app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(response) + .await + .map(|_| Ok(()))? + } + + pub async fn get_test_app_data( + team_id: &String, + app_id: &String, + user_token: &AuthToken, + app: &Router, + ) -> anyhow::Result { + let user_joined_teams = get_test_user_joined_teams(user_token, app).await?; + match user_joined_teams.teams_apps.get(team_id) { + Some(apps) => match apps.iter().find(|app| &app.app_id == app_id) { + Some(app) => Ok(app.clone()), + None => bail!("App not found"), + }, + None => bail!("Team not found"), + } + } + + pub async fn get_test_team_data( + team_id: &String, + user_token: &AuthToken, + app: &Router, + ) -> anyhow::Result { + let ip: ConnectInfo = ConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080))); + let auth = user_token.encode(JWT_SECRET()).unwrap(); + + let req = Request::builder() + .method(Method::GET) + .header("content-type", "application/json") + .header("authorization", format!("Bearer {auth}")) + .uri(format!( + "/cloud/private{}?teamId={team_id}", + HttpCloudEndpoint::GetTeamMetadata.to_string() + )) + .extension(ip.clone()) + .body(Body::empty()) + .unwrap(); + + // Send request + let response = app.clone().oneshot(req).await.unwrap(); + // Validate response + convert_response::(response).await + } + pub async fn body_to_vec(response: Response) -> anyhow::Result> { match to_bytes(response.into_body(), usize::MAX).await { Ok(body) => Ok(body.to_vec()), @@ -500,4 +642,14 @@ pub mod test_utils { name } + + pub fn get_grafana_configuration() -> Arc { + let mut conf = Configuration::new(); + conf.base_path = GRAFANA_BASE_PATH().to_string(); + conf.basic_auth = Some(( + GF_SECURITY_ADMIN_USER().to_string(), + Some(GF_SECURITY_ADMIN_PASSWORD().to_string()), + )); + Arc::new(conf) + } } diff --git a/server/src/utils.rs b/server/src/utils.rs index 00f88858..cb963fe6 100644 --- a/server/src/utils.rs +++ b/server/src/utils.rs @@ -1,35 +1,30 @@ use crate::{ - auth::AuthToken, - env::JWT_SECRET, - ip_geolocation::GeolocationRequester, - statics::{NAME_REGEX, REGISTER_PASSWORD_VALIDATOR}, + http::cloud::grafana_utils::{ + import_template_dashboard::setup_templates_dashboard, + setup_database_datasource::setup_database_datasource, + setup_template_folder::setup_templates_folder, + }, structs::{ cloud::api_cloud_errors::CloudApiErrors, wallet_metadata::WalletMetadata, wallets::*, }, }; use axum::http::{header, Method, StatusCode}; -use database::{ - db::Db, - structs::{consts::DAY_IN_SECONDS, pagination_cursor::PaginationCursor}, - tables::ip_addresses::table_struct::IpAddressEntry, -}; -use database::{structs::geo_location::Geolocation, tables::utils::get_current_datetime}; -use garde::Validate; -use log::{error, warn}; +use database::db::Db; +use log::error; +use openapi::apis::configuration::Configuration; +use sqlx::{Postgres, Transaction}; use std::{ - net::SocketAddr, - str::FromStr, sync::Arc, time::{Duration, SystemTime, UNIX_EPOCH}, }; use tower_http::cors::{Any, CorsLayer}; -use uuid7::Uuid; pub fn get_timestamp_in_milliseconds() -> u64 { let now = SystemTime::now(); let since_the_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards"); since_the_epoch.as_millis() as u64 } + pub fn get_cors() -> CorsLayer { CorsLayer::new() .allow_methods([Method::GET, Method::POST, Method::OPTIONS]) @@ -57,161 +52,31 @@ pub fn get_wallets_metadata_vec() -> Vec { ] } -pub async fn get_geolocation_data( +pub async fn start_transaction( db: &Arc, - geo_loc_requester: &Arc, - ip: &SocketAddr, -) -> Option { - // Check if we already have the data in the database - match db.get_ip_address(&ip.to_string()).await { - Ok(Some(ip_address)) => { - // Check if the data is not older than 24 hours - let current_time = get_current_datetime(); - - if ip_address.last_updated_at + Duration::from_secs(DAY_IN_SECONDS) > current_time { - return Some(Geolocation { - country: ip_address.country, - city: ip_address.city, - lat: ip_address.lat, - lon: ip_address.lon, - }); - } - } - Ok(None) => { - // Do nothing, we will fetch the data from the geolocation service - } +) -> Result, (StatusCode, String)> { + match db.connection_pool.begin().await { + Ok(tx) => Ok(tx), Err(err) => { - warn!("Failed to get geolocation, ip: [{}], err: [{}]", ip, err); - return None; - } - } - - // Fetch data from the geolocation service and update the database - match geo_loc_requester.get_geolocation(&ip.to_string()).await { - Ok(geo_location) => match (geo_location.lat, geo_location.lon) { - (Some(_), Some(_)) => { - let ip_address_entry = IpAddressEntry { - ip_addr: ip.to_string(), - last_updated_at: get_current_datetime(), - country: geo_location.country.clone(), - city: geo_location.city.clone(), - lat: geo_location.lat.clone(), - lon: geo_location.lon.clone(), - }; - - // Try to safely insert the new ip address - if let Err(err) = db.upsert_ip_address(&ip_address_entry).await { - warn!( - "Failed to insert new ip address, ip: [{}], err: [{}]", - ip, err - ); - } - - // Return the geolocation data, no matter if the we managed to save the data to the database - Some(geo_location.into()) - } - _ => { - warn!( - "Failed to get geolocation, ip: [{}], err: [{}]", - ip, "Latitude or longitude is missing" - ); - None - } - }, - Err(err) => { - warn!("Failed to get geolocation, ip: [{}], err: [{}]", ip, err); - None + error!("Failed to start transaction: {:?}", err); + Err(( + StatusCode::INTERNAL_SERVER_ERROR, + CloudApiErrors::DatabaseError.to_string(), + )) } } } -pub fn validate_request(payload: T, ctx: &T::Context) -> Result<(), (StatusCode, String)> -where - T: Validate, -{ - payload.validate(ctx).map_err(|report| { - let error_message = match report.iter().next() { - Some((_, error)) => error.message().to_string(), - None => "Unknown error".to_string(), - }; +pub async fn import_template_dashboards(grafana_client: &Arc) { + // Check if folder exists if not create it + setup_templates_folder(&grafana_client).await.unwrap(); - (StatusCode::BAD_REQUEST, format!("{}", error_message)) - })?; - return Ok(()); -} - -pub fn custom_validate_uuid(string_uuid: &String, _context: &()) -> garde::Result { - Uuid::from_str(&string_uuid) - .map_err(|_| garde::Error::new("Invalid UUID format".to_string()))?; - Ok(()) -} + // Check if database datasource was set up in grafana + setup_database_datasource(&grafana_client).await.unwrap(); -pub fn custom_validate_name(name: &String, _context: &()) -> garde::Result { - NAME_REGEX - .is_match(name) - .then(|| ()) - .ok_or_else(|| garde::Error::new(CloudApiErrors::InvalidName.to_string())) -} - -pub fn custom_validate_new_password(password: &String, _context: &()) -> garde::Result { - if !password.is_ascii() { - return Err(garde::Error::new("Password contains non-ascii characters")); - } - for validator in REGISTER_PASSWORD_VALIDATOR.iter() { - if !validator.re.is_match(password) { - return Err(garde::Error::new(validator.error.as_str())); - } - } - Ok(()) -} - -pub fn custom_validate_optional_pagination_cursor( - cursor: &Option, - _context: &(), -) -> garde::Result { - match cursor { - Some(cursor) => { - if cursor.0.is_empty() { - return Err(garde::Error::new( - CloudApiErrors::InvalidPaginationCursor.to_string(), - )); - } - Ok(()) - } - None => Ok(()), - } -} - -pub fn generate_tokens( - enforce_ip: bool, - ip: SocketAddr, - user_id: &String, - // (Auth Token, Refresh Token) -) -> Result<(String, String), (StatusCode, String)> { - // Generate tokens - let ip = if enforce_ip { Some(ip) } else { None }; - // Access token - let token = match AuthToken::new_access(&user_id, ip).encode(JWT_SECRET()) { - Ok(token) => token, - Err(err) => { - error!("Failed to create access token: {:?}", err); - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::AccessTokenFailure.to_string(), - )); - } - }; - // Refresh token - let refresh_token = match AuthToken::new_refresh(&user_id, ip).encode(JWT_SECRET()) { - Ok(token) => token, - Err(err) => { - error!("Failed to create refresh token: {:?}", err); - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - CloudApiErrors::RefreshTokenFailure.to_string(), - )); - } - }; + // Check if template dashboard exists if not create it + setup_templates_dashboard(&grafana_client).await.unwrap(); - Ok((token, refresh_token)) + // Setup global dashboard + // TODO } diff --git a/server/src/ws/app_handler/handler.rs b/server/src/ws/app_handler/handler.rs index fc4ea072..436189a0 100644 --- a/server/src/ws/app_handler/handler.rs +++ b/server/src/ws/app_handler/handler.rs @@ -2,13 +2,17 @@ use super::methods::{ disconnect_session::disconnect_session, initialize_session::initialize_session_connection, }; use crate::{ + cloud_state::CloudState, + env::ONLY_RELAY_SERVICE, + http::cloud::utils::extract_domain_name, + middlewares::origin_middleware::Origin, state::{ ClientSockets, ClientToSessions, SendToClient, SessionToApp, SessionToAppMap, Sessions, }, structs::{ - app_messages::app_messages::AppToServer, + app_messages::{app_messages::AppToServer, initialize::InitializeRequest}, client_messages::{client_messages::ServerToClient, new_payload_event::NewPayloadEvent}, - common::{Device, PendingRequest}, + common::PendingRequest, notification_msg::{trigger_notification, NotificationPayload}, }, }; @@ -19,19 +23,22 @@ use axum::{ }, response::Response, }; +use database::structs::device_metadata::Device; use futures::StreamExt; -use log::{debug, warn}; -use std::net::SocketAddr; +use log::{debug, error, info, warn}; +use std::{net::SocketAddr, sync::Arc}; pub async fn on_new_app_connection( ConnectInfo(ip): ConnectInfo, + State(cloud): State>>, + Origin(origin): Origin, State(sessions): State, State(client_sockets): State, State(client_to_sessions): State, State(session_to_app_map): State, ws: WebSocketUpgrade, ) -> Response { - let ip = ip.clone().to_string().clone(); + let ip = ip.to_string(); ws.on_upgrade(move |socket| async move { debug!("OPEN app connection from {}", ip); app_handler( @@ -40,6 +47,8 @@ pub async fn on_new_app_connection( client_sockets, client_to_sessions, session_to_app_map, + cloud, + origin, ) .await; debug!("CLOSE app connection from {}", ip); @@ -52,6 +61,8 @@ pub async fn app_handler( client_sockets: ClientSockets, client_to_sessions: ClientToSessions, session_to_app_map: SessionToAppMap, + cloud: Option>, + origin: Option, ) { let (sender, mut receiver) = socket.split(); let connection_id = uuid7::uuid7(); @@ -82,16 +93,21 @@ pub async fn app_handler( // We only accept initialize messages here match app_msg { AppToServer::InitializeRequest(init_data) => { - // TEMP FIX - let app_id = match &init_data.persistent_session_id { - Some(session_id) => session_to_app_map - .get_app_id(&session_id) - .await - .unwrap_or_else(|| { - warn!("No app_id found for session: {}", session_id); - uuid7::uuid7().to_string() - }), - None => uuid7::uuid7().to_string(), + // If cloud is enabled, we will try to get app_id from the verified origin + let app_id = match get_app_id( + ONLY_RELAY_SERVICE(), + &cloud, + &origin, + &init_data, + &session_to_app_map, + ) + .await + { + Ok(app_id) => app_id, + Err(_err) => { + // TODO explicit reject of the connection + return; + } }; let session_id = initialize_session_connection( @@ -241,3 +257,131 @@ pub async fn app_handler( } } } + +async fn get_app_id( + cloud_disabled: bool, + cloud_state: &Option>, + origin: &Option, + init_data: &InitializeRequest, + session_to_app_map: &SessionToAppMap, +) -> Result { + // By default cloud is disabled, normal relay flow + if cloud_disabled { + return Ok( + fetch_app_id_or_generate(&init_data.persistent_session_id, &session_to_app_map).await, + ); + } + + // If cloud is enabled, we will try to get app_id from the verified origin if it was provided + if let Some(cloud) = cloud_state { + match origin { + Some(origin) => { + // Origin was provided, extract domain name and check if it is verified + + let domain_name = extract_domain_name(&origin)?; + + match cloud + .db + .get_finished_domain_verification_by_domain_name(&domain_name) + .await + { + // Domain verification has been found + Ok(Some(domain_verification)) => { + // Check if domain is verified + if domain_verification.finished_at.is_some() { + // Check if app_id has been provided in initial data + match &init_data.app_id { + Some(app_id) => { + // App id has been provided, check if it matches the verified app_id + if app_id == &domain_verification.app_id { + return Ok(app_id.clone()); + } else { + info!( + "App id mismatch: {} != {}", + app_id, domain_verification.app_id + ); + return Err("App id mismatch".to_string()); + } + } + // App id has not been provided, return the verified app_id + None => { + return Ok(domain_verification.app_id); + } + } + } else { + info!("Domain verification has not been finished: {}", origin); + return Err("Domain verification has not been finished".to_string()); + } + } + // Unverified domain, normal relay flow + Ok(None) | Err(_) => { + info!( + "Origin verification failed or error encountered: {}", + origin + ); + return Ok(fetch_app_id_or_generate( + &init_data.persistent_session_id, + &session_to_app_map, + ) + .await); + } + } + } + None => { + // If origin is missing, check if app id has been provided + match &init_data.app_id { + Some(app_id) => { + // Check if provided app_id has already been registered + match cloud.db.get_registered_app_by_app_id(app_id).await { + Ok(Some(_)) => { + // app id is already used by a registered app, reject the connection by the origin + info!("App id already registered, origin not provided: {}", app_id); + return Err( + "App id already registered, origin not provided".to_string() + ); + } + // App id is not registered, or something has happened with the db, normal relay flow + Ok(None) | Err(_) => { + return Ok(fetch_app_id_or_generate( + &init_data.persistent_session_id, + &session_to_app_map, + ) + .await); + } + } + } + None => + // If app_id is not provided, normal relay flow + { + return Ok(fetch_app_id_or_generate( + &init_data.persistent_session_id, + &session_to_app_map, + ) + .await); + } + } + } + } + } else { + error!("Cloud feature is enabled but cloud state is not initialized"); + return Ok( + fetch_app_id_or_generate(&init_data.persistent_session_id, &session_to_app_map).await, + ); + } +} + +async fn fetch_app_id_or_generate( + session_id_option: &Option, + session_to_app_map: &SessionToAppMap, +) -> String { + match session_id_option { + Some(session_id) => session_to_app_map + .get_app_id(session_id) + .await + .unwrap_or_else(|| { + warn!("No app_id found for session: {}", session_id); + uuid7::uuid7().to_string() + }), + None => uuid7::uuid7().to_string(), + } +} diff --git a/server/src/ws/app_handler/methods/initialize_session.rs b/server/src/ws/app_handler/methods/initialize_session.rs index 4fc01120..b5599ccd 100644 --- a/server/src/ws/app_handler/methods/initialize_session.rs +++ b/server/src/ws/app_handler/methods/initialize_session.rs @@ -79,6 +79,7 @@ pub async fn initialize_session_connection( } }; + //// JS: Hubert said to leave this here let app_sessions_read = sessions_write .get(app_id) .expect("Session just created or updated; unwrap safe") @@ -88,6 +89,7 @@ pub async fn initialize_session_connection( let session = app_sessions_read .get(&session_id) .expect("Session just created or updated; unwrap safe"); + //// // Prepare the InitializeResponse let session_read = session.read().await; @@ -97,6 +99,7 @@ pub async fn initialize_session_connection( public_keys: session_read.client_state.connected_public_keys.clone(), response_id: init_data.response_id.clone(), metadata: session_read.client_state.metadata.clone(), + app_id: app_id.clone(), }); // Drop session read lock drop(session_read);