From e34e9655652fba4e629ce73bd311d5b3e2a60256 Mon Sep 17 00:00:00 2001 From: Devis Battisti Date: Fri, 20 Sep 2024 12:44:39 +0200 Subject: [PATCH 1/5] [CAI-156] Chatbot/session creation (#1141) * feat(chatbot): dynamodb infrastructure * feat(chatbot): dynamodb data attribute * fix(chatbot): use string type for map type on dynamodb terraform module * fix(chatbot): dynamodb terraform * feat(chatbot): dynamodb configuration * feat(chatbot): dynamodb table name * chore(chatbot): docker for local development * chore(chatbot): docker for local development * doc(chatbot): index creation readme * feat(chatbot): write to dynamodb * feat(chatbot): table name var * chore(chatbot): API improvements and refactor) * feat(chatbot): sessionId key in dynamodb * feat(chatbot): query by sessionId * feat(chatbot): session creation API * chore(chatbot): remove aws region var * fix(chatbot):default session * fix(chatbot): import * fix(chatbot): import * fix(chatbot): region_name for local development * fix(chatbot) queriedAt field default * feat(chatbot): session creation * chore(chatbot): table name lambda env var * chore(chatbot): table prefix var * chore(chatbot): table prefix var * chore: terraform format * fix(chatbot): table prefix * chore(chatbot): terraform fmt --------- Co-authored-by: christian-calabrese --- apps/chatbot/.env.example | 2 +- apps/chatbot/poetry.lock | 566 ++++++++++-------- apps/chatbot/pyproject.toml | 2 + apps/chatbot/src/app/main.py | 72 ++- .../src/modules/chatbot/dynamodb.tf | 25 +- .../src/modules/chatbot/lambda_chatbot.tf | 10 +- apps/infrastructure/src/variables.tf | 7 - 7 files changed, 410 insertions(+), 274 deletions(-) diff --git a/apps/chatbot/.env.example b/apps/chatbot/.env.example index 667d843e4..654f93e55 100644 --- a/apps/chatbot/.env.example +++ b/apps/chatbot/.env.example @@ -20,4 +20,4 @@ CHB_ENGINE_SIMILARITY_TOPK=... CHB_ENGINE_SIMILARITY_CUTOFF=... CHB_ENGINE_USE_ASYNC=... CHB_ENGINE_USE_STREAMING=... -CHB_QUERY_TABLE_NAME=chatbot-dev-queries +CHB_QUERY_TABLE_PREFIX=chatbot-local diff --git a/apps/chatbot/poetry.lock b/apps/chatbot/poetry.lock index 91236a098..2545940cf 100644 --- a/apps/chatbot/poetry.lock +++ b/apps/chatbot/poetry.lock @@ -855,6 +855,55 @@ mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pil test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] +[[package]] +name = "cryptography" +version = "43.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, + {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, + {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, + {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, + {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, + {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, + {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + [[package]] name = "cssselect" version = "1.2.0" @@ -1136,18 +1185,18 @@ files = [ [[package]] name = "filelock" -version = "3.16.0" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"}, - {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] @@ -1395,13 +1444,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.145.0" +version = "2.146.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google_api_python_client-2.145.0-py2.py3-none-any.whl", hash = "sha256:d74da1358f3f2d63daf3c6f26bd96d89652051183bc87cf10a56ceb2a70beb50"}, - {file = "google_api_python_client-2.145.0.tar.gz", hash = "sha256:8b84dde11aaccadc127e4846f5cd932331d804ea324e353131595e3f25376e97"}, + {file = "google_api_python_client-2.146.0-py2.py3-none-any.whl", hash = "sha256:b1e62c9889c5ef6022f11d30d7ef23dc55100300f0e8aaf8aa09e8e92540acad"}, + {file = "google_api_python_client-2.146.0.tar.gz", hash = "sha256:41f671be10fa077ee5143ee9f0903c14006d39dc644564f4e044ae96b380bf68"}, ] [package.dependencies] @@ -1827,13 +1876,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.24.7" +version = "0.25.0" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.7-py3-none-any.whl", hash = "sha256:a212c555324c8a7b1ffdd07266bb7e7d69ca71aa238d27b7842d65e9a26ac3e5"}, - {file = "huggingface_hub-0.24.7.tar.gz", hash = "sha256:0ad8fb756e2831da0ac0491175b960f341fe06ebcf80ed6f8728313f95fc0207"}, + {file = "huggingface_hub-0.25.0-py3-none-any.whl", hash = "sha256:e2f357b35d72d5012cfd127108c4e14abcd61ba4ebc90a5a374dc2456cb34e12"}, + {file = "huggingface_hub-0.25.0.tar.gz", hash = "sha256:fb5fbe6c12fcd99d187ec7db95db9110fb1a20505f23040a5449a717c1a0db4d"}, ] [package.dependencies] @@ -1875,15 +1924,18 @@ pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_ve [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-resources" version = "6.4.5" @@ -2245,13 +2297,13 @@ notebook = "*" [[package]] name = "jupyter-client" -version = "8.6.2" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, - {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -2647,21 +2699,21 @@ numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} [[package]] name = "langchain-community" -version = "0.2.16" +version = "0.2.17" description = "Community contributed LangChain integrations." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.2.16-py3-none-any.whl", hash = "sha256:115e1419c176091d4e00240cb5a38612a249e70f213516b6cacae61a8794a868"}, - {file = "langchain_community-0.2.16.tar.gz", hash = "sha256:ab416b793a7aed1fa46ebaffd29993296b02286a99819eabc43be2ea8e41ae78"}, + {file = "langchain_community-0.2.17-py3-none-any.whl", hash = "sha256:d07c31b641e425fb8c3e7148ad6a62e1b54a9adac6e1173021a7dd3148266063"}, + {file = "langchain_community-0.2.17.tar.gz", hash = "sha256:b0745c1fcf1bd532ed4388f90b47139d6a6c6ba48a87aa68aa32d4d6bb97259d"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" langchain = ">=0.2.16,<0.3.0" -langchain-core = ">=0.2.38,<0.3.0" -langsmith = ">=0.1.0,<0.2.0" +langchain-core = ">=0.2.39,<0.3.0" +langsmith = ">=0.1.112,<0.2.0" numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} PyYAML = ">=5.3" requests = ">=2,<3" @@ -2670,13 +2722,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.39" +version = "0.2.40" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.39-py3-none-any.whl", hash = "sha256:5a5ad4e1c02d13e7021c026b2c7965069ad71ef67b018274cd52bab56e39143e"}, - {file = "langchain_core-0.2.39.tar.gz", hash = "sha256:73d7b6f0b0212bc8069c3640d69e8d75faa51097784019ffa5c36c617c04acb0"}, + {file = "langchain_core-0.2.40-py3-none-any.whl", hash = "sha256:71fff5cafa4b9c82a3a716e985f071383be452c35d8cc3169b3a393e6857fc99"}, + {file = "langchain_core-0.2.40.tar.gz", hash = "sha256:c838ea0c0b73475a8e58ced3e306b6d926ef063721abd164f237c8664916f502"}, ] [package.dependencies] @@ -2737,13 +2789,13 @@ six = "*" [[package]] name = "langsmith" -version = "0.1.120" +version = "0.1.121" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.120-py3-none-any.whl", hash = "sha256:54d2785e301646c0988e0a69ebe4d976488c87b41928b358cb153b6ddd8db62b"}, - {file = "langsmith-0.1.120.tar.gz", hash = "sha256:25499ca187b41bd89d784b272b97a8d76f60e0e21bdf20336e8a2aa6a9b23ac9"}, + {file = "langsmith-0.1.121-py3-none-any.whl", hash = "sha256:fdb1ac8a671d3904201bfeea197d87bded46a10d08f1034af464211872e29893"}, + {file = "langsmith-0.1.121.tar.gz", hash = "sha256:e9381b82a5bd484af9a51c3e96faea572746b8d617b070c1cda40cbbe48e33df"}, ] [package.dependencies] @@ -2772,19 +2824,19 @@ pydantic = ">=1.10" [[package]] name = "llama-index" -version = "0.11.9" +version = "0.11.10" description = "Interface between LLMs and your data" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index-0.11.9-py3-none-any.whl", hash = "sha256:b406dd6c099299b01379f85f517fddffd1bfa89fb7c036e42d48415458cda783"}, - {file = "llama_index-0.11.9.tar.gz", hash = "sha256:ef6f433e0b8c439e85774383c0a86b34079e027e663dbd3b87b99d3da68287e9"}, + {file = "llama_index-0.11.10-py3-none-any.whl", hash = "sha256:5f5ef55e14c2f670a855abb4d24bf626333ef33dd630a90ec61c3b36635b2cf7"}, + {file = "llama_index-0.11.10.tar.gz", hash = "sha256:1733f23bfb5afcea97a594d356994d379e6fb0da4e85d5adcb49757559f113e6"}, ] [package.dependencies] llama-index-agent-openai = ">=0.3.1,<0.4.0" llama-index-cli = ">=0.3.1,<0.4.0" -llama-index-core = ">=0.11.9,<0.12.0" +llama-index-core = ">=0.11.10,<0.12.0" llama-index-embeddings-openai = ">=0.2.4,<0.3.0" llama-index-indices-managed-llama-cloud = ">=0.3.0" llama-index-legacy = ">=0.9.48,<0.10.0" @@ -2798,18 +2850,19 @@ nltk = ">3.8.1" [[package]] name = "llama-index-agent-openai" -version = "0.3.1" +version = "0.3.2" description = "llama-index agent openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_agent_openai-0.3.1-py3-none-any.whl", hash = "sha256:21886081ae74574d8cad1ec4886f2d4b082284b9364adb46fff87aba1a25e9b9"}, - {file = "llama_index_agent_openai-0.3.1.tar.gz", hash = "sha256:41c9aa5b7cebc5043adddb3442e3167e97971589466e36448e04e0a767f5b9aa"}, + {file = "llama_index_agent_openai-0.3.2-py3-none-any.whl", hash = "sha256:9e0ecae8f105dac2557282d8b5ca6a2795a8d2cbd5ff4996ddaef5eaa10afcc8"}, + {file = "llama_index_agent_openai-0.3.2.tar.gz", hash = "sha256:ffd6228e02714e0ea3bd71ca47dc948b3ccc04525937e91218267d19a22aec16"}, ] [package.dependencies] llama-index-core = ">=0.11.0,<0.12.0" llama-index-llms-openai = ">=0.2.0,<0.3.0" +llama-index-utils-openai = ">=0.1.0,<0.2.0" openai = ">=1.14.0" [[package]] @@ -2830,13 +2883,13 @@ llama-index-llms-openai = ">=0.2.0,<0.3.0" [[package]] name = "llama-index-core" -version = "0.11.9" +version = "0.11.10" description = "Interface between LLMs and your data" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_core-0.11.9-py3-none-any.whl", hash = "sha256:cd89742692d9662f4ad503724409ce9df69e2124fd89e580119f8716a42aad6c"}, - {file = "llama_index_core-0.11.9.tar.gz", hash = "sha256:aa11141161a0f40d22dae2d5fe08a3ead5ad209e0e1daf54f75643c816f3fd2d"}, + {file = "llama_index_core-0.11.10-py3-none-any.whl", hash = "sha256:2dddd7cb4ccee89fdbbddd62e5fe3c7ae7fc431130e0a0a7155daee052874191"}, + {file = "llama_index_core-0.11.10.tar.gz", hash = "sha256:9929b11cfb24a3581620466660ab11a6360fde8c2441caa3660e0127df65c1b9"}, ] [package.dependencies] @@ -2864,13 +2917,13 @@ wrapt = "*" [[package]] name = "llama-index-embeddings-bedrock" -version = "0.3.0" +version = "0.3.1" description = "llama-index embeddings bedrock integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_embeddings_bedrock-0.3.0-py3-none-any.whl", hash = "sha256:439bf5943f242d8e7dfca58d76e5e282ea93a600bfcd4910ab7d80caab1f5011"}, - {file = "llama_index_embeddings_bedrock-0.3.0.tar.gz", hash = "sha256:cee47a0b84cc27a84631c2b7568981c95be32d36e7b82e12a8ec75260764896a"}, + {file = "llama_index_embeddings_bedrock-0.3.1-py3-none-any.whl", hash = "sha256:5eff288f46fd5a37daa79f30e79845952f72147d8641ecb6e17642eb082a0262"}, + {file = "llama_index_embeddings_bedrock-0.3.1.tar.gz", hash = "sha256:f0bb2203a3b31ffac2a3cd81a47b46d4180904857bfdbb4c3b120a093adad024"}, ] [package.dependencies] @@ -2908,13 +2961,13 @@ llama-index-core = ">=0.11.0,<0.12.0" [[package]] name = "llama-index-embeddings-openai" -version = "0.2.4" +version = "0.2.5" description = "llama-index embeddings openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_embeddings_openai-0.2.4-py3-none-any.whl", hash = "sha256:2ddf8e6a911c1c058b6bcc94299806a987f837dfa7a3c4a1d7df62dac99c2c7b"}, - {file = "llama_index_embeddings_openai-0.2.4.tar.gz", hash = "sha256:09e25ffb946dd1f95df15017236de45781a838dce65498559d0753c72effe617"}, + {file = "llama_index_embeddings_openai-0.2.5-py3-none-any.whl", hash = "sha256:823c8311e556349ba19dda408a64a314fa3dafe0e5759709c54d33a0269aa6ba"}, + {file = "llama_index_embeddings_openai-0.2.5.tar.gz", hash = "sha256:0047dd71d747068645ed728c29312aa91b65bbe4c6142180034c64dfc5c6f6e8"}, ] [package.dependencies] @@ -2923,13 +2976,13 @@ openai = ">=1.1.0" [[package]] name = "llama-index-indices-managed-llama-cloud" -version = "0.3.0" +version = "0.3.1" description = "llama-index indices llama-cloud integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_indices_managed_llama_cloud-0.3.0-py3-none-any.whl", hash = "sha256:ee3df2bd877d716abb303f486b479b1caca6030b87b2e4756b93ef246827c8c4"}, - {file = "llama_index_indices_managed_llama_cloud-0.3.0.tar.gz", hash = "sha256:02a1d0b413fffb55022e7e84e05788ccb18cbdcf54cfec0466d84c565509fae6"}, + {file = "llama_index_indices_managed_llama_cloud-0.3.1-py3-none-any.whl", hash = "sha256:ba0089d42b1cc3f3d1e7155847e479e9370ab4ce1ff8f3dda920a113cd8b4721"}, + {file = "llama_index_indices_managed_llama_cloud-0.3.1.tar.gz", hash = "sha256:f627f102d15905f15618522b6ec28958cd86d7b9b379b9972daed89105342d1d"}, ] [package.dependencies] @@ -3008,13 +3061,13 @@ llama-index-llms-anthropic = ">=0.2.0,<0.3.0" [[package]] name = "llama-index-llms-bedrock-converse" -version = "0.3.0" +version = "0.3.1" description = "llama-index llms bedrock converse integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_llms_bedrock_converse-0.3.0-py3-none-any.whl", hash = "sha256:90fd59f53c80da05fd0ceaaea7f09823357a640bc86e584f26b41f2b1c991f55"}, - {file = "llama_index_llms_bedrock_converse-0.3.0.tar.gz", hash = "sha256:96cf34df9f5fed503f5cfafd6cf9bae53dd842724faa4c0ec784c4caaf04e827"}, + {file = "llama_index_llms_bedrock_converse-0.3.1-py3-none-any.whl", hash = "sha256:44391eeafa2188ddd9ddd545db78546f6ab3cdb241c072ea05fb4a26049a4e13"}, + {file = "llama_index_llms_bedrock_converse-0.3.1.tar.gz", hash = "sha256:4c61a034fe310b43ef0a9ecbce496d72ba8397fc0802b6710c05a2dfa1776f66"}, ] [package.dependencies] @@ -3024,13 +3077,13 @@ llama-index-core = ">=0.11.0,<0.12.0" [[package]] name = "llama-index-llms-gemini" -version = "0.3.4" +version = "0.3.5" description = "llama-index llms gemini integration" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_llms_gemini-0.3.4-py3-none-any.whl", hash = "sha256:b7bbb4c14761d88f26c89f9c1cec3f6e987e7ee751880d90f1ed427793e309d3"}, - {file = "llama_index_llms_gemini-0.3.4.tar.gz", hash = "sha256:a59c69394bdf7ef9de98422f3688165303a42cc83001936e286397d7d821e80e"}, + {file = "llama_index_llms_gemini-0.3.5-py3-none-any.whl", hash = "sha256:67c8aacc47a895547acc577f670d7dcfe6a5a9e24460c8d7f81bc62504a8ed64"}, + {file = "llama_index_llms_gemini-0.3.5.tar.gz", hash = "sha256:e6c62216845700263f4f47da8a664d265a8925dd894b627719c74423a8cc5685"}, ] [package.dependencies] @@ -3055,29 +3108,29 @@ llama-index-core = ">=0.11.0,<0.12.0" [[package]] name = "llama-index-llms-openai" -version = "0.2.5" +version = "0.2.8" description = "llama-index llms openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_llms_openai-0.2.5-py3-none-any.whl", hash = "sha256:27bdaf045dfd88cf807fdc16214db963b7b5bbf762f7acc0d5c2827a87608816"}, - {file = "llama_index_llms_openai-0.2.5.tar.gz", hash = "sha256:042b52427d5d5dc178e6e30dd90c24eeb1618f65ff73010eaa96fca168c831ef"}, + {file = "llama_index_llms_openai-0.2.8-py3-none-any.whl", hash = "sha256:a0dd54b88334cefe726a6c06c1db3c3c260b10e38d39e6a6818149b8564e2351"}, + {file = "llama_index_llms_openai-0.2.8.tar.gz", hash = "sha256:7af5d0900db70d4ada46d2959d03dabdd7a772119eb0ae92367b5ad48ca18fe1"}, ] [package.dependencies] -llama-index-agent-openai = ">=0.3.1,<0.4.0" llama-index-core = ">=0.11.7,<0.12.0" +llama-index-utils-openai = ">=0.1.0,<0.2.0" openai = ">=1.40.0,<2.0.0" [[package]] name = "llama-index-multi-modal-llms-openai" -version = "0.2.0" +version = "0.2.1" description = "llama-index multi-modal-llms openai integration" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "llama_index_multi_modal_llms_openai-0.2.0-py3-none-any.whl", hash = "sha256:b7eab7854861d5b390bab1376f5896c4813827ff67c7fe3b3eaaad1b5aecd7e3"}, - {file = "llama_index_multi_modal_llms_openai-0.2.0.tar.gz", hash = "sha256:81196b730374cc88d283f8794357d0bd66646b9a4daa5c09cf57619030b4696c"}, + {file = "llama_index_multi_modal_llms_openai-0.2.1-py3-none-any.whl", hash = "sha256:1c79e6af88d0838f258be412fa1c8bf7e5d9b2740e1bda6315bd3fa86876c7df"}, + {file = "llama_index_multi_modal_llms_openai-0.2.1.tar.gz", hash = "sha256:1b5be691d5fa2861fd4b5a071883dc94d82db3e1c7ff686d84dd84048a354c7b"}, ] [package.dependencies] @@ -3221,6 +3274,17 @@ files = [ llama-index-core = ">=0.11.0,<0.12.0" redis = ">=5.0.1,<6.0.0" +[[package]] +name = "llama-index-utils-openai" +version = "0.1.0" +description = "llama-index utils openai" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_utils_openai-0.1.0-py3-none-any.whl", hash = "sha256:ca6ff0d3afef0be365a10e8111e191260acca56958856bebaa0df15cd82de061"}, + {file = "llama_index_utils_openai-0.1.0.tar.gz", hash = "sha256:5bc9282c9f8d0de55bddd2ac98c7806acbe1993c6673c3b61c15d8e8e93c90b1"}, +] + [[package]] name = "llama-index-vector-stores-redis" version = "0.3.2" @@ -3988,13 +4052,13 @@ files = [ [[package]] name = "openai" -version = "1.45.0" +version = "1.46.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.45.0-py3-none-any.whl", hash = "sha256:2f1f7b7cf90f038a9f1c24f0d26c0f1790c102ec5acd07ffd70a9b7feac1ff4e"}, - {file = "openai-1.45.0.tar.gz", hash = "sha256:731207d10637335413aa3c0955f8f8df30d7636a4a0f9c381f2209d32cf8de97"}, + {file = "openai-1.46.0-py3-none-any.whl", hash = "sha256:8e423690b121d0268c7bb83b552e14f339b0ba250e1d0f70d145c194e79c4e1b"}, + {file = "openai-1.46.0.tar.gz", hash = "sha256:0c5a783530d7cd90e2370dbd52d9239d2d53dc7a0badf9ee1e2e23d3f148969b"}, ] [package.dependencies] @@ -4320,13 +4384,13 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.3.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617"}, - {file = "platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] @@ -4511,18 +4575,18 @@ files = [ [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, @@ -4534,100 +4598,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -4675,6 +4739,23 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyjwt" +version = "2.9.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "pyparsing" version = "3.1.4" @@ -4709,15 +4790,18 @@ image = ["Pillow (>=8.0.0)"] [[package]] name = "pyreadline3" -version = "3.4.3" +version = "3.5.3" description = "A python implementation of GNU readline." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pyreadline3-3.4.3-py3-none-any.whl", hash = "sha256:f832c5898f4f9a0f81d48a8c499b39d0179de1a465ea3def1a7e7231840b4ed6"}, - {file = "pyreadline3-3.4.3.tar.gz", hash = "sha256:ebab0baca37f50e2faa1dd99a6da1c75de60e0d68a3b229c134bbd12786250e2"}, + {file = "pyreadline3-3.5.3-py3-none-any.whl", hash = "sha256:ddede153a92e5aad9c1fe63d692efd6a3e478f686adcd4938a051ffb63ec4f52"}, + {file = "pyreadline3-3.5.3.tar.gz", hash = "sha256:9234684ca75a00a702fda42b17cc26ca665bc9d7c2da06af450468253099ff61"}, ] +[package.extras] +dev = ["build", "flake8", "mypy", "pytest", "twine"] + [[package]] name = "pysocks" version = "1.7.1" @@ -5381,29 +5465,29 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.6.4" +version = "0.6.5" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.4-py3-none-linux_armv6l.whl", hash = "sha256:c4b153fc152af51855458e79e835fb6b933032921756cec9af7d0ba2aa01a258"}, - {file = "ruff-0.6.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bedff9e4f004dad5f7f76a9d39c4ca98af526c9b1695068198b3bda8c085ef60"}, - {file = "ruff-0.6.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d02a4127a86de23002e694d7ff19f905c51e338c72d8e09b56bfb60e1681724f"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7862f42fc1a4aca1ea3ffe8a11f67819d183a5693b228f0bb3a531f5e40336fc"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eebe4ff1967c838a1a9618a5a59a3b0a00406f8d7eefee97c70411fefc353617"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:932063a03bac394866683e15710c25b8690ccdca1cf192b9a98260332ca93408"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:50e30b437cebef547bd5c3edf9ce81343e5dd7c737cb36ccb4fe83573f3d392e"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44536df7b93a587de690e124b89bd47306fddd59398a0fb12afd6133c7b3818"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ea086601b22dc5e7693a78f3fcfc460cceabfdf3bdc36dc898792aba48fbad6"}, - {file = "ruff-0.6.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b52387d3289ccd227b62102c24714ed75fbba0b16ecc69a923a37e3b5e0aaaa"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0308610470fcc82969082fc83c76c0d362f562e2f0cdab0586516f03a4e06ec6"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:803b96dea21795a6c9d5bfa9e96127cc9c31a1987802ca68f35e5c95aed3fc0d"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:66dbfea86b663baab8fcae56c59f190caba9398df1488164e2df53e216248baa"}, - {file = "ruff-0.6.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:34d5efad480193c046c86608dbba2bccdc1c5fd11950fb271f8086e0c763a5d1"}, - {file = "ruff-0.6.4-py3-none-win32.whl", hash = "sha256:f0f8968feea5ce3777c0d8365653d5e91c40c31a81d95824ba61d871a11b8523"}, - {file = "ruff-0.6.4-py3-none-win_amd64.whl", hash = "sha256:549daccee5227282289390b0222d0fbee0275d1db6d514550d65420053021a58"}, - {file = "ruff-0.6.4-py3-none-win_arm64.whl", hash = "sha256:ac4b75e898ed189b3708c9ab3fc70b79a433219e1e87193b4f2b77251d058d14"}, - {file = "ruff-0.6.4.tar.gz", hash = "sha256:ac3b5bfbee99973f80aa1b7cbd1c9cbce200883bdd067300c22a6cc1c7fba212"}, + {file = "ruff-0.6.5-py3-none-linux_armv6l.whl", hash = "sha256:7e4e308f16e07c95fc7753fc1aaac690a323b2bb9f4ec5e844a97bb7fbebd748"}, + {file = "ruff-0.6.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:932cd69eefe4daf8c7d92bd6689f7e8182571cb934ea720af218929da7bd7d69"}, + {file = "ruff-0.6.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a8d42d11fff8d3143ff4da41742a98f8f233bf8890e9fe23077826818f8d680"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a50af6e828ee692fb10ff2dfe53f05caecf077f4210fae9677e06a808275754f"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:794ada3400a0d0b89e3015f1a7e01f4c97320ac665b7bc3ade24b50b54cb2972"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:381413ec47f71ce1d1c614f7779d88886f406f1fd53d289c77e4e533dc6ea200"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:52e75a82bbc9b42e63c08d22ad0ac525117e72aee9729a069d7c4f235fc4d276"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09c72a833fd3551135ceddcba5ebdb68ff89225d30758027280968c9acdc7810"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:800c50371bdcb99b3c1551d5691e14d16d6f07063a518770254227f7f6e8c178"}, + {file = "ruff-0.6.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e25ddd9cd63ba1f3bd51c1f09903904a6adf8429df34f17d728a8fa11174253"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7291e64d7129f24d1b0c947ec3ec4c0076e958d1475c61202497c6aced35dd19"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9ad7dfbd138d09d9a7e6931e6a7e797651ce29becd688be8a0d4d5f8177b4b0c"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:005256d977021790cc52aa23d78f06bb5090dc0bfbd42de46d49c201533982ae"}, + {file = "ruff-0.6.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:482c1e6bfeb615eafc5899127b805d28e387bd87db38b2c0c41d271f5e58d8cc"}, + {file = "ruff-0.6.5-py3-none-win32.whl", hash = "sha256:cf4d3fa53644137f6a4a27a2b397381d16454a1566ae5335855c187fbf67e4f5"}, + {file = "ruff-0.6.5-py3-none-win_amd64.whl", hash = "sha256:3e42a57b58e3612051a636bc1ac4e6b838679530235520e8f095f7c44f706ff9"}, + {file = "ruff-0.6.5-py3-none-win_arm64.whl", hash = "sha256:51935067740773afdf97493ba9b8231279e9beef0f2a8079188c4776c25688e0"}, + {file = "ruff-0.6.5.tar.gz", hash = "sha256:4d32d87fab433c0cf285c3683dd4dae63be05fd7a1d65b3f5bf7cdd05a6b96fb"}, ] [[package]] @@ -5495,18 +5579,18 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "74.1.2" +version = "75.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, - {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] @@ -5593,60 +5677,60 @@ requests = "*" [[package]] name = "sqlalchemy" -version = "2.0.34" +version = "2.0.35" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea54f7300553af0a2a7235e9b85f4204e1fc21848f917a3213b0e0818de9a24"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:196958cde924a00488e3e83ff917be3b73cd4ed8352bbc0f2989333176d1c54d"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win32.whl", hash = "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win_amd64.whl", hash = "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win32.whl", hash = "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win_amd64.whl", hash = "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win32.whl", hash = "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win_amd64.whl", hash = "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60ed6ef0a35c6b76b7640fe452d0e47acc832ccbb8475de549a5cc5f90c2c06"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:25691f4adfb9d5e796fd48bf1432272f95f4bbe5f89c475a788f31232ea6afba"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win32.whl", hash = "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win_amd64.whl", hash = "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1e03db964e9d32f112bae36f0cc1dcd1988d096cfd75d6a588a3c3def9ab2b"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ae92bebca3b1e6bd203494e5ef919a60fb6dfe4d9a47ed2453211d3bd451b9f5"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win32.whl", hash = "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win_amd64.whl", hash = "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a17d8fac6df9835d8e2b4c5523666e7051d0897a93756518a1fe101c7f47f2f0"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e6965346fc1491a566e019a4a1d3dfc081ce7ac1a736536367ca305da6472a8"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win32.whl", hash = "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win_amd64.whl", hash = "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8"}, - {file = "SQLAlchemy-2.0.34-py3-none-any.whl", hash = "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f"}, - {file = "sqlalchemy-2.0.34.tar.gz", hash = "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, ] [package.dependencies] @@ -6134,13 +6218,13 @@ files = [ [[package]] name = "types-requests" -version = "2.32.0.20240907" +version = "2.32.0.20240914" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.32.0.20240907.tar.gz", hash = "sha256:ff33935f061b5e81ec87997e91050f7b4af4f82027a7a7a9d9aaea04a963fdf8"}, - {file = "types_requests-2.32.0.20240907-py3-none-any.whl", hash = "sha256:1d1e79faeaf9d42def77f3c304893dea17a97cae98168ac69f3cb465516ee8da"}, + {file = "types-requests-2.32.0.20240914.tar.gz", hash = "sha256:2850e178db3919d9bf809e434eef65ba49d0e7e33ac92d588f4a5e295fffd405"}, + {file = "types_requests-2.32.0.20240914-py3-none-any.whl", hash = "sha256:59c2f673eb55f32a99b2894faf6020e1a9f4a402ad0f192bfee0b64469054310"}, ] [package.dependencies] @@ -6738,4 +6822,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "04883741563ac89790a2b203facb811f39e289d932fc3f640d9764cd874ee0f9" +content-hash = "617f1a81dd2e2343fd2932964fde442fabc4c89f46322325c9b4ae965697eee7" diff --git a/apps/chatbot/pyproject.toml b/apps/chatbot/pyproject.toml index 291cbedce..973c63252 100644 --- a/apps/chatbot/pyproject.toml +++ b/apps/chatbot/pyproject.toml @@ -21,6 +21,8 @@ mangum = "0.17.0" uvicorn = "0.30.1" pyyaml = "^6.0.1" selenium = "^4.23.1" +pyjwt = "^2.9.0" +cryptography = "^43.0.1" llama-index = "^0.11.9" llama-index-cli = "^0.3.1" llama-index-core = "^0.11.9" diff --git a/apps/chatbot/src/app/main.py b/apps/chatbot/src/app/main.py index eb9323b31..8878171b6 100644 --- a/apps/chatbot/src/app/main.py +++ b/apps/chatbot/src/app/main.py @@ -6,9 +6,11 @@ import uuid import boto3 import datetime +import jwt +from typing import Annotated from boto3.dynamodb.conditions import Key from botocore.exceptions import BotoCoreError, ClientError -from fastapi import FastAPI, HTTPException +from fastapi import FastAPI, HTTPException, Header from starlette.middleware.cors import CORSMiddleware from pydantic import BaseModel @@ -16,9 +18,11 @@ params = yaml.safe_load(open("config/params.yaml", "r")) prompts = yaml.safe_load(open("config/prompts.yaml", "r")) +chatbot = Chatbot(params, prompts) AWS_DEFAULT_REGION = os.getenv('CHB_AWS_DEFAULT_REGION', os.getenv('AWS_DEFAULT_REGION', None)) + class Query(BaseModel): question: str queriedAt: str | None = None @@ -39,8 +43,12 @@ class Query(BaseModel): region_name=locals().get('region_name', None), ) -queries_table_name = f"{os.getenv('CHB_QUERY_TABLE_PREFIX', 'chatbot')}-queries" -chatbot_queries = dynamodb.Table(queries_table_name) +table_queries = dynamodb.Table( + f"{os.getenv('CHB_QUERY_TABLE_PREFIX', 'chatbot')}-queries" +) +table_sessions = dynamodb.Table( + f"{os.getenv('CHB_QUERY_TABLE_PREFIX', 'chatbot')}-sessions" +) app = FastAPI() app.add_middleware( @@ -56,19 +64,22 @@ async def healthz (): return {"message": "OK"} @app.post("/queries") -async def query_creation (query: Query): - chatbot = Chatbot(params, prompts) +async def query_creation ( + query: Query, + authorizationHeader: Annotated[str | None, Header()] = None +): + userId = current_user_id(authorizationHeader) + session = find_or_create_session(userId) answer = chatbot.generate(query.question) now = datetime.datetime.now(datetime.timezone.utc).isoformat() - # TODO: calculate sessionId if query.queriedAt is None: queriedAt = now body = { "id": f'{uuid.uuid4()}', - "sessionId": "1", + "sessionId": session['id'], "question": query.question, "answer": answer, "createdAt": now, @@ -76,22 +87,47 @@ async def query_creation (query: Query): } try: - chatbot_queries.put_item(Item = body) + table_queries.put_item(Item = body) except (BotoCoreError, ClientError) as e: - raise HTTPException(status_code=422, detail='db error') + raise HTTPException(status_code=422, detail=f"[POST /queries] error: {e}") return body -@app.post("/sessions") -async def sessions_creation (): - # TODO: dynamoDB integration - # TODO: get current user from cognito + +def current_user_id(authorizationHeader: str): + if authorizationHeader is None: + return None + else: + token = authorizationHeader.split(' ')[1] + decoded = jwt.decode( + token, + algorithms=["RS256"], + options={"verify_signature": False} + ) + return decoded['cognito:username'] + + +def find_or_create_session(userId: str): + # TODO: return if userId is None + if userId is None: + userId = '-' + now = datetime.datetime.now(datetime.timezone.utc).isoformat() + # TODO: calculate title + # TODO: find last session based on SESSION_MAX_DURATION_MINUTES + # TODO: if it's None, create it. body = { - "id": "", - "title": "", - "createdAt": "" + "id": '1',#f'{uuid.uuid4()}', + "title": "last session", + "userId": userId, + "createdAt": now } + try: + table_sessions.put_item(Item = body) + except (BotoCoreError, ClientError) as e: + raise HTTPException(status_code=422, detail=f"[find_or_create_session] body: {body}, error: {e}") + return body + @app.get("/queries/{id}") async def query_fetching(id: str): # TODO: dynamoDB integration @@ -126,11 +162,11 @@ async def queries_fetching(sessionId: str | None = None): # sessionId = lastSessionId(userId) sessionId = '1' try: - db_response = chatbot_queries.query( + db_response = table_queries.query( KeyConditionExpression=Key("sessionId").eq(sessionId) ) except (BotoCoreError, ClientError) as e: - raise HTTPException(status_code=422, detail='db error') + raise HTTPException(status_code=422, detail=f"[queries_fetching] error: {e}") return db_response['Items'] @app.patch("/queries/{id}") diff --git a/apps/infrastructure/src/modules/chatbot/dynamodb.tf b/apps/infrastructure/src/modules/chatbot/dynamodb.tf index 3648d74b7..50d0e63b3 100644 --- a/apps/infrastructure/src/modules/chatbot/dynamodb.tf +++ b/apps/infrastructure/src/modules/chatbot/dynamodb.tf @@ -1,5 +1,3 @@ -# Chatbot queries - module "dynamodb_chatbot_queries" { source = "git::github.com/terraform-aws-modules/terraform-aws-dynamodb-table.git?ref=715399dbe24f6443820bf5de80f6100b35d56355" # v4.0.0 @@ -22,3 +20,26 @@ module "dynamodb_chatbot_queries" { }, ] } + +module "dynamodb_chatbot_sessions" { + source = "git::github.com/terraform-aws-modules/terraform-aws-dynamodb-table.git?ref=715399dbe24f6443820bf5de80f6100b35d56355" # v4.0.0 + + billing_mode = "PAY_PER_REQUEST" + deletion_protection_enabled = false + + name = "${local.prefix}-sessions" + hash_key = "userId" + range_key = "id" + server_side_encryption_enabled = true + + attributes = [ + { + name = "id" + type = "S" + }, + { + name = "userId" + type = "S" + }, + ] +} diff --git a/apps/infrastructure/src/modules/chatbot/lambda_chatbot.tf b/apps/infrastructure/src/modules/chatbot/lambda_chatbot.tf index 4a546e087..ad18424cf 100644 --- a/apps/infrastructure/src/modules/chatbot/lambda_chatbot.tf +++ b/apps/infrastructure/src/modules/chatbot/lambda_chatbot.tf @@ -15,11 +15,11 @@ locals { # Be extremely careful when changing the provider # both the generation and the embedding models would be changed # embeddings size change would break the application and requires reindexing - CHB_PROVIDER = "aws" - CHB_MODEL_ID = "mistral.mistral-large-2402-v1:0" - CHB_EMBED_MODEL_ID = "cohere.embed-multilingual-v3" - CHB_GOOGLE_API_KEY = module.google_api_key_ssm_parameter.ssm_parameter_name - CHB_QUERY_TABLE_NAME = "${local.prefix}-queries" + CHB_PROVIDER = "aws" + CHB_MODEL_ID = "mistral.mistral-large-2402-v1:0" + CHB_EMBED_MODEL_ID = "cohere.embed-multilingual-v3" + CHB_GOOGLE_API_KEY = module.google_api_key_ssm_parameter.ssm_parameter_name + CHB_QUERY_TABLE_PREFIX = local.prefix } } diff --git a/apps/infrastructure/src/variables.tf b/apps/infrastructure/src/variables.tf index 2c9d2cd4d..d4951495f 100644 --- a/apps/infrastructure/src/variables.tf +++ b/apps/infrastructure/src/variables.tf @@ -118,10 +118,3 @@ variable "chatbot_ecs_redis" { port = 6379 } } - -variable "CHB_QUERY_TABLE_NAME" { - type = string - description = "dynamodb table name for queries" - default = "chatbot-dev-queries" -} - From f683aa5645090a7201169497abf50d1a211f6927 Mon Sep 17 00:00:00 2001 From: marcobottaro <39835990+marcobottaro@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:56:54 +0200 Subject: [PATCH 2/5] Fix Stats component layout in Solution's page (#1146) --- .changeset/ten-knives-worry.md | 5 +++++ apps/nextjs-website/src/components/atoms/Stats/Stats.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/ten-knives-worry.md diff --git a/.changeset/ten-knives-worry.md b/.changeset/ten-knives-worry.md new file mode 100644 index 000000000..84518feb0 --- /dev/null +++ b/.changeset/ten-knives-worry.md @@ -0,0 +1,5 @@ +--- +"nextjs-website": patch +--- + +Fix Stats component layout in Solution's page diff --git a/apps/nextjs-website/src/components/atoms/Stats/Stats.tsx b/apps/nextjs-website/src/components/atoms/Stats/Stats.tsx index 29a69ee00..2c609965d 100644 --- a/apps/nextjs-website/src/components/atoms/Stats/Stats.tsx +++ b/apps/nextjs-website/src/components/atoms/Stats/Stats.tsx @@ -42,7 +42,7 @@ const Stats = ({ > 2 ? 'space-between' : 'space-around'} alignItems={{ xs: 'center', sm: 'start' }} gap={4.2} width={'100%'} From 30fb0b0510103af3a829f88912f0e0ca570bd60d Mon Sep 17 00:00:00 2001 From: devportal-portalsandtools-github-bot Date: Fri, 20 Sep 2024 15:20:30 +0200 Subject: [PATCH 3/5] Update CHANGELOG and prepare next release (#1140) --- .changeset/breezy-seas-perform.md | 6 ------ .changeset/calm-sloths-jog.md | 5 ----- .changeset/eighty-dingos-move.md | 5 ----- .changeset/mighty-hairs-exist.md | 5 ----- .changeset/purple-garlics-wonder.md | 6 ------ .changeset/rude-forks-provide.md | 5 ----- .changeset/slimy-peas-lay.md | 5 ----- .changeset/ten-knives-worry.md | 5 ----- apps/chatbot/CHANGELOG.md | 6 ++++++ apps/chatbot/package.json | 2 +- apps/infrastructure/CHANGELOG.md | 6 ++++++ apps/infrastructure/package.json | 2 +- apps/nextjs-website/CHANGELOG.md | 14 ++++++++++++++ apps/nextjs-website/package.json | 2 +- apps/storybook-app/CHANGELOG.md | 6 ++++++ apps/storybook-app/package.json | 2 +- apps/strapi-cms/CHANGELOG.md | 6 ++++++ apps/strapi-cms/package.json | 2 +- package-lock.json | 10 +++++----- 19 files changed, 48 insertions(+), 52 deletions(-) delete mode 100644 .changeset/breezy-seas-perform.md delete mode 100644 .changeset/calm-sloths-jog.md delete mode 100644 .changeset/eighty-dingos-move.md delete mode 100644 .changeset/mighty-hairs-exist.md delete mode 100644 .changeset/purple-garlics-wonder.md delete mode 100644 .changeset/rude-forks-provide.md delete mode 100644 .changeset/slimy-peas-lay.md delete mode 100644 .changeset/ten-knives-worry.md diff --git a/.changeset/breezy-seas-perform.md b/.changeset/breezy-seas-perform.md deleted file mode 100644 index 59e078f70..000000000 --- a/.changeset/breezy-seas-perform.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"nextjs-website": minor -"storybook-app": minor ---- - -Add error alerts in chatbot chat diff --git a/.changeset/calm-sloths-jog.md b/.changeset/calm-sloths-jog.md deleted file mode 100644 index 4a69bc298..000000000 --- a/.changeset/calm-sloths-jog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"nextjs-website": patch ---- - -Change chatbot name, update chatbot first message and fix chatbot button size diff --git a/.changeset/eighty-dingos-move.md b/.changeset/eighty-dingos-move.md deleted file mode 100644 index 5f32f8a05..000000000 --- a/.changeset/eighty-dingos-move.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"nextjs-website": patch ---- - -Fix the label of the guide links on the overview page diff --git a/.changeset/mighty-hairs-exist.md b/.changeset/mighty-hairs-exist.md deleted file mode 100644 index bd2faea37..000000000 --- a/.changeset/mighty-hairs-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"strapi-cms": patch ---- - -Set default value to metaViewport field in Strapi's SEO component diff --git a/.changeset/purple-garlics-wonder.md b/.changeset/purple-garlics-wonder.md deleted file mode 100644 index 24edb4af1..000000000 --- a/.changeset/purple-garlics-wonder.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"infrastructure": minor -"chatbot": minor ---- - -Allowing the usage of Google Gemini generation and embedding models diff --git a/.changeset/rude-forks-provide.md b/.changeset/rude-forks-provide.md deleted file mode 100644 index 9ff069fc2..000000000 --- a/.changeset/rude-forks-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"nextjs-website": patch ---- - -Fix selectEmbedType method by adding 'design' option to Figma urls diff --git a/.changeset/slimy-peas-lay.md b/.changeset/slimy-peas-lay.md deleted file mode 100644 index 68c27bfcb..000000000 --- a/.changeset/slimy-peas-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"nextjs-website": patch ---- - -Fix guidesTitle's position in Overview's PostIntegration component diff --git a/.changeset/ten-knives-worry.md b/.changeset/ten-knives-worry.md deleted file mode 100644 index 84518feb0..000000000 --- a/.changeset/ten-knives-worry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"nextjs-website": patch ---- - -Fix Stats component layout in Solution's page diff --git a/apps/chatbot/CHANGELOG.md b/apps/chatbot/CHANGELOG.md index eca7c3bdb..02df7744f 100644 --- a/apps/chatbot/CHANGELOG.md +++ b/apps/chatbot/CHANGELOG.md @@ -1,5 +1,11 @@ # chatbot +## 2.4.0 + +### Minor Changes + +- d6f0518: Allowing the usage of Google Gemini generation and embedding models + ## 2.3.0 ### Minor Changes diff --git a/apps/chatbot/package.json b/apps/chatbot/package.json index 8c4244e4b..285855326 100644 --- a/apps/chatbot/package.json +++ b/apps/chatbot/package.json @@ -1,5 +1,5 @@ { "name": "chatbot", - "version": "2.3.0", + "version": "2.4.0", "private": true } \ No newline at end of file diff --git a/apps/infrastructure/CHANGELOG.md b/apps/infrastructure/CHANGELOG.md index 1a8807e66..50b8e7198 100644 --- a/apps/infrastructure/CHANGELOG.md +++ b/apps/infrastructure/CHANGELOG.md @@ -1,5 +1,11 @@ # infrastructure +## 1.1.0 + +### Minor Changes + +- d6f0518: Allowing the usage of Google Gemini generation and embedding models + ## 1.0.0 ### Major Changes diff --git a/apps/infrastructure/package.json b/apps/infrastructure/package.json index 9e643a276..29968ec49 100644 --- a/apps/infrastructure/package.json +++ b/apps/infrastructure/package.json @@ -1,5 +1,5 @@ { "name": "infrastructure", - "version": "1.0.0", + "version": "1.1.0", "private": true } diff --git a/apps/nextjs-website/CHANGELOG.md b/apps/nextjs-website/CHANGELOG.md index 7ade55940..86af4444f 100644 --- a/apps/nextjs-website/CHANGELOG.md +++ b/apps/nextjs-website/CHANGELOG.md @@ -1,5 +1,19 @@ # nextjs-website +## 4.8.0 + +### Minor Changes + +- 72c13cc: Add error alerts in chatbot chat + +### Patch Changes + +- d2b0c30: Change chatbot name, update chatbot first message and fix chatbot button size +- 617fef4: Fix the label of the guide links on the overview page +- bd9206d: Fix selectEmbedType method by adding 'design' option to Figma urls +- 3928519: Fix guidesTitle's position in Overview's PostIntegration component +- f683aa5: Fix Stats component layout in Solution's page + ## 4.7.0 ### Minor Changes diff --git a/apps/nextjs-website/package.json b/apps/nextjs-website/package.json index 7aab7ffdd..cf162e248 100644 --- a/apps/nextjs-website/package.json +++ b/apps/nextjs-website/package.json @@ -1,6 +1,6 @@ { "name": "nextjs-website", - "version": "4.7.0", + "version": "4.8.0", "private": true, "scripts": { "download-docs": "./scripts/fetch-docs.sh docs/from-gitbook", diff --git a/apps/storybook-app/CHANGELOG.md b/apps/storybook-app/CHANGELOG.md index 843da9c86..1d0ae23c7 100644 --- a/apps/storybook-app/CHANGELOG.md +++ b/apps/storybook-app/CHANGELOG.md @@ -1,5 +1,11 @@ # storybook-app +## 0.12.0 + +### Minor Changes + +- 72c13cc: Add error alerts in chatbot chat + ## 0.11.0 ### Minor Changes diff --git a/apps/storybook-app/package.json b/apps/storybook-app/package.json index cd1967c6d..134b55295 100644 --- a/apps/storybook-app/package.json +++ b/apps/storybook-app/package.json @@ -1,6 +1,6 @@ { "name": "storybook-app", - "version": "0.11.0", + "version": "0.12.0", "private": true, "scripts": { "storybook": "storybook dev -p 6006 --no-open", diff --git a/apps/strapi-cms/CHANGELOG.md b/apps/strapi-cms/CHANGELOG.md index 20549ecd8..d89798727 100644 --- a/apps/strapi-cms/CHANGELOG.md +++ b/apps/strapi-cms/CHANGELOG.md @@ -1,5 +1,11 @@ # strapi-cms +## 2.6.1 + +### Patch Changes + +- bae5f53: Set default value to metaViewport field in Strapi's SEO component + ## 2.6.0 ### Minor Changes diff --git a/apps/strapi-cms/package.json b/apps/strapi-cms/package.json index d59c612a0..b8421df3c 100644 --- a/apps/strapi-cms/package.json +++ b/apps/strapi-cms/package.json @@ -1,7 +1,7 @@ { "name": "strapi-cms", "private": true, - "version": "2.6.0", + "version": "2.6.1", "scripts": { "clean": "shx rm -rf dist/", "generate": "strapi ts:generate-types", diff --git a/package-lock.json b/package-lock.json index 839b0dadb..4cf1a0407 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ } }, "apps/chatbot": { - "version": "2.3.0" + "version": "2.4.0" }, "apps/cloudfront-functions": { "version": "0.0.2", @@ -58,10 +58,10 @@ } }, "apps/infrastructure": { - "version": "1.0.0" + "version": "1.1.0" }, "apps/nextjs-website": { - "version": "4.7.0", + "version": "4.8.0", "dependencies": { "@apidevtools/swagger-parser": "^10.1.0", "@aws-amplify/auth": "^5.6.6", @@ -201,7 +201,7 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "apps/storybook-app": { - "version": "0.11.0", + "version": "0.12.0", "devDependencies": { "@storybook/addon-essentials": "^7.6.17", "@storybook/addon-interactions": "^7.6.17", @@ -224,7 +224,7 @@ } }, "apps/strapi-cms": { - "version": "2.6.0", + "version": "2.6.1", "license": "MIT", "dependencies": { "@ckeditor/strapi-plugin-ckeditor": "^0.0.13", From c787b27beb1fdbcc3f8962e2c9bb50d270d05bae Mon Sep 17 00:00:00 2001 From: christian-calabrese Date: Mon, 23 Sep 2024 12:58:34 +0200 Subject: [PATCH 4/5] [DEV-1924] - Filtering only nextjs tags when moving to latest (#1147) * fix: filtering only nextjs tags * fix: comment --- .github/workflows/move_latest_tag.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/move_latest_tag.yaml b/.github/workflows/move_latest_tag.yaml index 67c4d472c..7bee4f6f8 100644 --- a/.github/workflows/move_latest_tag.yaml +++ b/.github/workflows/move_latest_tag.yaml @@ -3,7 +3,8 @@ name: Move Latest Tag to New Commit on: push: tags: - - '*' + # Trigger this workflow when a tag `nextjs-website@` is pushed. + - 'nextjs-website@[0-9]+.[0-9]+.[0-9]+' workflow_dispatch: jobs: move-latest-tag: From fda6c3d65d1fae52e9486a4d0fa55689034c281c Mon Sep 17 00:00:00 2001 From: tommaso1 Date: Tue, 24 Sep 2024 14:29:21 +0200 Subject: [PATCH 5/5] [DEV-1887] Add seo on all pages (#1119) * Refactor guides codec files * Fix guides test * Add changeset * Fix guideList test * Fix guideListPages codec * Refactor ApiDataList and ApiDataListPages codecs * Fix file name * Refactor Solutions, SolutionListPage and CaseHistories codecs * Refactor caseHistories test using fixtures * Refactor Overviews codec * Refactor Homepage codec * Refactor QuickStartGuides codec * Move QuickStartGuidesCodec.ts in codecs folder * Refactor webinars codec * Add makeProps folder * Add changeset * Refactor SEO codec * Fix StrapiEnv file name * Refactor solution detail codec and SolutionTemplateProps * Add changeset * Rename StrapiApiData type to StrapiApiDataList * Rename const strapiSolutionsList to strapiSolutionListPage * Fix after merge with main branch * all codecs update * codec update * product codecc * overview * guides * guides list * case histories * api data list pages * api data * webinar seo * tutorials * solutions * linter * quick start * overviews * api list * api detail page * guides, overviews, case histories * Update apps/nextjs-website/src/lib/strapi/codecs/ProductCodec.ts Co-authored-by: Marco Ponchia * Update apps/nextjs-website/src/lib/strapi/codecs/ProductCodec.ts Co-authored-by: Marco Ponchia * Update apps/nextjs-website/src/lib/strapi/__tests__/fixtures/product.ts Co-authored-by: Marco Ponchia * Update apps/nextjs-website/src/lib/strapi/__tests__/fixtures/solution.ts Co-authored-by: Marco Ponchia * Update apps/nextjs-website/src/lib/strapi/__tests__/solutions.test.ts Co-authored-by: Marco Ponchia * Fix build error * Fix codecs * update fetches fix populate for seo * Fix changesets --------- Co-authored-by: Marco Bottaro Co-authored-by: t Co-authored-by: Marco Ponchia Co-authored-by: Marco Ponchia Co-authored-by: marcobottaro <39835990+marcobottaro@users.noreply.github.com> --- .changeset/cool-toes-hope.md | 5 + apps/nextjs-website/src/_contents/makeDocs.ts | 2 + .../[productSlug]/api/[apiDataSlug]/page.tsx | 11 ++- .../src/app/[productSlug]/api/page.tsx | 9 +- .../guides/[...productGuidePage]/page.tsx | 10 +- .../src/app/[productSlug]/guides/page.tsx | 13 ++- .../src/app/[productSlug]/overview/page.tsx | 13 ++- .../app/[productSlug]/quick-start/page.tsx | 14 ++- .../[...productTutorialPage]/page.tsx | 12 ++- .../src/app/[productSlug]/tutorials/page.tsx | 13 ++- .../case-histories/[caseHistorySlug]/page.tsx | 9 +- .../src/app/solutions/[solutionSlug]/page.tsx | 9 +- .../src/app/webinars/[webinarSlug]/page.tsx | 9 +- .../ApiDataListTemplate.tsx | 2 + .../CaseHistoryPageTemplate.tsx | 2 + .../SolutionListTemplate.tsx | 2 + .../SolutionTemplate/SolutionTemplate.tsx | 2 + apps/nextjs-website/src/lib/api.ts | 1 + .../lib/strapi/__tests__/apiDataList.test.ts | 3 + .../strapi/__tests__/apiDataListPages.test.ts | 4 + .../strapi/__tests__/caseHistories.test.ts | 1 + .../lib/strapi/__tests__/fixtures/apiData.ts | 2 + .../lib/strapi/__tests__/fixtures/solution.ts | 2 + .../strapi/__tests__/guideListPages.test.ts | 2 + .../src/lib/strapi/__tests__/guides.test.ts | 1 + .../src/lib/strapi/__tests__/homepage.test.ts | 2 + .../lib/strapi/__tests__/overviews.test.ts | 5 + .../strapi/__tests__/quickStartGuides.test.ts | 3 + .../strapi/__tests__/solutionListPage.test.ts | 1 + .../lib/strapi/__tests__/solutions.test.ts | 2 + .../lib/strapi/__tests__/tutorialList.test.ts | 1 + .../lib/strapi/__tests__/tutorials.test.ts | 94 ++++++++++--------- .../src/lib/strapi/__tests__/webinars.test.ts | 2 + .../src/lib/strapi/codecs/ApiDataListCodec.ts | 2 + .../strapi/codecs/ApiDataListPagesCodec.ts | 2 + .../lib/strapi/codecs/CaseHistoriesCodec.ts | 39 +++++--- .../codecs/CaseHistoriesComponentCodec.ts | 4 +- .../lib/strapi/codecs/GuideListPagesCodec.ts | 3 + .../src/lib/strapi/codecs/GuidesCodec.ts | 3 + .../src/lib/strapi/codecs/OverviewsCodec.ts | 2 + .../strapi/codecs/QuickStartGuidesCodec.ts | 3 + .../strapi/codecs/SolutionListPageCodec.ts | 6 +- .../src/lib/strapi/codecs/SolutionsCodec.ts | 15 ++- .../src/lib/strapi/codecs/TutorialCodec.ts | 6 +- .../strapi/codecs/TutorialListPagesCodec.ts | 3 + .../src/lib/strapi/codecs/WebinarsCodec.ts | 8 +- .../lib/strapi/fetches/fetchApiDataList.ts | 3 + .../strapi/fetches/fetchApiDataListPages.ts | 6 ++ .../lib/strapi/fetches/fetchCaseHistories.ts | 3 + .../lib/strapi/fetches/fetchGuideListPages.ts | 7 +- .../src/lib/strapi/fetches/fetchHomepage.ts | 8 +- .../src/lib/strapi/fetches/fetchOverviews.ts | 3 + .../strapi/fetches/fetchQuickStartGuides.ts | 3 + .../strapi/fetches/fetchSolutionListPage.ts | 21 +---- .../src/lib/strapi/fetches/fetchSolutions.ts | 12 +-- .../strapi/fetches/fetchTutorialListPages.ts | 3 + .../src/lib/strapi/fetches/fetchTutorials.ts | 7 +- .../src/lib/strapi/fetches/fetchWebinars.ts | 3 + .../lib/strapi/makeProps/makeApiDataList.ts | 1 + .../strapi/makeProps/makeApiDataListPages.ts | 1 + .../lib/strapi/makeProps/makeCaseHistories.ts | 1 + .../strapi/makeProps/makeGuideListPages.ts | 1 + .../src/lib/strapi/makeProps/makeGuides.ts | 1 + .../src/lib/strapi/makeProps/makeOverviews.ts | 1 + .../strapi/makeProps/makeQuickStartGuides.ts | 1 + .../strapi/makeProps/makeSolutionListPage.ts | 1 + .../src/lib/strapi/makeProps/makeSolutions.ts | 1 + .../strapi/makeProps/makeTutorialListPages.ts | 1 + .../src/lib/strapi/makeProps/makeTutorials.ts | 1 + .../src/lib/strapi/makeProps/makeWebinars.ts | 1 + .../nextjs-website/src/lib/types/guideData.ts | 2 + .../src/lib/types/tutorialData.ts | 2 + apps/nextjs-website/src/lib/types/webinar.ts | 2 + 73 files changed, 339 insertions(+), 117 deletions(-) create mode 100644 .changeset/cool-toes-hope.md diff --git a/.changeset/cool-toes-hope.md b/.changeset/cool-toes-hope.md new file mode 100644 index 000000000..5d651a8e1 --- /dev/null +++ b/.changeset/cool-toes-hope.md @@ -0,0 +1,5 @@ +--- +"nextjs-website": minor +--- + +Add SEO to codecs and generate metadata in pages diff --git a/apps/nextjs-website/src/_contents/makeDocs.ts b/apps/nextjs-website/src/_contents/makeDocs.ts index 2714b95d6..2e7284964 100644 --- a/apps/nextjs-website/src/_contents/makeDocs.ts +++ b/apps/nextjs-website/src/_contents/makeDocs.ts @@ -6,6 +6,7 @@ import { Product } from '@/lib/types/product'; import { parseDoc } from 'gitbook-docs/parseDoc'; import { BannerLinkProps } from '@/components/atoms/BannerLink/BannerLink'; import { SolutionTemplateProps } from '@/components/templates/SolutionTemplate/SolutionTemplate'; +import { SEO } from '@/lib/types/seo'; export type TutorialsDefinition = { readonly product: Product; @@ -25,6 +26,7 @@ export type GuideDefinition = { readonly dirName: string; }>; readonly bannerLinks: readonly BannerLinkProps[]; + readonly seo?: SEO; }; const parseDocOrThrow = flow( diff --git a/apps/nextjs-website/src/app/[productSlug]/api/[apiDataSlug]/page.tsx b/apps/nextjs-website/src/app/[productSlug]/api/[apiDataSlug]/page.tsx index 747d6d4a1..7248ad833 100644 --- a/apps/nextjs-website/src/app/[productSlug]/api/[apiDataSlug]/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/api/[apiDataSlug]/page.tsx @@ -5,9 +5,13 @@ import ProductLayout, { import { Product } from '@/lib/types/product'; import ApiSection from '@/components/molecules/ApiSection/ApiSection'; import { Metadata, ResolvingMetadata } from 'next'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import { ApiDataParams } from '@/lib/types/apiDataParams'; import PageNotFound from '@/app/not-found'; +import { SEO } from '@/lib/types/seo'; export type ApiPageProps = { readonly product?: Product; @@ -18,6 +22,7 @@ export type ApiPageProps = { url: string; hideTryIt?: boolean; }[]; + readonly seo?: SEO; } & ProductLayoutProps; export async function generateStaticParams() { @@ -31,6 +36,10 @@ export const generateMetadata = async ( const resolvedParent = await parent; const ApiDataProps = await getApiData(params.apiDataSlug); + if (ApiDataProps?.seo) { + return makeMetadataFromStrapi(ApiDataProps.seo); + } + return makeMetadata({ title: ApiDataProps?.specURLsName, description: ApiDataProps?.product?.description, diff --git a/apps/nextjs-website/src/app/[productSlug]/api/page.tsx b/apps/nextjs-website/src/app/[productSlug]/api/page.tsx index 463e0ebea..a7ca7a263 100644 --- a/apps/nextjs-website/src/app/[productSlug]/api/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/api/page.tsx @@ -1,7 +1,10 @@ import ProductLayout from '@/components/organisms/ProductLayout/ProductLayout'; import ApiDataListTemplate from '@/components/templates/ApiDataListTemplate/ApiDataListTemplate'; import { baseUrl } from '@/config'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import { getApiDataListPages, getProduct, getProductsSlugs } from '@/lib/api'; import { Metadata } from 'next'; @@ -22,6 +25,10 @@ export async function generateMetadata({ }): Promise { const apiDataListPage = await getApiDataListPages(params?.productSlug); + if (apiDataListPage?.seo) { + return makeMetadataFromStrapi(apiDataListPage.seo); + } + return makeMetadata({ title: apiDataListPage?.hero.title, url: `${baseUrl}/${apiDataListPage?.product.slug}/api`, diff --git a/apps/nextjs-website/src/app/[productSlug]/guides/[...productGuidePage]/page.tsx b/apps/nextjs-website/src/app/[productSlug]/guides/[...productGuidePage]/page.tsx index e73893d06..8f8a9d6ef 100644 --- a/apps/nextjs-website/src/app/[productSlug]/guides/[...productGuidePage]/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/guides/[...productGuidePage]/page.tsx @@ -11,7 +11,10 @@ import { } from '@/_contents/products'; import { ParseContentConfig } from 'gitbook-docs/parseContent'; import { Metadata } from 'next'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import GitBookTemplate from '@/components/templates/GitBookTemplate/GitBookTemplate'; import { productPageToBreadcrumbs } from '@/helpers/breadcrumbs.helpers'; import { getGuidesProps } from '@/lib/cmsApi'; @@ -54,8 +57,13 @@ export async function generateMetadata({ }): Promise { const { page: { path, title }, + seo, } = await getGuide(params?.productSlug, params?.productGuidePage ?? ['']); + if (seo) { + return makeMetadataFromStrapi(seo); + } + return makeMetadata({ title, url: path, diff --git a/apps/nextjs-website/src/app/[productSlug]/guides/page.tsx b/apps/nextjs-website/src/app/[productSlug]/guides/page.tsx index e70f0c91e..95ba0d116 100644 --- a/apps/nextjs-website/src/app/[productSlug]/guides/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/guides/page.tsx @@ -11,9 +11,13 @@ import ProductLayout, { } from '@/components/organisms/ProductLayout/ProductLayout'; import { ProductParams } from '@/lib/types/productParams'; import { Metadata, ResolvingMetadata } from 'next'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import { BannerLinkProps } from '@/components/atoms/BannerLink/BannerLink'; import { getGuideListPagesProps } from '@/lib/cmsApi'; +import { SEO } from '@/lib/types/seo'; export async function generateStaticParams() { return (await getGuideListPagesProps()).map(({ product }) => ({ @@ -29,6 +33,7 @@ export type GuidesPageProps = { }; readonly guidesSections?: GuidesSectionProps[]; readonly bannerLinks?: readonly BannerLinkProps[]; + readonly seo?: SEO; } & ProductLayoutProps; export const generateMetadata = async ( @@ -36,7 +41,11 @@ export const generateMetadata = async ( parent: ResolvingMetadata ): Promise => { const resolvedParent = await parent; - const { path, abstract } = await getGuideLists(params?.productSlug); + const { path, abstract, seo } = await getGuideLists(params?.productSlug); + + if (seo) { + return makeMetadataFromStrapi(seo); + } return makeMetadata({ title: abstract?.title, diff --git a/apps/nextjs-website/src/app/[productSlug]/overview/page.tsx b/apps/nextjs-website/src/app/[productSlug]/overview/page.tsx index f8731612f..dbde14983 100644 --- a/apps/nextjs-website/src/app/[productSlug]/overview/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/overview/page.tsx @@ -15,8 +15,12 @@ import { FeatureItem } from '@/editorialComponents/Feature/FeatureStackItem'; import { GuideCardProps } from '@/components/molecules/GuideCard/GuideCard'; import PostIntegration from '@/components/organisms/PostIntegration/PostIntegration'; import { ProductParams } from '@/lib/types/productParams'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import { getOverviewsProps } from '@/lib/cmsApi'; +import { SEO } from '@/lib/types/seo'; const MAX_NUM_TUTORIALS_IN_OVERVIEW = 3; @@ -87,6 +91,7 @@ export type OverviewPageProps = { href: string; }[]; }; + readonly seo?: SEO; } & ProductLayoutProps; export async function generateMetadata( @@ -94,7 +99,11 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const resolvedParent = await parent; - const { product, path } = await getOverview(params.productSlug); + const { product, path, seo } = await getOverview(params.productSlug); + + if (seo) { + return makeMetadataFromStrapi(seo); + } return makeMetadata({ parent: resolvedParent, diff --git a/apps/nextjs-website/src/app/[productSlug]/quick-start/page.tsx b/apps/nextjs-website/src/app/[productSlug]/quick-start/page.tsx index e7c6780e2..6c3ac82a0 100644 --- a/apps/nextjs-website/src/app/[productSlug]/quick-start/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/quick-start/page.tsx @@ -9,8 +9,11 @@ import QuickStartGuideStepper from '@/components/molecules/QuickStartGuideSteppe import { Step } from '@/lib/types/step'; import { ProductParams } from '@/lib/types/productParams'; import { Metadata, ResolvingMetadata } from 'next'; -import { makeMetadata } from '@/helpers/metadata.helpers'; -import { Box, Divider } from '@mui/material'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; +import { SEO } from '@/lib/types/seo'; export async function generateStaticParams() { return [...getProductsSlugs('quickStart')].map((productSlug) => ({ @@ -25,6 +28,7 @@ export type QuickStartGuidePageProps = { }; readonly defaultStepAnchor?: string; readonly steps?: ReadonlyArray; + readonly seo?: SEO; } & ProductLayoutProps; export async function generateMetadata( @@ -32,10 +36,14 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const resolvedParent = await parent; - const { abstract, path, product } = await getQuickStartGuide( + const { abstract, path, product, seo } = await getQuickStartGuide( params?.productSlug ); + if (seo) { + return makeMetadataFromStrapi(seo); + } + return makeMetadata({ parent: resolvedParent, title: abstract?.title, diff --git a/apps/nextjs-website/src/app/[productSlug]/tutorials/[...productTutorialPage]/page.tsx b/apps/nextjs-website/src/app/[productSlug]/tutorials/[...productTutorialPage]/page.tsx index 9ddabc012..e343ef30a 100644 --- a/apps/nextjs-website/src/app/[productSlug]/tutorials/[...productTutorialPage]/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/tutorials/[...productTutorialPage]/page.tsx @@ -16,7 +16,10 @@ import { } from '@/_contents/products'; import { ParseContentConfig } from 'gitbook-docs/parseContent'; import { Metadata } from 'next'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import GuideInPageMenu from '@/components/organisms/GuideInPageMenu/GuideInPageMenu'; import { translations } from '@/_contents/translations'; import RelatedLinks, { @@ -60,7 +63,12 @@ export async function generateMetadata({ tutorialPath, ]); if (strapiTutorialProps) { - const { title, path } = strapiTutorialProps; + const { title, path, seo } = strapiTutorialProps; + + if (seo) { + return makeMetadataFromStrapi(seo); + } + return makeMetadata({ title, url: path, diff --git a/apps/nextjs-website/src/app/[productSlug]/tutorials/page.tsx b/apps/nextjs-website/src/app/[productSlug]/tutorials/page.tsx index d2d9ae7ab..658bb8a62 100644 --- a/apps/nextjs-website/src/app/[productSlug]/tutorials/page.tsx +++ b/apps/nextjs-website/src/app/[productSlug]/tutorials/page.tsx @@ -11,7 +11,11 @@ import Newsroom from '@/editorialComponents/Newsroom/Newsroom'; import React from 'react'; import { translations } from '@/_contents/translations'; import { ProductParams } from '@/lib/types/productParams'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; +import { SEO } from '@/lib/types/seo'; export async function generateStaticParams() { return [...getProductsSlugs('tutorials')].map((productSlug) => ({ @@ -26,6 +30,7 @@ export type TutorialsPageProps = { readonly description: string; }; readonly tutorials: readonly Tutorial[]; + readonly seo?: SEO; } & ProductLayoutProps; export async function generateMetadata( @@ -33,10 +38,14 @@ export async function generateMetadata( parent: ResolvingMetadata ): Promise { const resolvedParent = await parent; - const { product, abstract, path } = await getTutorialListPageProps( + const { product, abstract, path, seo } = await getTutorialListPageProps( params.productSlug ); + if (seo) { + return makeMetadataFromStrapi(seo); + } + return makeMetadata({ parent: resolvedParent, title: product.name, diff --git a/apps/nextjs-website/src/app/case-histories/[caseHistorySlug]/page.tsx b/apps/nextjs-website/src/app/case-histories/[caseHistorySlug]/page.tsx index f4a43e7f4..628d93171 100644 --- a/apps/nextjs-website/src/app/case-histories/[caseHistorySlug]/page.tsx +++ b/apps/nextjs-website/src/app/case-histories/[caseHistorySlug]/page.tsx @@ -1,4 +1,7 @@ -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import { Metadata } from 'next'; import { baseUrl } from '@/config'; import { getCaseHistoriesProps } from '@/lib/cmsApi'; @@ -23,6 +26,10 @@ export async function generateMetadata({ }): Promise { const caseHistory = await getCaseHistory(params?.caseHistorySlug); + if (caseHistory?.seo) { + return makeMetadataFromStrapi(caseHistory.seo); + } + return makeMetadata({ title: caseHistory.title, url: `${baseUrl}/case-histories/${caseHistory.slug}`, diff --git a/apps/nextjs-website/src/app/solutions/[solutionSlug]/page.tsx b/apps/nextjs-website/src/app/solutions/[solutionSlug]/page.tsx index 5013ab31e..252b38bcc 100644 --- a/apps/nextjs-website/src/app/solutions/[solutionSlug]/page.tsx +++ b/apps/nextjs-website/src/app/solutions/[solutionSlug]/page.tsx @@ -1,4 +1,7 @@ -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import { Metadata } from 'next'; import { baseUrl } from '@/config'; import { getSolution } from '@/lib/api'; @@ -23,6 +26,10 @@ export async function generateMetadata({ }): Promise { const solution = await getSolution(params?.solutionSlug); + if (solution.seo) { + return makeMetadataFromStrapi(solution.seo); + } + return makeMetadata({ title: solution.title, url: `${baseUrl}/solutions/${solution.slug}`, diff --git a/apps/nextjs-website/src/app/webinars/[webinarSlug]/page.tsx b/apps/nextjs-website/src/app/webinars/[webinarSlug]/page.tsx index 4c2668101..7f0647889 100644 --- a/apps/nextjs-website/src/app/webinars/[webinarSlug]/page.tsx +++ b/apps/nextjs-website/src/app/webinars/[webinarSlug]/page.tsx @@ -1,7 +1,10 @@ import { getWebinar } from '@/lib/api'; import dynamic from 'next/dynamic'; import Spinner from '@/components/atoms/Spinner/Spinner'; -import { makeMetadata } from '@/helpers/metadata.helpers'; +import { + makeMetadata, + makeMetadataFromStrapi, +} from '@/helpers/metadata.helpers'; import { Metadata } from 'next'; import { baseUrl } from '@/config'; import { getWebinarsProps } from '@/lib/cmsApi'; @@ -24,6 +27,10 @@ export async function generateMetadata({ }): Promise { const webinar = await getWebinar(params?.webinarSlug); + if (webinar.seo) { + return makeMetadataFromStrapi(webinar.seo); + } + return makeMetadata({ title: webinar.title, url: `${baseUrl}/webinars/${webinar.slug}`, diff --git a/apps/nextjs-website/src/components/templates/ApiDataListTemplate/ApiDataListTemplate.tsx b/apps/nextjs-website/src/components/templates/ApiDataListTemplate/ApiDataListTemplate.tsx index 440029cd1..a78da1820 100644 --- a/apps/nextjs-website/src/components/templates/ApiDataListTemplate/ApiDataListTemplate.tsx +++ b/apps/nextjs-website/src/components/templates/ApiDataListTemplate/ApiDataListTemplate.tsx @@ -7,6 +7,7 @@ import { BannerLinkProps } from '@/components/atoms/BannerLink/BannerLink'; import BannerLinks from '@/components/molecules/BannerLinks/BannerLinks'; import { StrapiApiDataList } from '@/lib/strapi/codecs/ApiDataListCodec'; import { useTranslations } from 'next-intl'; +import { SEO } from '@/lib/types/seo'; export type ApiDataListTemplateProps = { readonly hero: { @@ -31,6 +32,7 @@ export type ApiDataListTemplateProps = { readonly bannerLinks: BannerLinkProps[]; readonly theme?: Theme; readonly apiData: StrapiApiDataList; + readonly seo?: SEO; }; const ApiDataListTemplate = ({ diff --git a/apps/nextjs-website/src/components/templates/CaseHistoryTemplate/CaseHistoryPageTemplate.tsx b/apps/nextjs-website/src/components/templates/CaseHistoryTemplate/CaseHistoryPageTemplate.tsx index d72077cf2..46b44a675 100644 --- a/apps/nextjs-website/src/components/templates/CaseHistoryTemplate/CaseHistoryPageTemplate.tsx +++ b/apps/nextjs-website/src/components/templates/CaseHistoryTemplate/CaseHistoryPageTemplate.tsx @@ -10,6 +10,7 @@ import { pageToBreadcrumbs } from '@/helpers/breadcrumbs.helpers'; import { Box, Typography, useTheme } from '@mui/material'; import EContainer from '@/editorialComponents/EContainer/EContainer'; import { Media } from '@/lib/strapi/codecs/MediaCodec'; +import { SEO } from '@/lib/types/seo'; export type CaseHistoryPageTemplateProps = { slug: string; @@ -18,6 +19,7 @@ export type CaseHistoryPageTemplateProps = { description?: string; products: Pick[]; parts: Part[]; + seo?: SEO; }; const CaseHistoryPageTemplate = ({ diff --git a/apps/nextjs-website/src/components/templates/SolutionListTemplate/SolutionListTemplate.tsx b/apps/nextjs-website/src/components/templates/SolutionListTemplate/SolutionListTemplate.tsx index 4737e2f9b..884635728 100644 --- a/apps/nextjs-website/src/components/templates/SolutionListTemplate/SolutionListTemplate.tsx +++ b/apps/nextjs-website/src/components/templates/SolutionListTemplate/SolutionListTemplate.tsx @@ -5,6 +5,7 @@ import Feature from '@/editorialComponents/Feature/Feature'; import { FeatureItem } from '@/editorialComponents/Feature/FeatureStackItem'; import Hero from '@/editorialComponents/Hero/Hero'; import { Media } from '@/lib/strapi/codecs/MediaCodec'; +import { SEO } from '@/lib/types/seo'; import { useTranslations } from 'next-intl'; export type SolutionListTemplateProps = { @@ -39,6 +40,7 @@ export type SolutionListTemplateProps = { }; }[]; }; + seo?: SEO; }; const SolutionListTemplate = ({ diff --git a/apps/nextjs-website/src/components/templates/SolutionTemplate/SolutionTemplate.tsx b/apps/nextjs-website/src/components/templates/SolutionTemplate/SolutionTemplate.tsx index 0bd123a47..85ea378c1 100644 --- a/apps/nextjs-website/src/components/templates/SolutionTemplate/SolutionTemplate.tsx +++ b/apps/nextjs-website/src/components/templates/SolutionTemplate/SolutionTemplate.tsx @@ -16,6 +16,7 @@ import EContainer from '@/editorialComponents/EContainer/EContainer'; import { BlocksContent } from '@strapi/blocks-react-renderer'; import { Media } from '@/lib/strapi/codecs/MediaCodec'; import NewsShowcase from '@/components/organisms/NewsShowcase/NewsShowcase'; +import { SEO } from '@/lib/types/seo'; export type SolutionTemplateProps = { slug: string; @@ -54,6 +55,7 @@ export type SolutionTemplateProps = { }; solutionSlug: string; path?: string; + seo?: SEO; }; const SolutionTemplate = ({ diff --git a/apps/nextjs-website/src/lib/api.ts b/apps/nextjs-website/src/lib/api.ts index 5f95c8df9..6702eade8 100644 --- a/apps/nextjs-website/src/lib/api.ts +++ b/apps/nextjs-website/src/lib/api.ts @@ -165,6 +165,7 @@ export async function getTutorialListPageProps(productSlug?: string) { const props = tutorialListPages.find(({ product }) => product.slug === productSlug) || null; + return manageUndefinedAndAddProducts(props); } diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/apiDataList.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/apiDataList.test.ts index 43c17d4a6..3de6aece5 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/apiDataList.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/apiDataList.test.ts @@ -7,6 +7,7 @@ const makeStrapiResponseJson = () => ({ { id: 14, attributes: { + seo: null, title: 'Gestione flussi di Rendicontazione', description: 'API ad uso dei PSP ed EC per l’upload e il Download dei Flussi di Rendicontazione sul Nodo dei Pagamenti. ', @@ -39,6 +40,7 @@ const makeStrapiResponseJson = () => ({ { id: 2, attributes: { + seo: null, title: 'Firma con IO Main', description: null, createdAt: '2024-07-11T17:14:58.618Z', @@ -64,6 +66,7 @@ const makeStrapiResponseJson = () => ({ { id: 7, attributes: { + seo: null, title: 'Documentazione SOAP', description: 'Consulta tutti gli schemi XSD e WSDL che seguono le diverse release SANP', diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/apiDataListPages.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/apiDataListPages.test.ts index 069692f1d..ce90f8b71 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/apiDataListPages.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/apiDataListPages.test.ts @@ -23,6 +23,7 @@ const makeStrapiResponseJson = () => ({ }, product: productJson, bannerLinks: [], + seo: null, }, }, { @@ -39,6 +40,7 @@ const makeStrapiResponseJson = () => ({ }, product: productJson, bannerLinks: [], + seo: null, }, }, { @@ -107,6 +109,7 @@ const makeStrapiResponseJson = () => ({ icon: mediaVectorJson, }, ], + seo: null, }, }, { @@ -123,6 +126,7 @@ const makeStrapiResponseJson = () => ({ }, product: productJson, bannerLinks: [], + seo: null, }, }, ], diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/caseHistories.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/caseHistories.test.ts index 5045da263..75c0518f3 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/caseHistories.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/caseHistories.test.ts @@ -20,6 +20,7 @@ export const baseCaseHistoryJson = { data: null, }, parts: [], + seo: null, }, }; diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/apiData.ts b/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/apiData.ts index 5aa7bb128..cee568ab6 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/apiData.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/apiData.ts @@ -3,6 +3,7 @@ import { mediaVectorJson } from '@/lib/strapi/__tests__/fixtures/media'; export const apiDataRestJson = { id: 3, attributes: { + seo: null, title: 'SEND Main', description: null, createdAt: '2024-07-11T17:16:21.322Z', @@ -29,6 +30,7 @@ export const apiDataRestJson = { export const apiDataSoapJson = { id: 7, attributes: { + seo: null, title: 'Documentazione SOAP', description: 'Consulta tutti gli schemi XSD e WSDL che seguono le diverse release SANP', diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/solution.ts b/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/solution.ts index fbf09da12..76c0b9807 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/solution.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/fixtures/solution.ts @@ -35,6 +35,7 @@ export const baseSolutionJson = { { id: 3, attributes: { + seo: null, slug: 'slugdellacasehistory', title: 'Lorem ipsum dolor sit amet consectetur adipiscing el', description: 'Lorem ipsum dolor sit amet consectetur adipiscing', @@ -52,5 +53,6 @@ export const baseSolutionJson = { ], }, }, + seo: null, }, }; diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/guideListPages.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/guideListPages.test.ts index d24e3a06f..ef65d8f58 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/guideListPages.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/guideListPages.test.ts @@ -8,6 +8,7 @@ const makeStrapiResponseJson = () => ({ { id: 1, attributes: { + seo: null, title: 'guides', description: 'dfd sdcf dfsd fsdf sdf sdfsd', createdAt: '2024-08-19T14:10:10.483Z', @@ -23,6 +24,7 @@ const makeStrapiResponseJson = () => ({ { id: 1, attributes: { + seo: null, title: 'test', slug: 'guide-1', createdAt: '2024-08-19T13:40:06.503Z', diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/guides.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/guides.test.ts index a1cd28827..84642cfb4 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/guides.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/guides.test.ts @@ -8,6 +8,7 @@ const makeStrapiResponseJson = () => ({ { id: 1, attributes: { + seo: null, title: 'test', slug: 'guide-1', createdAt: '2024-08-19T13:40:06.503Z', diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/homepage.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/homepage.test.ts index 4ef04a9e6..ea503cb81 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/homepage.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/homepage.test.ts @@ -352,6 +352,7 @@ const makeStrapiResponseJson = () => ({ ], }, relatedResources: null, + seo: null, }, }, ], @@ -475,6 +476,7 @@ const makeStrapiResponseJson = () => ({ }, questionsAndAnswers: [], relatedResources: null, + seo: null, }, }, ], diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/overviews.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/overviews.test.ts index 75a509f46..1b59799ca 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/overviews.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/overviews.test.ts @@ -64,6 +64,7 @@ const makeStrapiResponseJson = () => ({ { id: 2, attributes: { + seo: null, title: 'Raccogli i servizi del tuo ente in un unico spazio', createdAt: '2024-08-21T13:21:42.844Z', updatedAt: '2024-08-22T07:33:11.968Z', @@ -257,6 +258,7 @@ const makeStrapiResponseJson = () => ({ { id: 4, attributes: { + seo: null, title: 'First', slug: 'slug', createdAt: '2024-08-21T14:57:40.184Z', @@ -284,6 +286,7 @@ const makeStrapiResponseJson = () => ({ { id: 3, attributes: { + seo: null, title: 'Richiedi la firma di contratti e documenti', createdAt: '2024-08-22T07:34:05.159Z', updatedAt: '2024-08-22T07:36:37.072Z', @@ -304,6 +307,7 @@ const makeStrapiResponseJson = () => ({ { id: 4, attributes: { + seo: null, title: 'Gestisci le notifiche in modo più semplice', createdAt: '2024-08-22T07:36:15.808Z', updatedAt: '2024-08-22T07:36:33.178Z', @@ -347,6 +351,7 @@ const makeStrapiResponseJson = () => ({ { id: 4, attributes: { + seo: null, title: 'First', slug: 'slug', createdAt: '2024-08-21T14:57:40.184Z', diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/quickStartGuides.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/quickStartGuides.test.ts index 9df047701..e57176628 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/quickStartGuides.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/quickStartGuides.test.ts @@ -15,6 +15,7 @@ const product = { publishedAt: '2024-02-15T09:57:24.401Z', locale: 'it', logo: mediaRasterJson, + seo: null, }, }, }; @@ -140,6 +141,7 @@ const makeStrapiResponseJson = () => ({ ], }, product: product, + seo: null, }, }, ], @@ -274,6 +276,7 @@ const makeStrapiResponseWithNullsJson = () => ({ ], }, product: product, + seo: null, }, }, ], diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/solutionListPage.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/solutionListPage.test.ts index 48983ca8f..d031a6e8c 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/solutionListPage.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/solutionListPage.test.ts @@ -86,6 +86,7 @@ const makeStrapiResponseJson = () => ({ }, ], }, + seo: null, }, }, meta: {}, diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/solutions.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/solutions.test.ts index 24c2a1082..2c760b67c 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/solutions.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/solutions.test.ts @@ -30,6 +30,7 @@ const makeStrapiResponseJson = () => ({ { id: 1, attributes: { + seo: null, name: 'CMS APP IO', description: 'Test desc ', slug: 'app-io', @@ -156,6 +157,7 @@ const makeStrapiResponseJson = () => ({ ], }, relatedResources: null, + seo: null, }, }, ], diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/tutorialList.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/tutorialList.test.ts index 57e378b29..52e59f441 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/tutorialList.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/tutorialList.test.ts @@ -85,6 +85,7 @@ const makeStrapiResponseJson = () => ({ icon: mediaVectorJson, }, ], + seo: null, }, }, ], diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/tutorials.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/tutorials.test.ts index cd4233d13..3c6f2a8ea 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/tutorials.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/tutorials.test.ts @@ -1,5 +1,5 @@ import * as E from 'fp-ts/lib/Either'; -import { StrapiTutorialsCodec } from '../codecs/TutorialCodec'; +import { TutorialsCodec } from '../codecs/TutorialCodec'; const baseTutorialJson = { id: 1, @@ -80,6 +80,7 @@ const baseTutorialJson = { data: { id: 1, attributes: { + seo: null, name: 'CMS APP IO', shortName: 'IO', description: 'Test desc ', @@ -170,50 +171,53 @@ const baseTutorialJson = { const makeStrapiResponseJson = () => ({ data: [ { - ...baseTutorialJson, - bannerLinks: [ - { - id: 1, - title: 'test', - body: [ - { - type: 'paragraph', - children: [ - { - type: 'text', - text: 'some desc', - }, - ], - }, - ], - }, - { - id: 2, - title: 'test 2', - body: [ + attributes: { + ...baseTutorialJson.attributes, + bannerLinks: [ + { + id: 1, + title: 'test', + content: [ + { + type: 'paragraph', + children: [ + { + type: 'text', + text: 'some desc', + }, + ], + }, + ], + }, + { + id: 2, + title: 'test 2', + content: [ + { + type: 'paragraph', + children: [ + { + type: 'text', + text: 'some desc', + }, + ], + }, + ], + }, + ], + relatedLinks: { + id: 9, + title: 'links', + links: [ { - type: 'paragraph', - children: [ - { - type: 'text', - text: 'some desc', - }, - ], + id: 21, + text: 'click', + href: 'http://localhost:1337/admin/content-manager/collection-types/api::tutorial.tutorial/1?plugins[i18n][locale]=it', + target: '_blank', }, ], }, - ], - relatedLinks: { - id: 9, - title: 'links', - links: [ - { - id: 21, - text: 'click', - href: 'http://localhost:1337/admin/content-manager/collection-types/api::tutorial.tutorial/1?plugins[i18n][locale]=it', - target: '_blank', - }, - ], + seo: null, }, }, ], @@ -243,6 +247,7 @@ const makeStrapiResponseJsonWithNull = () => ({ data: { id: 1, attributes: { + seo: null, name: 'CMS APP IO', shortName: 'IO', description: 'Test desc ', @@ -346,6 +351,7 @@ const makeStrapiResponseJsonWithNull = () => ({ }, relatedLinks: null, bannerLinks: [], + seo: null, }, }, ], @@ -359,16 +365,16 @@ const makeStrapiResponseJsonWithNull = () => ({ }, }); -describe('StrapiTutorialCodec', () => { +describe('TutorialCodec', () => { it('should decode strapi tutorials', () => { const jsonFromStrapi = makeStrapiResponseJson(); - const actual = StrapiTutorialsCodec.decode(jsonFromStrapi); + const actual = TutorialsCodec.decode(jsonFromStrapi); expect(E.isRight(actual)).toBeTruthy(); }); it('should decode strapi tutorials with nulls', () => { const jsonFromStrapi = makeStrapiResponseJsonWithNull(); - const actual = StrapiTutorialsCodec.decode(jsonFromStrapi); + const actual = TutorialsCodec.decode(jsonFromStrapi); expect(E.isRight(actual)).toBeTruthy(); }); }); diff --git a/apps/nextjs-website/src/lib/strapi/__tests__/webinars.test.ts b/apps/nextjs-website/src/lib/strapi/__tests__/webinars.test.ts index f3404cb1e..16e5c35ed 100644 --- a/apps/nextjs-website/src/lib/strapi/__tests__/webinars.test.ts +++ b/apps/nextjs-website/src/lib/strapi/__tests__/webinars.test.ts @@ -181,6 +181,7 @@ const makeStrapiResponseJson = () => ({ ], }, ], + seo: null, }, }, ], @@ -230,6 +231,7 @@ const makeStrapiResponseWithNullsJson = () => ({ }, relatedResources: null, questionsAndAnswers: [], + seo: null, }, }, ], diff --git a/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListCodec.ts index 41e8afb18..d991f93e5 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListCodec.ts @@ -1,6 +1,7 @@ import * as t from 'io-ts/lib'; import { MediaCodec } from './MediaCodec'; import { NullToUndefinedCodec } from './NullToUndefinedCodec'; +import { SEOCodec } from './SeoCodec'; const UrlCodec = t.strict({ id: t.number, @@ -23,6 +24,7 @@ const ApiDataCodec = t.strict({ }), ]), apiSoapUrl: t.union([NullToUndefinedCodec, t.string]), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListPagesCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListPagesCodec.ts index 2e3333a27..291931926 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListPagesCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/ApiDataListPagesCodec.ts @@ -3,6 +3,7 @@ import { BaseProductCodec } from './ProductCodec'; import { BannerLinkCodec } from './BannerLinkCodec'; import { ApiDataListCodec } from './ApiDataListCodec'; import { NullToUndefinedCodec } from './NullToUndefinedCodec'; +import { SEOCodec } from './SeoCodec'; export const ApiDataListPageCodec = t.strict({ id: t.number, @@ -14,6 +15,7 @@ export const ApiDataListPageCodec = t.strict({ }), apiData: ApiDataListCodec, bannerLinks: t.array(BannerLinkCodec), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesCodec.ts index e86349e1f..47a5a0c23 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesCodec.ts @@ -5,23 +5,36 @@ import { MediaCodec } from './MediaCodec'; import { PaginationCodec } from './PaginationCodec'; import { ProductCodec } from './ProductCodec'; import { PartCodec } from './PartCodec'; +import { SEOCodec } from './SeoCodec'; + +const BaseCaseHistoryAttributesCodec = t.strict({ + slug: t.string, + title: t.string, + description: t.union([NullToUndefinedCodec, t.string]), + publishedAt: tt.DateFromISOString, + image: t.union([ + NullToUndefinedCodec, + t.strict({ data: t.union([NullToUndefinedCodec, MediaCodec]) }), + ]), +}); + +export const BaseCaseHistoryCodec = t.strict({ + id: t.number, + attributes: BaseCaseHistoryAttributesCodec, +}); export const CaseHistoryCodec = t.strict({ id: t.number, - attributes: t.strict({ - slug: t.string, - title: t.string, - description: t.union([NullToUndefinedCodec, t.string]), - publishedAt: tt.DateFromISOString, - image: t.union([ - NullToUndefinedCodec, - t.strict({ data: t.union([NullToUndefinedCodec, MediaCodec]) }), - ]), - products: t.strict({ - data: t.array(ProductCodec), + attributes: t.intersection([ + BaseCaseHistoryAttributesCodec, + t.strict({ + products: t.strict({ + data: t.array(ProductCodec), + }), + parts: t.array(PartCodec), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), - parts: t.array(PartCodec), - }), + ]), }); export const CaseHistoriesCodec = t.strict({ diff --git a/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesComponentCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesComponentCodec.ts index dbef30110..e80802e2e 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesComponentCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/CaseHistoriesComponentCodec.ts @@ -1,11 +1,11 @@ import * as t from 'io-ts'; import { NullToUndefinedCodec } from '@/lib/strapi/codecs/NullToUndefinedCodec'; -import { CaseHistoryCodec } from '@/lib/strapi/codecs/CaseHistoriesCodec'; +import { BaseCaseHistoryCodec } from '@/lib/strapi/codecs/CaseHistoriesCodec'; export const CaseHistoriesComponentCodec = t.strict({ title: t.string, description: t.union([NullToUndefinedCodec, t.string]), case_histories: t.strict({ - data: t.array(CaseHistoryCodec), + data: t.array(BaseCaseHistoryCodec), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/GuideListPagesCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/GuideListPagesCodec.ts index 6eea0f829..24aed6bd5 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/GuideListPagesCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/GuideListPagesCodec.ts @@ -2,6 +2,8 @@ import * as t from 'io-ts/lib'; import { BaseGuideCodec } from './GuidesCodec'; import { BaseProductCodec } from './ProductCodec'; import { PaginationCodec } from './PaginationCodec'; +import { NullToUndefinedCodec } from './NullToUndefinedCodec'; +import { SEOCodec } from './SeoCodec'; const GuideByCategoryCodec = t.strict({ category: t.string, @@ -17,6 +19,7 @@ const GuideListPageCodec = t.strict({ description: t.string, product: t.strict({ data: BaseProductCodec }), guidesByCategory: t.array(GuideByCategoryCodec), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/GuidesCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/GuidesCodec.ts index 5b5ea0d06..d249224b4 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/GuidesCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/GuidesCodec.ts @@ -2,6 +2,8 @@ import * as t from 'io-ts/lib'; import { PaginationCodec } from './PaginationCodec'; import { MediaCodec } from '@/lib/strapi/codecs/MediaCodec'; import { BaseProductCodec } from '@/lib/strapi/codecs/ProductCodec'; +import { NullToUndefinedCodec } from './NullToUndefinedCodec'; +import { SEOCodec } from './SeoCodec'; const VersionCodec = t.strict({ main: t.boolean, @@ -31,6 +33,7 @@ export const GuideCodec = t.strict({ t.strict({ versions: t.array(VersionCodec), product: t.strict({ data: BaseProductCodec }), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), ]), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/OverviewsCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/OverviewsCodec.ts index 68f712f4a..d102a80b4 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/OverviewsCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/OverviewsCodec.ts @@ -11,6 +11,7 @@ import { PaginationCodec } from '@/lib/strapi/codecs/PaginationCodec'; import { RelatedLinksCodec } from '@/lib/strapi/codecs/RelatedLinksCodec'; import { BaseTutorialCodec } from './TutorialCodec'; import { BannerLinkCodec } from '@/lib/strapi/codecs/BannerLinkCodec'; +import { SEOCodec } from './SeoCodec'; const StartInfoCodec = t.strict({ icon: t.strict({ data: MediaCodec }), @@ -75,6 +76,7 @@ export const OverviewCodec = t.strict({ data: t.union([NullToUndefinedCodec, ProductCodec]), }), bannerLinks: t.array(BannerLinkCodec), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/QuickStartGuidesCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/QuickStartGuidesCodec.ts index 4131375df..1363dcf81 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/QuickStartGuidesCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/QuickStartGuidesCodec.ts @@ -3,6 +3,8 @@ import * as tt from 'io-ts-types'; import { PaginationCodec } from './PaginationCodec'; import { ProductCodec } from './ProductCodec'; import { PartCodec } from './PartCodec'; +import { NullToUndefinedCodec } from './NullToUndefinedCodec'; +import { SEOCodec } from './SeoCodec'; const QuickStartGuideItemCodec = t.strict({ id: t.number, @@ -21,6 +23,7 @@ export const QuickStartGuideCodec = t.strict({ description: t.string, product: t.strict({ data: ProductCodec }), quickstartGuideItems: t.strict({ data: t.array(QuickStartGuideItemCodec) }), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/SolutionListPageCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/SolutionListPageCodec.ts index 24f26cc4b..36e49451f 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/SolutionListPageCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/SolutionListPageCodec.ts @@ -1,8 +1,9 @@ import * as t from 'io-ts/lib'; import { NullToUndefinedCodec } from './NullToUndefinedCodec'; -import { SolutionCodec } from './SolutionsCodec'; +import { BaseSolutionWithProductsCodec } from './SolutionsCodec'; import { FeaturesCodec } from './FeaturesCodec'; import { CaseHistoriesComponentCodec } from '@/lib/strapi/codecs/CaseHistoriesComponentCodec'; +import { SEOCodec } from './SeoCodec'; export const SolutionListPageCodec = t.strict({ data: t.strict({ @@ -14,9 +15,10 @@ export const SolutionListPageCodec = t.strict({ CaseHistoriesComponentCodec, ]), solutions: t.strict({ - data: t.array(SolutionCodec), + data: t.array(BaseSolutionWithProductsCodec), }), features: t.union([NullToUndefinedCodec, FeaturesCodec]), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/SolutionsCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/SolutionsCodec.ts index a2068e0e4..a49e7b542 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/SolutionsCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/SolutionsCodec.ts @@ -8,6 +8,7 @@ import { BlocksContentCodec } from './BlocksContentCodec'; import { BannerLinkCodec } from './BannerLinkCodec'; import { WebinarCodec } from './WebinarsCodec'; import { CaseHistoriesComponentCodec } from '@/lib/strapi/codecs/CaseHistoriesComponentCodec'; +import { SEOCodec } from './SeoCodec'; const StepCodec = t.strict({ title: t.string, @@ -36,6 +37,15 @@ export const BaseSolutionCodec = t.strict({ attributes: BaseSolutionAttributesCodec, }); +export const BaseSolutionWithProductsCodec = t.strict({ + attributes: t.intersection([ + BaseSolutionAttributesCodec, + t.strict({ + products: t.strict({ data: t.array(ProductCodec) }), + }), + ]), +}); + export const SolutionCodec = t.strict({ id: t.number, attributes: t.intersection([ @@ -50,13 +60,12 @@ export const SolutionCodec = t.strict({ webinars: t.strict({ data: t.array(WebinarCodec), }), - products: t.strict({ - data: t.array(ProductCodec), - }), + products: t.strict({ data: t.array(ProductCodec) }), caseHistories: t.union([ NullToUndefinedCodec, CaseHistoriesComponentCodec, ]), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), ]), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/TutorialCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/TutorialCodec.ts index 068a4f553..5efb7d8ac 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/TutorialCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/TutorialCodec.ts @@ -8,6 +8,7 @@ import { BaseProductCodec, ProductCodec } from './ProductCodec'; import { RelatedLinksCodec } from './RelatedLinksCodec'; import { PartCodec } from './PartCodec'; import { PaginationCodec } from './PaginationCodec'; +import { SEOCodec } from './SeoCodec'; const BannerLinkCodec = t.strict({ id: t.number, @@ -38,13 +39,14 @@ export const TutorialCodec = t.strict({ bannerLinks: t.union([NullToUndefinedCodec, t.array(BannerLinkCodec)]), relatedLinks: t.union([NullToUndefinedCodec, RelatedLinksCodec]), product: t.strict({ data: ProductCodec }), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), ]), }); -export const StrapiTutorialsCodec = t.strict({ +export const TutorialsCodec = t.strict({ data: t.array(TutorialCodec), meta: PaginationCodec, }); -export type StrapiTutorials = t.TypeOf; +export type StrapiTutorials = t.TypeOf; diff --git a/apps/nextjs-website/src/lib/strapi/codecs/TutorialListPagesCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/TutorialListPagesCodec.ts index 23e3c3a18..bfb5f8c77 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/TutorialListPagesCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/TutorialListPagesCodec.ts @@ -3,6 +3,8 @@ import { BaseProductCodec } from './ProductCodec'; import { PaginationCodec } from './PaginationCodec'; import { BannerLinkCodec } from './BannerLinkCodec'; import { BaseTutorialCodec } from './TutorialCodec'; +import { SEOCodec } from './SeoCodec'; +import { NullToUndefinedCodec } from './NullToUndefinedCodec'; const StrapiTutorialListPageCodec = t.strict({ id: t.number, @@ -12,6 +14,7 @@ const StrapiTutorialListPageCodec = t.strict({ tutorials: t.strict({ data: t.array(BaseTutorialCodec) }), bannerLinks: t.array(BannerLinkCodec), product: t.strict({ data: BaseProductCodec }), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/codecs/WebinarsCodec.ts b/apps/nextjs-website/src/lib/strapi/codecs/WebinarsCodec.ts index 49144bdef..cb6bc7990 100644 --- a/apps/nextjs-website/src/lib/strapi/codecs/WebinarsCodec.ts +++ b/apps/nextjs-website/src/lib/strapi/codecs/WebinarsCodec.ts @@ -5,6 +5,7 @@ import { BlocksContentCodec } from './BlocksContentCodec'; import { MediaCodec } from './MediaCodec'; import { RelatedLinksCodec } from './RelatedLinksCodec'; import { PaginationCodec } from './PaginationCodec'; +import { SEOCodec } from './SeoCodec'; const WebinarSpeakerCodec = t.strict({ id: t.number, @@ -53,14 +54,11 @@ export const WebinarCodec = t.strict({ startDatetime: t.union([NullToUndefinedCodec, tt.DateFromISOString]), endDatetime: t.union([NullToUndefinedCodec, tt.DateFromISOString]), subscribeParagraphLabel: t.union([NullToUndefinedCodec, t.string]), - relatedLinks: t.union([ - NullToUndefinedCodec, - RelatedLinksCodec, - t.undefined, - ]), + relatedLinks: t.union([NullToUndefinedCodec, RelatedLinksCodec]), relatedResources: t.union([NullToUndefinedCodec, RelatedResources]), webinarSpeakers: t.strict({ data: t.array(WebinarSpeakerCodec) }), questionsAndAnswers: t.array(QuestionAndAnswerCodec), + seo: t.union([NullToUndefinedCodec, SEOCodec]), }), }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataList.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataList.ts index 1ef5e9277..42995904a 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataList.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataList.ts @@ -9,6 +9,9 @@ const makeStrapiApiDataPopulate = () => populate: ['slug', 'specUrls'], }, icon: { populate: '*' }, + seo: { + populate: '*', + }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataListPages.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataListPages.ts index 5fc4facc2..d9beeb4d6 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataListPages.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchApiDataListPages.ts @@ -11,6 +11,9 @@ const makeStrapiApiDataListPagePopulate = () => populate: ['slug', 'specUrls'], }, icon: { populate: '*' }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }, product: { @@ -19,6 +22,9 @@ const makeStrapiApiDataListPagePopulate = () => bannerLinks: { populate: ['icon'], }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchCaseHistories.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchCaseHistories.ts index 0adaf38e0..f88d2655d 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchCaseHistories.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchCaseHistories.ts @@ -17,6 +17,9 @@ const makeStrapiCaseHistoriesPopulate = () => products: { populate: ['logo'], }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchGuideListPages.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchGuideListPages.ts index 10cd2b334..cede37635 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchGuideListPages.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchGuideListPages.ts @@ -5,10 +5,15 @@ import { GuideListPagesCodec } from '@/lib/strapi/codecs/GuideListPagesCodec'; const makeStrapiGuideListPopulate = () => qs.stringify({ populate: { - product: '*', + product: { + populate: '*', + }, guidesByCategory: { populate: ['guides.mobileImage', 'guides.image', 'guides.listItems'], }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchHomepage.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchHomepage.ts index bb860bfd4..234c74133 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchHomepage.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchHomepage.ts @@ -20,7 +20,13 @@ const makeStrapiHomepagePopulate = () => }, webinars: webinarPopulate, ecosystem: { - populate: ['products.logo', 'solutions.icon', 'solutionsCta.link'], + populate: [ + 'products.logo', + 'solutions.icon', + 'solutions.product', + 'solutions.product.logo', + 'solutionsCta.link', + ], }, seo: { populate: '*,metaImage,metaSocial.image', diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchOverviews.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchOverviews.ts index 866f9f425..89c0b5c1c 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchOverviews.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchOverviews.ts @@ -21,6 +21,9 @@ const makeStrapiOverviewsPopulate = () => tutorialSection: { populate: ['tutorials.image', 'tutorials.product'], }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, postIntegration: { populate: [ 'link', diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchQuickStartGuides.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchQuickStartGuides.ts index ca6db465e..5fc2489d4 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchQuickStartGuides.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchQuickStartGuides.ts @@ -10,6 +10,9 @@ const makeStrapiQuickStartGuidesPopulate = () => 'parts.responseCode,parts.requestCode,parts.requestAttributes', }, product: { populate: 'logo' }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutionListPage.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutionListPage.ts index 80c4571fc..bf9b1eced 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutionListPage.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutionListPage.ts @@ -17,33 +17,20 @@ const makeStrapiSolutionListPagePopulate = () => 'steps.products', 'webinars', 'webinars.coverImage', - 'webinars.questionsAndAnswers', - 'webinars.webinarSpeakers', - 'webinars.webinarSpeakers.avatar', - 'webinars.relatedResources.resources.image', - 'webinars.relatedResources.downloadableDocuments', 'caseHistories', 'caseHistories.case_histories', 'caseHistories.case_histories.image', - 'caseHistories.case_histories.parts', - 'caseHistories.case_histories.parts.backgroundImage', - 'caseHistories.case_histories.products', - 'caseHistories.case_histories.products.logo', ], }, caseHistories: { - populate: [ - 'case_histories', - 'case_histories.image', - 'case_histories.parts', - 'case_histories.parts.backgroundImage', - 'case_histories.products', - 'case_histories.products.logo', - ], + populate: ['case_histories', 'case_histories.image'], }, features: { populate: ['items.icon'], }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutions.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutions.ts index 7094c29fa..be894a98a 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutions.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchSolutions.ts @@ -13,6 +13,9 @@ const makeStrapiSolutionsPopulate = () => products: '*', }, }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, products: { populate: ['logo'], }, @@ -21,14 +24,7 @@ const makeStrapiSolutionsPopulate = () => }, webinars: webinarPopulate, caseHistories: { - populate: [ - 'case_histories', - 'case_histories.image', - 'case_histories.parts', - 'case_histories.parts.backgroundImage', - 'case_histories.products', - 'case_histories.products.logo', - ], + populate: ['case_histories', 'case_histories.image'], }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorialListPages.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorialListPages.ts index 0a3cd3273..b4bf5d160 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorialListPages.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorialListPages.ts @@ -12,6 +12,9 @@ const makeStrapiTutorialListPagePopulate = () => bannerLinks: { populate: ['icon'], }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorials.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorials.ts index ca99983a1..d2f2b16d9 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorials.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchTutorials.ts @@ -1,6 +1,6 @@ import * as qs from 'qs'; import { fetchFromStrapi } from '../fetchFromStrapi'; -import { StrapiTutorialsCodec } from '../codecs/TutorialCodec'; +import { TutorialsCodec } from '../codecs/TutorialCodec'; const makeStrapiTutorialsPopulate = () => qs.stringify({ @@ -16,11 +16,14 @@ const makeStrapiTutorialsPopulate = () => bannerLinks: { populate: ['icon'], }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, }, }); export const fetchTutorials = fetchFromStrapi( 'tutorials', makeStrapiTutorialsPopulate(), - StrapiTutorialsCodec + TutorialsCodec ); diff --git a/apps/nextjs-website/src/lib/strapi/fetches/fetchWebinars.ts b/apps/nextjs-website/src/lib/strapi/fetches/fetchWebinars.ts index 1a1e28065..ad1bc3ab5 100644 --- a/apps/nextjs-website/src/lib/strapi/fetches/fetchWebinars.ts +++ b/apps/nextjs-website/src/lib/strapi/fetches/fetchWebinars.ts @@ -23,6 +23,9 @@ export const webinarPopulate = { }, }, }, + seo: { + populate: '*,metaImage,metaSocial.image', + }, questionsAndAnswers: '*', }, }; diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataList.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataList.ts index 0810630a8..0cf6ee6bd 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataList.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataList.ts @@ -13,5 +13,6 @@ export function makeApiDataListProps( ? [...attributes.apiRestDetail.specUrls.map((spec) => ({ ...spec }))] : [], specURLsName: attributes.title, + seo: attributes.seo, })); } diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataListPages.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataListPages.ts index 6cc4415d9..330cf80e5 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataListPages.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeApiDataListPages.ts @@ -40,5 +40,6 @@ export function makeApiDataListPagesProps( title: bannerLink.title || '', })), ], + seo: attributes.seo, })); } diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeCaseHistories.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeCaseHistories.ts index 1859243d2..f4064d7e7 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeCaseHistories.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeCaseHistories.ts @@ -18,5 +18,6 @@ export function makeCaseHistoriesProps( logo: attributes.logo.data.attributes, })), image: attributes.image?.data?.attributes, + seo: attributes.seo, })); } diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeGuideListPages.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeGuideListPages.ts index caaf99d2b..6d9b230e9 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeGuideListPages.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeGuideListPages.ts @@ -42,6 +42,7 @@ export function makeGuideListPagesProps( }, guidesSections: [...guidesSections], bannerLinks: product.bannerLinks, + seo: attributes.seo, }; }), ...staticGuideListPages, diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeGuides.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeGuides.ts index bdd1fe1a9..e9b83ea72 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeGuides.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeGuides.ts @@ -21,6 +21,7 @@ export function makeGuidesProps( }, versions: attributes.versions, bannerLinks: product.bannerLinks, + seo: attributes.seo, }; }), ...staticGuides, diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeOverviews.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeOverviews.ts index e6864e712..fe34a61fc 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeOverviews.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeOverviews.ts @@ -123,6 +123,7 @@ export function makeOverviewsProps( title: bannerLink.title || '', })) : product.bannerLinks, + seo: attributes.seo, }; }), ...staticOverviews, diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeQuickStartGuides.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeQuickStartGuides.ts index 6322ab3ef..60aeeeb87 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeQuickStartGuides.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeQuickStartGuides.ts @@ -44,6 +44,7 @@ export function makeQuickStartGuidesProps( makeStepFromQuickstartGuideItems(item) ), path: `/${product.slug}/quick-start`, + seo: quickStart.attributes.seo, }; }), ...staticQuickStarts, diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutionListPage.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutionListPage.ts index 327152786..bbcf9a66f 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutionListPage.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutionListPage.ts @@ -42,5 +42,6 @@ export function makeSolutionListPageProps( iconUrl: item.icon.data.attributes.url, })), }, + seo: attributes.seo, }; } diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutions.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutions.ts index abaa223e4..c4e58b30c 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutions.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeSolutions.ts @@ -39,5 +39,6 @@ export function makeSolutionsProps( }) ), }, + seo: attributes.seo, })); } diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorialListPages.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorialListPages.ts index cf02ecbca..be54d1c3c 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorialListPages.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorialListPages.ts @@ -32,6 +32,7 @@ export function makeTutorialListPagesProps( title: attributes.title, description: attributes.description, }, + seo: attributes.seo, tutorials: tutorials, bannerLinks: attributes.bannerLinks.length > 0 diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorials.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorials.ts index 444b152d9..16bad24ca 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorials.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeTutorials.ts @@ -34,6 +34,7 @@ export function makeTutorialsProps( productSlug: attributes.product.data.attributes.slug, relatedLinks: attributes.relatedLinks, bannerLinks: attributes.bannerLinks, + seo: attributes.seo, })); return productSlug diff --git a/apps/nextjs-website/src/lib/strapi/makeProps/makeWebinars.ts b/apps/nextjs-website/src/lib/strapi/makeProps/makeWebinars.ts index bc757bf31..a1c4af343 100644 --- a/apps/nextjs-website/src/lib/strapi/makeProps/makeWebinars.ts +++ b/apps/nextjs-website/src/lib/strapi/makeProps/makeWebinars.ts @@ -42,6 +42,7 @@ export const makeWebinarFromStrapi = ( endDateTime: webinar.attributes.endDatetime?.toISOString(), subscribeCtaLabel: webinar.attributes.subscribeParagraphLabel, imagePath: webinar.attributes.coverImage.data.attributes.url, + seo: webinar.attributes.seo, }; }; diff --git a/apps/nextjs-website/src/lib/types/guideData.ts b/apps/nextjs-website/src/lib/types/guideData.ts index da527058c..9cf6380d5 100644 --- a/apps/nextjs-website/src/lib/types/guideData.ts +++ b/apps/nextjs-website/src/lib/types/guideData.ts @@ -2,6 +2,7 @@ import { BannerLinkProps } from '@/components/atoms/BannerLink/BannerLink'; import { Path } from '@/lib/types/path'; import { DocPage } from 'gitbook-docs/parseDoc'; import { Product } from './product'; +import { SEO } from './seo'; export type Guide = { readonly title: string; @@ -36,5 +37,6 @@ export type GuidePage = NonNullable< readonly pathPrefix: string; readonly assetsPrefix: string; readonly redirect?: boolean; + readonly seo?: SEO; }> >; diff --git a/apps/nextjs-website/src/lib/types/tutorialData.ts b/apps/nextjs-website/src/lib/types/tutorialData.ts index c3d271baf..2d0ef54b2 100644 --- a/apps/nextjs-website/src/lib/types/tutorialData.ts +++ b/apps/nextjs-website/src/lib/types/tutorialData.ts @@ -1,5 +1,6 @@ import { Path } from '@/lib/types/path'; import { Part } from './part'; +import { SEO } from './seo'; export type Tutorial = { readonly showInOverview?: boolean; @@ -10,4 +11,5 @@ export type Tutorial = { readonly title: string; readonly publishedAt?: Date; readonly parts?: readonly Part[]; + readonly seo?: SEO; } & Path; diff --git a/apps/nextjs-website/src/lib/types/webinar.ts b/apps/nextjs-website/src/lib/types/webinar.ts index 5ca8e7ebf..b0ae64661 100644 --- a/apps/nextjs-website/src/lib/types/webinar.ts +++ b/apps/nextjs-website/src/lib/types/webinar.ts @@ -1,6 +1,7 @@ import { Speaker } from '@/lib/types/speaker'; import { BlocksContent } from '@strapi/blocks-react-renderer'; import { Media } from '../strapi/codecs/MediaCodec'; +import { SEO } from './seo'; export type QuestionsAndAnswer = { readonly question: string; @@ -44,4 +45,5 @@ export type Webinar = { readonly isVisibleInList: boolean; readonly imagePath: string; readonly questionsAndAnswers?: readonly QuestionsAndAnswer[]; + readonly seo?: SEO; };