From 04e6c51d13d55390093cf03402e1ca2b561c5c7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Feb 2024 08:57:00 +0000 Subject: [PATCH 01/10] Bump webpack-dev-server from 4.15.1 to 5.0.2 in /frontend Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.15.1 to 5.0.2. - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.15.1...v5.0.2) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- frontend/package.json | 2 +- frontend/yarn.lock | 339 ++++++++++++++++++++++++++++++++---------- 2 files changed, 258 insertions(+), 83 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index c914b90c..42373f79 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -50,7 +50,7 @@ "typescript": "5.3.3", "web-vitals": "^3.5.2", "webpack": "^5.90.3", - "webpack-dev-server": "^4.6.0", + "webpack-dev-server": "^5.0.2", "webpack-manifest-plugin": "^5.0.0", "workbox-webpack-plugin": "^7.0.0" }, diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 1a85c546..523f2697 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2666,6 +2666,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2974,6 +2986,11 @@ tslib "^2.5.0" webcrypto-core "^1.7.7" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.11" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" @@ -3274,14 +3291,14 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.9": +"@types/bonjour@^3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" -"@types/connect-history-api-fallback@^1.3.5": +"@types/connect-history-api-fallback@^1.5.4": version "1.5.4" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== @@ -3410,7 +3427,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": +"@types/express@*", "@types/express@^4.17.21": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -3576,10 +3593,10 @@ dependencies: "@types/node" "*" -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== "@types/scheduler@*": version "0.16.8" @@ -3599,14 +3616,14 @@ "@types/mime" "^1" "@types/node" "*" -"@types/serve-index@^1.9.1": +"@types/serve-index@^1.9.4": version "1.9.4" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.13.10": +"@types/serve-static@*", "@types/serve-static@^1.15.5": version "1.15.5" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== @@ -3615,7 +3632,7 @@ "@types/mime" "*" "@types/node" "*" -"@types/sockjs@^0.3.33": +"@types/sockjs@^0.3.36": version "0.3.36" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== @@ -3637,7 +3654,7 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/ws@^8.0.0", "@types/ws@^8.5.5": +"@types/ws@^8.0.0", "@types/ws@^8.5.10": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== @@ -4323,6 +4340,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -4382,11 +4404,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-includes@^3.1.6, array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" @@ -4770,13 +4787,11 @@ body-parser@1.20.1: type-is "~1.6.18" unpipe "1.0.0" -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== +bonjour-service@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -4842,6 +4857,13 @@ builtin-modules@^3.1.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -5009,10 +5031,10 @@ check-types@^11.2.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.4.2, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -5354,7 +5376,7 @@ cross-inspect@1.0.0: dependencies: tslib "^2.4.0" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5717,6 +5739,19 @@ deepmerge@^4.2.2, deepmerge@^4.3.1: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -5745,6 +5780,11 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -5831,11 +5871,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - dns-packet@^5.2.2: version "5.6.1" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" @@ -5966,6 +6001,11 @@ duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -6774,6 +6814,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" @@ -6949,6 +6997,17 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -7172,7 +7231,7 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" -html-entities@^2.1.0, html-entities@^2.3.2: +html-entities@^2.1.0, html-entities@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== @@ -7457,7 +7516,7 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: +ipaddr.js@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== @@ -7545,6 +7604,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -7581,6 +7645,13 @@ is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -7608,6 +7679,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-network-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.0.1.tgz#a68061a20387e9144e145571bea693056a370b92" + integrity sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -7754,6 +7830,13 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -7838,6 +7921,15 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" @@ -8450,7 +8542,7 @@ language-tags@^1.0.9: dependencies: language-subtag-registry "^0.3.20" -launch-editor@^2.6.0: +launch-editor@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== @@ -8639,6 +8731,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" @@ -8690,13 +8787,20 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.1.2, memfs@^3.4.3: +memfs@^3.1.2: version "3.6.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: fs-monkey "^1.0.4" +memfs@^4.6.0: + version "4.7.6" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.7.6.tgz#ebb7c1c30e9ba4779ef452accdf8cec3f8ec04cf" + integrity sha512-PMxcVnZYdSFYZIzsbhd8XLvxrHaIarhyyfDQHThUwhAYAPDfDTvKhEjWbzPyGFr9CPvJJl+VUetfcnVVF9Wckg== + dependencies: + tslib "^2.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8791,11 +8895,23 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -9024,7 +9140,17 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.9, open@^8.4.0: +open@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/open/-/open-10.0.3.tgz#f60d8db49fa126c50aec751957fb5d7de3308d4f" + integrity sha512-dtbI5oW7987hwC9qjJTyABldTaa19SuyJse1QboWv3b0qCcrrLNVDqBx1XgELAjh9QTVQaP/C5b1nhQebd1H2A== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^3.1.0" + +open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -9143,12 +9269,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== +p-retry@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.0.tgz#8d6df01af298750009691ce2f9b3ad2d5968f3bd" + integrity sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA== dependencies: - "@types/retry" "0.12.0" + "@types/retry" "0.12.2" + is-network-error "^1.0.0" retry "^0.13.1" p-try@^2.0.0: @@ -9260,6 +9387,14 @@ path-root@^0.1.1: dependencies: path-root-regex "^0.1.0" +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -10164,6 +10299,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + robust-predicates@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" @@ -10186,6 +10328,11 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" +run-applescript@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" + integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -10291,7 +10438,7 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.1.1: +selfsigned@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== @@ -10446,6 +10593,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + signedsource@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" @@ -10664,7 +10816,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10673,6 +10825,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: version "4.0.10" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" @@ -10738,7 +10899,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -11421,52 +11582,52 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== +webpack-dev-middleware@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.0.0.tgz#13595dc038a400e3ac9c76f0c9a8c75a59a7d4da" + integrity sha512-tZ5hqsWwww/8DislmrzXE3x+4f+v10H1z57mA2dWFrILb4i3xX+dPhTkcdR0DLyQztrhF2AUmO5nN085UYjd/Q== dependencies: colorette "^2.0.10" - memfs "^3.4.3" + memfs "^4.6.0" mime-types "^2.1.31" range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.6.0: - version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" +webpack-dev-server@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.2.tgz#3035972dae4b768de020f91418de471e4ef12b6c" + integrity sha512-IVj3qsQhiLJR82zVg3QdPtngMD05CYP/Am+9NG5QSl+XwUR/UPtFwllRBKrMwM9ttzFsC6Zj3DMgniPyn/Z0hQ== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" + bonjour-service "^1.2.1" + chokidar "^3.6.0" colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^2.0.0" default-gateway "^6.0.3" express "^4.17.3" graceful-fs "^4.2.6" - html-entities "^2.3.2" + html-entities "^2.4.0" http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + rimraf "^5.0.5" + schema-utils "^4.2.0" + selfsigned "^2.4.1" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" + webpack-dev-middleware "^7.0.0" + ws "^8.16.0" webpack-manifest-plugin@^5.0.0: version "5.0.0" @@ -11826,6 +11987,15 @@ workbox-window@7.0.0: "@types/trusted-types" "^2.0.2" workbox-core "7.0.0" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -11835,14 +12005,14 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" @@ -11857,11 +12027,16 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@8.14.2, ws@^8.11.0, ws@^8.12.0, ws@^8.13.0: +ws@8.14.2: version "8.14.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +ws@^8.11.0, ws@^8.12.0, ws@^8.13.0, ws@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" From 27647885a1c41d2aa5be6d69324a0f44bcc98c77 Mon Sep 17 00:00:00 2001 From: Garry O'Donnell Date: Mon, 19 Feb 2024 17:01:06 +0000 Subject: [PATCH 02/10] Add compound library helm chart --- charts/xchemlab/Chart.lock | 7 +- charts/xchemlab/Chart.yaml | 5 +- .../charts/compound-library/Chart.yaml | 15 ++++ .../compound-library/templates/_helpers.tpl | 73 +++++++++++++++++++ .../templates/deployment.yaml | 63 ++++++++++++++++ .../compound-library/templates/service.yaml | 15 ++++ .../templates/serviceaccount.yaml | 12 +++ .../charts/compound-library/values.yaml | 43 +++++++++++ charts/xchemlab/values.yaml | 11 +++ 9 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 charts/xchemlab/charts/compound-library/Chart.yaml create mode 100644 charts/xchemlab/charts/compound-library/templates/_helpers.tpl create mode 100644 charts/xchemlab/charts/compound-library/templates/deployment.yaml create mode 100644 charts/xchemlab/charts/compound-library/templates/service.yaml create mode 100644 charts/xchemlab/charts/compound-library/templates/serviceaccount.yaml create mode 100644 charts/xchemlab/charts/compound-library/values.yaml diff --git a/charts/xchemlab/Chart.lock b/charts/xchemlab/Chart.lock index 3f1c92c1..97e52cab 100644 --- a/charts/xchemlab/Chart.lock +++ b/charts/xchemlab/Chart.lock @@ -2,6 +2,9 @@ dependencies: - name: chimp-chomp repository: "" version: 0.0.3 +- name: compound-library + repository: "" + version: 0.0.1 - name: pin-packing repository: "" version: 0.0.3 @@ -32,5 +35,5 @@ dependencies: - name: oauth2-proxy repository: oci://registry-1.docker.io/bitnamicharts version: 3.7.4 -digest: sha256:4b0ce326f2d48a9af560de0471ebf021e50fa0a9fba1f401bb11fdcdb28ef1d1 -generated: "2023-10-05T14:59:27.826614445+01:00" +digest: sha256:37e0bc3ab1b7e071e600dc4e8416c4e98bed058f54fec0b1ee7b488f2eabe8d7 +generated: "2024-02-19T17:22:02.993010787Z" diff --git a/charts/xchemlab/Chart.yaml b/charts/xchemlab/Chart.yaml index f8da8e4e..650a28d1 100644 --- a/charts/xchemlab/Chart.yaml +++ b/charts/xchemlab/Chart.yaml @@ -6,12 +6,15 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.6.0 +version: 0.7.0 dependencies: - name: chimp-chomp version: 0.0.3 condition: chimp-chomp.enabled + - name: compound-library + version: 0.0.1 + condition: compound-library.enabled - name: pin-packing version: 0.0.3 condition: pin-packing.enabled diff --git a/charts/xchemlab/charts/compound-library/Chart.yaml b/charts/xchemlab/charts/compound-library/Chart.yaml new file mode 100644 index 00000000..cd9849d8 --- /dev/null +++ b/charts/xchemlab/charts/compound-library/Chart.yaml @@ -0,0 +1,15 @@ +apiVersion: v2 +name: compound-library +description: A service for compounds currently available in the XChem lab +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.0.1 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "0.0.5" diff --git a/charts/xchemlab/charts/compound-library/templates/_helpers.tpl b/charts/xchemlab/charts/compound-library/templates/_helpers.tpl new file mode 100644 index 00000000..26450c4b --- /dev/null +++ b/charts/xchemlab/charts/compound-library/templates/_helpers.tpl @@ -0,0 +1,73 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "pinPacking.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "pinPacking.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "pinPacking.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "pinPacking.labels" -}} +helm.sh/chart: {{ include "pinPacking.chart" . }} +{{ include "pinPacking.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "pinPacking.selectorLabels" -}} +app.kubernetes.io/name: {{ include "pinPacking.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "pinPacking.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "xchemlab.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Create the database URL string +*/}} +{{- define "pinPacking.databaseURL" -}} +{{- $host_parts := urlParse .Values.database.host }} +{{- $raw_user_info := printf "%s:$DATABASE_PASSWORD" .Values.database.user }} +{{- $url_parts := set $host_parts "userinfo" $raw_user_info }} +{{- $raw_database_url := urlJoin $url_parts }} +{{- replace "$DATABASE_PASSWORD" "$(DATABASE_PASSWORD)" $raw_database_url }} +{{- end }} diff --git a/charts/xchemlab/charts/compound-library/templates/deployment.yaml b/charts/xchemlab/charts/compound-library/templates/deployment.yaml new file mode 100644 index 00000000..83a48579 --- /dev/null +++ b/charts/xchemlab/charts/compound-library/templates/deployment.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "pinPacking.fullname" . }} + labels: + {{- include "pinPacking.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "pinPacking.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "pinPacking.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "pinPacking.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + args: + - serve + env: + - name: DATABASE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.database.password.secretName }} + key: {{ .Values.database.password.secretKey }} + - name: DATABASE_URL + value: {{ include "pinPacking.databaseURL" . }} + - name: OPA_URL + value: {{ tpl .Values.opa.url . }} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/charts/xchemlab/charts/compound-library/templates/service.yaml b/charts/xchemlab/charts/compound-library/templates/service.yaml new file mode 100644 index 00000000..51f73bd5 --- /dev/null +++ b/charts/xchemlab/charts/compound-library/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "pinPacking.fullname" . }} + labels: + {{- include "pinPacking.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "pinPacking.selectorLabels" . | nindent 4 }} diff --git a/charts/xchemlab/charts/compound-library/templates/serviceaccount.yaml b/charts/xchemlab/charts/compound-library/templates/serviceaccount.yaml new file mode 100644 index 00000000..4ed9da7c --- /dev/null +++ b/charts/xchemlab/charts/compound-library/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "pinPacking.serviceAccountName" . }} + labels: + {{- include "pinPacking.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/charts/xchemlab/charts/compound-library/values.yaml b/charts/xchemlab/charts/compound-library/values.yaml new file mode 100644 index 00000000..7bf9961d --- /dev/null +++ b/charts/xchemlab/charts/compound-library/values.yaml @@ -0,0 +1,43 @@ +nameOverride: "" +fullnameOverride: "" + +image: + repository: ghcr.io/diamondlightsource/xchemlab-compound-library + pullPolicy: Always + tag: "" + +imagePullSecrets: [] + +database: + host: "" + user: "" + password: + secretName: "" + secretKey: "" + +opa: + url: "" + +replicaCount: 1 + +service: + type: ClusterIP + port: 80 + +serviceAccount: + create: false + name: "" + +podAnnotations: {} + +podSecurityContext: {} + +securityContext: {} + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/charts/xchemlab/values.yaml b/charts/xchemlab/values.yaml index 4ab92148..0dfc4c00 100644 --- a/charts/xchemlab/values.yaml +++ b/charts/xchemlab/values.yaml @@ -19,6 +19,17 @@ chimp-chomp: mountPath: /dls/labxchem mountPropagation: HostToContainer +compound-library: + enabled: true + database: + host: postgres://postgresql-ha-pgpool + user: postgres + password: + secretName: postgres-passwords + secretKey: password + opa: + url: http://{{ .Release.Name }}-opa-kube-mgmt:8181 + pin-packing: enabled: true database: From ff056039180b72c58f1d7b997cb7d50cefe8ddc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 19:21:30 +0000 Subject: [PATCH 03/10] Bump the patch group in /backend with 3 updates Bumps the patch group in /backend with 3 updates: [serde](https://github.com/serde-rs/serde), [futures-timer](https://github.com/async-rs/futures-timer) and [serde_json](https://github.com/serde-rs/json). Updates `serde` from 1.0.196 to 1.0.197 - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.196...v1.0.197) Updates `futures-timer` from 3.0.2 to 3.0.3 - [Commits](https://github.com/async-rs/futures-timer/commits/v3.0.3) Updates `serde_json` from 1.0.113 to 1.0.114 - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.113...v1.0.114) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch dependency-group: patch - dependency-name: futures-timer dependency-type: direct:production update-type: version-update:semver-patch dependency-group: patch - dependency-name: serde_json dependency-type: direct:production update-type: version-update:semver-patch dependency-group: patch ... Signed-off-by: dependabot[bot] --- backend/Cargo.lock | 16 ++++++++-------- backend/Cargo.toml | 2 +- backend/chimp_chomp/Cargo.toml | 2 +- backend/chimp_protocol/Cargo.toml | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index bc22012a..c3124f19 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1813,9 +1813,9 @@ checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -3758,18 +3758,18 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", @@ -3778,9 +3778,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index fc971ea5..99275c31 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -40,7 +40,7 @@ sea-orm = { version = "0.11.2", default-features = false, features = [ "with-uuid", ] } sea-orm-migration = { version = "0.11.3" } -serde = { version = "1.0.196" } +serde = { version = "1.0.197" } thiserror = { version = "1.0.57" } tokio = { version = "1.35.1", features = ["macros", "rt-multi-thread"] } tracing = { version = "0.1.40" } diff --git a/backend/chimp_chomp/Cargo.toml b/backend/chimp_chomp/Cargo.toml index 8be53a52..72503847 100644 --- a/backend/chimp_chomp/Cargo.toml +++ b/backend/chimp_chomp/Cargo.toml @@ -10,7 +10,7 @@ clap = { workspace = true } derive_more = { workspace = true } dotenvy = { workspace = true } futures = { version = "0.3.30" } -futures-timer = { version = "3.0.2" } +futures-timer = { version = "3.0.3" } itertools = { workspace = true } lapin = { version = "2.3.1" } ndarray = { version = "0.15.6" } diff --git a/backend/chimp_protocol/Cargo.toml b/backend/chimp_protocol/Cargo.toml index e6339aa5..3fed8aba 100644 --- a/backend/chimp_protocol/Cargo.toml +++ b/backend/chimp_protocol/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" [dependencies] serde = { workspace = true } -serde_json = { version = "1.0.113" } +serde_json = { version = "1.0.114" } url = { workspace = true, features = ["serde"] } uuid = { workspace = true, features = ["serde"] } From c8bcaaf3c71bae88fad10741166944ff53488f02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 20:01:51 +0000 Subject: [PATCH 04/10] Bump the minor group in /frontend with 3 updates Bumps the minor group in /frontend with 3 updates: [@graphql-codegen/client-preset](https://github.com/dotansimha/graphql-code-generator/tree/HEAD/packages/presets/client), [dotenv](https://github.com/motdotla/dotenv) and [eslint](https://github.com/eslint/eslint). Updates `@graphql-codegen/client-preset` from 4.2.2 to 4.2.4 - [Release notes](https://github.com/dotansimha/graphql-code-generator/releases) - [Changelog](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/presets/client/CHANGELOG.md) - [Commits](https://github.com/dotansimha/graphql-code-generator/commits/@graphql-codegen/client-preset@4.2.4/packages/presets/client) Updates `dotenv` from 16.4.4 to 16.4.5 - [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md) - [Commits](https://github.com/motdotla/dotenv/compare/v16.4.4...v16.4.5) Updates `eslint` from 8.56.0 to 8.57.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.56.0...v8.57.0) --- updated-dependencies: - dependency-name: "@graphql-codegen/client-preset" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minor - dependency-name: dotenv dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minor - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor ... Signed-off-by: dependabot[bot] --- frontend/package.json | 6 +-- frontend/yarn.lock | 116 +++++++++++++++++++++--------------------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 42373f79..4042e65e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,7 @@ "devDependencies": { "@babel/core": "^7.23.9", "@graphql-codegen/cli": "^5.0.2", - "@graphql-codegen/client-preset": "^4.1.0", + "@graphql-codegen/client-preset": "^4.2.4", "@graphql-typed-document-node/core": "^3.2.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", "@svgr/webpack": "^8.1.0", @@ -22,9 +22,9 @@ "case-sensitive-paths-webpack-plugin": "^2.4.0", "css-loader": "^6.10.0", "css-minimizer-webpack-plugin": "^6.0.0", - "dotenv": "^16.4.4", + "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", - "eslint": "8.56.0", + "eslint": "8.57.0", "eslint-config-react-app": "^7.0.1", "eslint-webpack-plugin": "^4.0.1", "file-loader": "^6.2.0", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 523f2697..76c1ad5c 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2204,10 +2204,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@graphql-codegen/add@^5.0.2": version "5.0.2" @@ -2258,20 +2258,20 @@ yaml "^2.3.1" yargs "^17.0.0" -"@graphql-codegen/client-preset@^4.1.0", "@graphql-codegen/client-preset@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.2.tgz#545c62789a5687bee5df8b4738b4911e72ea8051" - integrity sha512-DF9pNWj3TEdA90E9FH5SsUIqiZfr872vqaQOspLVuVXGsaDx8F/JLLzaN+7ucmoo0ff/bLW8munVXYXTmgwwEA== +"@graphql-codegen/client-preset@^4.2.2", "@graphql-codegen/client-preset@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.4.tgz#a20e85b07b77282bb27b2e8e014bed5d491443e7" + integrity sha512-k1c8v2YxJhhITGQGxViG9asLAoop9m7X9duU7Zztqjc98ooxsUzXICfvAWsH3mLAUibXAx4Ax6BPzKsTtQmBPg== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" "@graphql-codegen/add" "^5.0.2" - "@graphql-codegen/gql-tag-operations" "4.0.4" + "@graphql-codegen/gql-tag-operations" "4.0.6" "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/typed-document-node" "^5.0.4" - "@graphql-codegen/typescript" "^4.0.4" - "@graphql-codegen/typescript-operations" "^4.1.2" - "@graphql-codegen/visitor-plugin-common" "^4.1.2" + "@graphql-codegen/typed-document-node" "^5.0.6" + "@graphql-codegen/typescript" "^4.0.6" + "@graphql-codegen/typescript-operations" "^4.2.0" + "@graphql-codegen/visitor-plugin-common" "^5.1.0" "@graphql-tools/documents" "^1.0.0" "@graphql-tools/utils" "^10.0.0" "@graphql-typed-document-node/core" "3.2.0" @@ -2287,13 +2287,13 @@ "@graphql-tools/utils" "^10.0.0" tslib "~2.6.0" -"@graphql-codegen/gql-tag-operations@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.4.tgz#572be5db804af5efdc3ca24e4bcac815448730c5" - integrity sha512-dypul0iDLjb07yv+/cRb6qPbn42cFPcwlsJertVl9G6qkS4+3V4806WwSfUht4QVMWnvGfgDkJJqG0yUVKOHwA== +"@graphql-codegen/gql-tag-operations@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz#d16ee0306cfdea60217c025a1bc21649452d7da3" + integrity sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/visitor-plugin-common" "5.1.0" "@graphql-tools/utils" "^10.0.0" auto-bind "~4.0.0" tslib "~2.6.0" @@ -2319,43 +2319,43 @@ "@graphql-tools/utils" "^10.0.0" tslib "~2.6.0" -"@graphql-codegen/typed-document-node@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.4.tgz#06e286caacdd66c3566f98433dcb8f1a9c9a9f1d" - integrity sha512-t66Z6erQ4Dh1j6f9pRZmc8uYtHoUI3A49tLmJAlg9/3IV0kCmwrWKJut/G8SeOefDLG8cXBTVtI/YuZOe1Te+w== +"@graphql-codegen/typed-document-node@^5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz#54750f4a7c6e963defeb6c27a9ea280a2a8bc2a3" + integrity sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/visitor-plugin-common" "5.1.0" auto-bind "~4.0.0" change-case-all "1.0.15" tslib "~2.6.0" -"@graphql-codegen/typescript-operations@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.1.2.tgz#a0f455ae19e16961e5870420ca7515bbe51b5568" - integrity sha512-CtCWK+gW7hS+Ely3lohr8CL1HVLswQzMcaUk3k1sxdWCWKTNq7abMsWa31rTVwRCJ+WNEkM/7S8sIBTpEG683A== +"@graphql-codegen/typescript-operations@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz#0c6bbaf41cb325809b7e9e2b9d85ab01f11d142f" + integrity sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" - "@graphql-codegen/typescript" "^4.0.4" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/typescript" "^4.0.6" + "@graphql-codegen/visitor-plugin-common" "5.1.0" auto-bind "~4.0.0" tslib "~2.6.0" -"@graphql-codegen/typescript@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.4.tgz#e791c61f675ae454951ea077b0ae519ae352cc3e" - integrity sha512-x79CKLfP9UQCX+/I78qxQlMs2Mmq3pF1lKafZo7lAno0f/fvJ+qWUduzdgjRNz+YL+5blGeWcC0pWEDxniO7hw== +"@graphql-codegen/typescript@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.6.tgz#2c9b70dc1eafda912de5e31c119c757b1aa5fca1" + integrity sha512-IBG4N+Blv7KAL27bseruIoLTjORFCT3r+QYyMC3g11uY3/9TPpaUyjSdF70yBe5GIQ6dAgDU+ENUC1v7EPi0rw== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" "@graphql-codegen/schema-ast" "^4.0.2" - "@graphql-codegen/visitor-plugin-common" "4.1.2" + "@graphql-codegen/visitor-plugin-common" "5.1.0" auto-bind "~4.0.0" tslib "~2.6.0" -"@graphql-codegen/visitor-plugin-common@4.1.2", "@graphql-codegen/visitor-plugin-common@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-4.1.2.tgz#674c5d5813f6c00dd65e1ee148a62536879e65e2" - integrity sha512-yk7iEAL1kYZ2Gi/pvVjdsZhul5WsYEM4Zcgh2Ev15VicMdJmPHsMhNUsZWyVJV0CaQCYpNOFlGD/11Ea3pn4GA== +"@graphql-codegen/visitor-plugin-common@5.1.0", "@graphql-codegen/visitor-plugin-common@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz#4edf7edb53460e71762a5fd8bbf5269bc3d9200b" + integrity sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg== dependencies: "@graphql-codegen/plugin-helpers" "^5.0.3" "@graphql-tools/optimize" "^2.0.0" @@ -2647,13 +2647,13 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -2661,10 +2661,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -5986,10 +5986,10 @@ dotenv-expand@^11.0.6: dependencies: dotenv "^16.4.4" -dotenv@^16.0.0, dotenv@^16.4.4: - version "16.4.4" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" - integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== +dotenv@^16.0.0, dotenv@^16.4.4, dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== dset@^3.1.2: version "3.1.3" @@ -6405,16 +6405,16 @@ eslint-webpack-plugin@^4.0.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@8.56.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== +eslint@8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" From dc6e2fc33db7371436a05cab952b09596b5901cb Mon Sep 17 00:00:00 2001 From: iamvigneshwars Date: Thu, 15 Feb 2024 10:25:29 +0000 Subject: [PATCH 05/10] Add crystal wells table for crystal library --- backend/Cargo.lock | 20 ++++ backend/Cargo.toml | 3 +- backend/crystal_library/Cargo.toml | 22 ++++ .../src/entities/crystal_wells.rs | 23 ++++ backend/crystal_library/src/entities/mod.rs | 1 + backend/crystal_library/src/graphql.rs | 16 +++ backend/crystal_library/src/main.rs | 113 ++++++++++++++++++ backend/crystal_library/src/migrator.rs | 32 +++++ .../src/resolvers/crystal_wells_res.rs | 62 ++++++++++ backend/crystal_library/src/resolvers/mod.rs | 1 + policies/crystal_library.rego | 23 ++++ 11 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 backend/crystal_library/Cargo.toml create mode 100644 backend/crystal_library/src/entities/crystal_wells.rs create mode 100644 backend/crystal_library/src/entities/mod.rs create mode 100644 backend/crystal_library/src/graphql.rs create mode 100644 backend/crystal_library/src/main.rs create mode 100644 backend/crystal_library/src/migrator.rs create mode 100644 backend/crystal_library/src/resolvers/crystal_wells_res.rs create mode 100644 backend/crystal_library/src/resolvers/mod.rs create mode 100644 policies/crystal_library.rego diff --git a/backend/Cargo.lock b/backend/Cargo.lock index c3124f19..634710f8 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1353,6 +1353,26 @@ dependencies = [ "typenum", ] +[[package]] +name = "crystal_library" +version = "0.1.0" +dependencies = [ + "async-graphql", + "axum", + "clap 4.5.1", + "dotenvy", + "graphql_endpoints", + "opa_client", + "sea-orm", + "sea-orm-migration", + "the_paginator", + "tokio", + "tracing", + "tracing-subscriber", + "url", + "uuid", +] + [[package]] name = "cynic" version = "3.4.3" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 99275c31..ffa16f80 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -2,7 +2,8 @@ members = [ "chimp_chomp", "chimp_controller", - "chimp_protocol", + "chimp_protocol", + "crystal_library", "compound_library", "graphql_endpoints", "graphql_event_broker", diff --git a/backend/crystal_library/Cargo.toml b/backend/crystal_library/Cargo.toml new file mode 100644 index 00000000..892aa2f4 --- /dev/null +++ b/backend/crystal_library/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "crystal_library" +version = "0.1.0" +edition = "2021" + +[dependencies] +async-graphql = { workspace = true } +axum = { workspace = true } +clap = { workspace = true } +dotenvy = { workspace = true } +graphql_endpoints = { path = "../graphql_endpoints" } +opa_client = { path = "../opa_client", features = ["graphql"] } +sea-orm = { workspace = true, features = ["sqlx-postgres"] } +sea-orm-migration = { workspace = true } +the_paginator = { version = "0.1.0", path = "../the_paginator", features = [ + "async-graphql", +] } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +tokio = { workspace = true } +url = { workspace = true } +uuid = { workspace = true } diff --git a/backend/crystal_library/src/entities/crystal_wells.rs b/backend/crystal_library/src/entities/crystal_wells.rs new file mode 100644 index 00000000..f53667ab --- /dev/null +++ b/backend/crystal_library/src/entities/crystal_wells.rs @@ -0,0 +1,23 @@ +//src/entities/compound_instances.rs + +use async_graphql::SimpleObject; +use sea_orm::{ + ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait, + EnumIter, PrimaryKeyTrait, +}; +use uuid::Uuid; + +#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, SimpleObject)] +#[sea_orm(table_name = "crystal_wells")] +#[graphql(name = "crystal_wells")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: Uuid, + pub plate_id: Uuid, + pub well_num: i16, +} + +#[derive(Clone, Copy, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/backend/crystal_library/src/entities/mod.rs b/backend/crystal_library/src/entities/mod.rs new file mode 100644 index 00000000..65016eb6 --- /dev/null +++ b/backend/crystal_library/src/entities/mod.rs @@ -0,0 +1 @@ +pub mod crystal_wells; diff --git a/backend/crystal_library/src/graphql.rs b/backend/crystal_library/src/graphql.rs new file mode 100644 index 00000000..d4ce83a3 --- /dev/null +++ b/backend/crystal_library/src/graphql.rs @@ -0,0 +1,16 @@ +// src/graphql.rs + +use crate::resolvers::crystal_wells_res::{CrystalMutation, CrystalQuery}; +use async_graphql::{EmptySubscription, MergedObject, Schema, SchemaBuilder}; + +#[derive(Debug, Clone, MergedObject, Default)] +pub struct Query(CrystalQuery); + +#[derive(Debug, Clone, MergedObject, Default)] +pub struct Mutation(CrystalMutation); + +pub type RootSchema = Schema; + +pub fn root_schema_builder() -> SchemaBuilder { + Schema::build(Query::default(), Mutation::default(), EmptySubscription).enable_federation() +} diff --git a/backend/crystal_library/src/main.rs b/backend/crystal_library/src/main.rs new file mode 100644 index 00000000..1b02b7b8 --- /dev/null +++ b/backend/crystal_library/src/main.rs @@ -0,0 +1,113 @@ +// main.rs + +mod entities; +mod graphql; +mod migrator; +mod resolvers; + +use async_graphql::extensions::Tracing; +use axum::{routing::get, Router, Server}; +use clap::Parser; +use graphql::{root_schema_builder, RootSchema}; +use graphql_endpoints::{GraphQLHandler, GraphQLSubscription, GraphiQLHandler}; +use opa_client::OPAClient; +use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr, TransactionError}; +use sea_orm_migration::MigratorTrait; +use std::{ + fs::File, + io::Write, + net::{Ipv4Addr, SocketAddr, SocketAddrV4}, + path::PathBuf, +}; +use url::Url; + +#[derive(Debug, Parser)] +#[command(author, version, about, long_about = None)] +#[allow(clippy::large_enum_variant)] +enum Cli { + Serve(ServeArgs), + Schema(SchemaArgs), +} + +#[derive(Debug, Parser)] +struct ServeArgs { + #[arg(short, long, default_value_t = 80)] + port: u16, + #[arg(long, env)] + database_url: Url, + #[arg(long, env)] + opa_url: Url, +} + +#[derive(Debug, Parser)] +struct SchemaArgs { + #[arg(short, long)] + path: Option, +} + +async fn setup_database() -> Result> { + let db_url = + ConnectOptions::new("postgres://postgres:password@postgres/crystal_library".to_string()); + let db = Database::connect(db_url).await?; + migrator::Migrator::up(&db, None).await?; + Ok(db) +} + +fn setup_router(schema: RootSchema) -> Router { + const GRAPHQL_ENDPOINT: &str = "/"; + const SUBSCRIPTION_ENDPOINT: &str = "/ws"; + + Router::new() + .route( + GRAPHQL_ENDPOINT, + get(GraphiQLHandler::new( + GRAPHQL_ENDPOINT, + SUBSCRIPTION_ENDPOINT, + )) + .post(GraphQLHandler::new(schema.clone())), + ) + .route_service(SUBSCRIPTION_ENDPOINT, GraphQLSubscription::new(schema)) +} + +async fn serve(router: Router) { + let socket_addr: SocketAddr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 82)); + println!("GraphiQL IDE: {}", socket_addr); + Server::bind(&socket_addr) + .serve(router.into_make_service()) + .await + .unwrap(); +} + +#[tokio::main] +async fn main() { + dotenvy::dotenv().ok(); + let args = Cli::parse(); + let tracing_subscriber = tracing_subscriber::FmtSubscriber::builder() + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .finish(); + tracing::subscriber::set_global_default(tracing_subscriber).unwrap(); + + match args { + Cli::Serve(args) => { + let db = setup_database().await.unwrap(); + let opa_client = OPAClient::new(args.opa_url); + let schema = root_schema_builder() + .data(db) + .data(opa_client) + .extension(Tracing) + .finish(); + let router = setup_router(schema); + serve(router).await; + } + Cli::Schema(args) => { + let schema = root_schema_builder().finish(); + let schema_string = schema.sdl(); + if let Some(path) = args.path { + let mut file = File::create(path).unwrap(); + file.write_all(schema_string.as_bytes()).unwrap(); + } else { + println!("{}", schema_string); + } + } + } +} diff --git a/backend/crystal_library/src/migrator.rs b/backend/crystal_library/src/migrator.rs new file mode 100644 index 00000000..b88b0528 --- /dev/null +++ b/backend/crystal_library/src/migrator.rs @@ -0,0 +1,32 @@ +// src/migrator.rs + +use crate::entities::crystal_wells; +use axum::async_trait; +use sea_orm::{DbErr, DeriveMigrationName, Schema}; +use sea_orm_migration::{MigrationTrait, MigratorTrait, SchemaManager}; + +pub struct Migrator; + +#[derive(DeriveMigrationName)] +struct Initial; + +#[async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![Box::new(Initial)] + } +} + +#[async_trait] +impl MigrationTrait for Initial { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let backend = manager.get_database_backend(); + let schema = Schema::new(backend); + + manager + .create_table(schema.create_table_from_entity(crystal_wells::Entity)) + .await?; + + Ok(()) + } +} diff --git a/backend/crystal_library/src/resolvers/crystal_wells_res.rs b/backend/crystal_library/src/resolvers/crystal_wells_res.rs new file mode 100644 index 00000000..69caadc6 --- /dev/null +++ b/backend/crystal_library/src/resolvers/crystal_wells_res.rs @@ -0,0 +1,62 @@ +// src/resolvers/crystal_wells_res.rs + +use crate::entities::crystal_wells; +use async_graphql::{Context, Object}; +use opa_client::subject_authorization; +use sea_orm::{ActiveValue, DatabaseConnection, EntityTrait}; +use the_paginator::graphql::{CursorInput, ModelConnection}; +use uuid::Uuid; + +#[derive(Debug, Clone, Default)] +pub struct CrystalQuery; + +#[derive(Debug, Clone, Default)] +pub struct CrystalMutation; + +#[Object] +impl CrystalQuery { + async fn crystals( + &self, + ctx: &Context<'_>, + cursor: CursorInput, + ) -> async_graphql::Result> { + subject_authorization!("xchemlab.crystal_library.read_crystal", ctx).await?; + let db = ctx.data::()?; + Ok(cursor + .try_into_query_cursor::()? + .all(db) + .await? + .try_into_connection()?) + } + + async fn crystal( + &self, + ctx: &Context<'_>, + id: Uuid, + ) -> async_graphql::Result> { + subject_authorization!("xchemlab.crystal_library.read_crystal", ctx).await?; + let db = ctx.data::()?; + Ok(crystal_wells::Entity::find_by_id(id).one(db).await?) + } +} + +#[Object] +impl CrystalMutation { + async fn add_crystal( + &self, + ctx: &Context<'_>, + plate_id: Uuid, + well_num: i16, + ) -> async_graphql::Result { + subject_authorization!("xchemlab.crystal_library.write_crystal", ctx).await?; + let db = ctx.data::()?; + let crystal = crystal_wells::ActiveModel { + id: ActiveValue::Set(Uuid::now_v7()), + plate_id: ActiveValue::Set(plate_id), + well_num: ActiveValue::Set(well_num), + }; + Ok(crystal_wells::Entity::insert(crystal) + .exec_with_returning(db) + .await?) + } +} diff --git a/backend/crystal_library/src/resolvers/mod.rs b/backend/crystal_library/src/resolvers/mod.rs new file mode 100644 index 00000000..e40eb711 --- /dev/null +++ b/backend/crystal_library/src/resolvers/mod.rs @@ -0,0 +1 @@ +pub mod crystal_wells_res; diff --git a/policies/crystal_library.rego b/policies/crystal_library.rego new file mode 100644 index 00000000..1dad6602 --- /dev/null +++ b/policies/crystal_library.rego @@ -0,0 +1,23 @@ +package xchemlab.crystal_library + +import data.xchemlab +import rego.v1 + +default read_crystal = {"allowed" : false} +default write_crystal = {"allowed" : false} + +read_crystal = response if { + xchemlab.valid_token + response := { + "allowed": true, + "subject": xchemlab.subject, + } +} + +write_crystal = response if { + xchemlab.valid_token + response := { + "allowed" : true, + "subject" : xchemlab.subject, + } +} From bfd27253b3e3a845f452be5d2cbc35c03637af32 Mon Sep 17 00:00:00 2001 From: iamvigneshwars Date: Mon, 19 Feb 2024 14:34:11 +0000 Subject: [PATCH 06/10] Graphql query and mutation for crystal library --- backend/Cargo.lock | 67 ++++++++++--------- backend/crystal_library/Cargo.toml | 1 + .../src/entities/crystal_wells.rs | 7 +- .../crystal_wells_res.rs | 12 ++-- .../src/{graphql.rs => graphql/mod.rs} | 4 +- backend/crystal_library/src/main.rs | 3 - backend/crystal_library/src/migrator.rs | 2 - backend/crystal_library/src/resolvers/mod.rs | 1 - 8 files changed, 48 insertions(+), 49 deletions(-) rename backend/crystal_library/src/{resolvers => graphql}/crystal_wells_res.rs (84%) rename backend/crystal_library/src/{graphql.rs => graphql/mod.rs} (84%) delete mode 100644 backend/crystal_library/src/resolvers/mod.rs diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 634710f8..adfec3fc 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -40,9 +40,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "once_cell", @@ -323,7 +323,7 @@ dependencies = [ "proc-macro2", "quote", "strum", - "syn 2.0.49", + "syn 2.0.50", "thiserror", ] @@ -441,7 +441,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -458,7 +458,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -865,7 +865,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -1196,7 +1196,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -1359,6 +1359,7 @@ version = "0.1.0" dependencies = [ "async-graphql", "axum", + "chrono", "clap 4.5.1", "dotenvy", "graphql_endpoints", @@ -1402,7 +1403,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.49", + "syn 2.0.50", "thiserror", ] @@ -1415,7 +1416,7 @@ dependencies = [ "cynic-codegen", "darling", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -1439,7 +1440,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -1450,7 +1451,7 @@ checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -1816,7 +1817,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -1983,7 +1984,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.9", "allocator-api2", ] @@ -2701,9 +2702,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.63" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ "bitflags 2.4.2", "cfg-if", @@ -2722,7 +2723,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -2733,9 +2734,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.99" +version = "0.9.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +checksum = "ae94056a791d0e1217d18b6cbdccb02c61e3054fc69893607f4067e3bb0b1fd1" dependencies = [ "cc", "libc", @@ -2813,7 +2814,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -2951,7 +2952,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -3020,7 +3021,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -3179,7 +3180,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", "version_check", "yansi", ] @@ -3301,7 +3302,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -3793,7 +3794,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -4111,7 +4112,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -4133,9 +4134,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -4265,7 +4266,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -4348,7 +4349,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -4486,7 +4487,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -4793,7 +4794,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", "wasm-bindgen-shared", ] @@ -4827,7 +4828,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5114,7 +5115,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] diff --git a/backend/crystal_library/Cargo.toml b/backend/crystal_library/Cargo.toml index 892aa2f4..332fdd44 100644 --- a/backend/crystal_library/Cargo.toml +++ b/backend/crystal_library/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" async-graphql = { workspace = true } axum = { workspace = true } clap = { workspace = true } +chrono ={ workspace = true } dotenvy = { workspace = true } graphql_endpoints = { path = "../graphql_endpoints" } opa_client = { path = "../opa_client", features = ["graphql"] } diff --git a/backend/crystal_library/src/entities/crystal_wells.rs b/backend/crystal_library/src/entities/crystal_wells.rs index f53667ab..7b8bf3ee 100644 --- a/backend/crystal_library/src/entities/crystal_wells.rs +++ b/backend/crystal_library/src/entities/crystal_wells.rs @@ -1,6 +1,5 @@ -//src/entities/compound_instances.rs - use async_graphql::SimpleObject; +use chrono::{DateTime, Utc}; use sea_orm::{ ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait, EnumIter, PrimaryKeyTrait, @@ -14,7 +13,9 @@ pub struct Model { #[sea_orm(primary_key, auto_increment = false)] pub id: Uuid, pub plate_id: Uuid, - pub well_num: i16, + pub well_number: i16, + pub operator_id: String, + pub timestamp: DateTime, } #[derive(Clone, Copy, Debug, EnumIter, DeriveRelation)] diff --git a/backend/crystal_library/src/resolvers/crystal_wells_res.rs b/backend/crystal_library/src/graphql/crystal_wells_res.rs similarity index 84% rename from backend/crystal_library/src/resolvers/crystal_wells_res.rs rename to backend/crystal_library/src/graphql/crystal_wells_res.rs index 69caadc6..c8eb6ee2 100644 --- a/backend/crystal_library/src/resolvers/crystal_wells_res.rs +++ b/backend/crystal_library/src/graphql/crystal_wells_res.rs @@ -1,7 +1,6 @@ -// src/resolvers/crystal_wells_res.rs - use crate::entities::crystal_wells; use async_graphql::{Context, Object}; +use chrono::Utc; use opa_client::subject_authorization; use sea_orm::{ActiveValue, DatabaseConnection, EntityTrait}; use the_paginator::graphql::{CursorInput, ModelConnection}; @@ -46,14 +45,17 @@ impl CrystalMutation { &self, ctx: &Context<'_>, plate_id: Uuid, - well_num: i16, + well_number: i16, ) -> async_graphql::Result { - subject_authorization!("xchemlab.crystal_library.write_crystal", ctx).await?; + let operator_id = + subject_authorization!("xchemlab.crystal_library.write_crystal", ctx).await?; let db = ctx.data::()?; let crystal = crystal_wells::ActiveModel { id: ActiveValue::Set(Uuid::now_v7()), plate_id: ActiveValue::Set(plate_id), - well_num: ActiveValue::Set(well_num), + well_number: ActiveValue::Set(well_number), + operator_id: ActiveValue::Set(operator_id), + timestamp: ActiveValue::Set(Utc::now()), }; Ok(crystal_wells::Entity::insert(crystal) .exec_with_returning(db) diff --git a/backend/crystal_library/src/graphql.rs b/backend/crystal_library/src/graphql/mod.rs similarity index 84% rename from backend/crystal_library/src/graphql.rs rename to backend/crystal_library/src/graphql/mod.rs index d4ce83a3..34ed5ec7 100644 --- a/backend/crystal_library/src/graphql.rs +++ b/backend/crystal_library/src/graphql/mod.rs @@ -1,7 +1,7 @@ -// src/graphql.rs +pub mod crystal_wells_res; -use crate::resolvers::crystal_wells_res::{CrystalMutation, CrystalQuery}; use async_graphql::{EmptySubscription, MergedObject, Schema, SchemaBuilder}; +use crystal_wells_res::{CrystalMutation, CrystalQuery}; #[derive(Debug, Clone, MergedObject, Default)] pub struct Query(CrystalQuery); diff --git a/backend/crystal_library/src/main.rs b/backend/crystal_library/src/main.rs index 1b02b7b8..05646313 100644 --- a/backend/crystal_library/src/main.rs +++ b/backend/crystal_library/src/main.rs @@ -1,9 +1,6 @@ -// main.rs - mod entities; mod graphql; mod migrator; -mod resolvers; use async_graphql::extensions::Tracing; use axum::{routing::get, Router, Server}; diff --git a/backend/crystal_library/src/migrator.rs b/backend/crystal_library/src/migrator.rs index b88b0528..9024bedd 100644 --- a/backend/crystal_library/src/migrator.rs +++ b/backend/crystal_library/src/migrator.rs @@ -1,5 +1,3 @@ -// src/migrator.rs - use crate::entities::crystal_wells; use axum::async_trait; use sea_orm::{DbErr, DeriveMigrationName, Schema}; diff --git a/backend/crystal_library/src/resolvers/mod.rs b/backend/crystal_library/src/resolvers/mod.rs deleted file mode 100644 index e40eb711..00000000 --- a/backend/crystal_library/src/resolvers/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod crystal_wells_res; From e83e9a87579bac92beb2018226a1f74ddad2aa63 Mon Sep 17 00:00:00 2001 From: iamvigneshwars Date: Tue, 20 Feb 2024 11:10:19 +0000 Subject: [PATCH 07/10] minor refactor and rewrite opa policy for crystal library --- .../src/entities/crystal_wells.rs | 2 +- .../src/graphql/crystal_wells_res.rs | 12 ++++++---- backend/crystal_library/src/main.rs | 24 +++++++++++-------- policies/crystal_library.rego | 13 ++-------- 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/backend/crystal_library/src/entities/crystal_wells.rs b/backend/crystal_library/src/entities/crystal_wells.rs index 7b8bf3ee..1ee2e918 100644 --- a/backend/crystal_library/src/entities/crystal_wells.rs +++ b/backend/crystal_library/src/entities/crystal_wells.rs @@ -11,8 +11,8 @@ use uuid::Uuid; #[graphql(name = "crystal_wells")] pub struct Model { #[sea_orm(primary_key, auto_increment = false)] - pub id: Uuid, pub plate_id: Uuid, + #[sea_orm(primary_key, auto_increment = false)] pub well_number: i16, pub operator_id: String, pub timestamp: DateTime, diff --git a/backend/crystal_library/src/graphql/crystal_wells_res.rs b/backend/crystal_library/src/graphql/crystal_wells_res.rs index c8eb6ee2..e7cd8bd2 100644 --- a/backend/crystal_library/src/graphql/crystal_wells_res.rs +++ b/backend/crystal_library/src/graphql/crystal_wells_res.rs @@ -2,7 +2,7 @@ use crate::entities::crystal_wells; use async_graphql::{Context, Object}; use chrono::Utc; use opa_client::subject_authorization; -use sea_orm::{ActiveValue, DatabaseConnection, EntityTrait}; +use sea_orm::{ActiveValue, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter}; use the_paginator::graphql::{CursorInput, ModelConnection}; use uuid::Uuid; @@ -31,11 +31,16 @@ impl CrystalQuery { async fn crystal( &self, ctx: &Context<'_>, - id: Uuid, + plate_id: Uuid, + well_number: i16, ) -> async_graphql::Result> { subject_authorization!("xchemlab.crystal_library.read_crystal", ctx).await?; let db = ctx.data::()?; - Ok(crystal_wells::Entity::find_by_id(id).one(db).await?) + Ok(crystal_wells::Entity::find() + .filter(crystal_wells::Column::PlateId.eq(plate_id)) + .filter(crystal_wells::Column::WellNumber.eq(well_number)) + .one(db) + .await?) } } @@ -51,7 +56,6 @@ impl CrystalMutation { subject_authorization!("xchemlab.crystal_library.write_crystal", ctx).await?; let db = ctx.data::()?; let crystal = crystal_wells::ActiveModel { - id: ActiveValue::Set(Uuid::now_v7()), plate_id: ActiveValue::Set(plate_id), well_number: ActiveValue::Set(well_number), operator_id: ActiveValue::Set(operator_id), diff --git a/backend/crystal_library/src/main.rs b/backend/crystal_library/src/main.rs index 05646313..2a84954c 100644 --- a/backend/crystal_library/src/main.rs +++ b/backend/crystal_library/src/main.rs @@ -42,12 +42,16 @@ struct SchemaArgs { path: Option, } -async fn setup_database() -> Result> { - let db_url = - ConnectOptions::new("postgres://postgres:password@postgres/crystal_library".to_string()); - let db = Database::connect(db_url).await?; - migrator::Migrator::up(&db, None).await?; - Ok(db) +async fn setup_database( + mut database_url: Url, +) -> Result> { + if database_url.path().is_empty() { + database_url.set_path("crystal_library"); + } + let connection_options = ConnectOptions::new(database_url.to_string()); + let connection = Database::connect(connection_options).await?; + migrator::Migrator::up(&connection, None).await?; + Ok(connection) } fn setup_router(schema: RootSchema) -> Router { @@ -66,8 +70,8 @@ fn setup_router(schema: RootSchema) -> Router { .route_service(SUBSCRIPTION_ENDPOINT, GraphQLSubscription::new(schema)) } -async fn serve(router: Router) { - let socket_addr: SocketAddr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 82)); +async fn serve(router: Router, port: u16) { + let socket_addr: SocketAddr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, port)); println!("GraphiQL IDE: {}", socket_addr); Server::bind(&socket_addr) .serve(router.into_make_service()) @@ -86,7 +90,7 @@ async fn main() { match args { Cli::Serve(args) => { - let db = setup_database().await.unwrap(); + let db = setup_database(args.database_url).await.unwrap(); let opa_client = OPAClient::new(args.opa_url); let schema = root_schema_builder() .data(db) @@ -94,7 +98,7 @@ async fn main() { .extension(Tracing) .finish(); let router = setup_router(schema); - serve(router).await; + serve(router, args.port).await; } Cli::Schema(args) => { let schema = root_schema_builder().finish(); diff --git a/policies/crystal_library.rego b/policies/crystal_library.rego index 1dad6602..671ff082 100644 --- a/policies/crystal_library.rego +++ b/policies/crystal_library.rego @@ -1,23 +1,14 @@ package xchemlab.crystal_library import data.xchemlab -import rego.v1 default read_crystal = {"allowed" : false} default write_crystal = {"allowed" : false} -read_crystal = response if { +read_crystal = {"allowed": true, "subject": xchemlab.subject} { xchemlab.valid_token - response := { - "allowed": true, - "subject": xchemlab.subject, - } } -write_crystal = response if { +write_crystal = {"allowed" : true, "subject" : xchemlab.subject} { xchemlab.valid_token - response := { - "allowed" : true, - "subject" : xchemlab.subject, - } } From 0de8785e8bd34a0ddd4d33ccd16fc705b8b35f4e Mon Sep 17 00:00:00 2001 From: iamvigneshwars Date: Tue, 20 Feb 2024 12:06:49 +0000 Subject: [PATCH 08/10] Documentation, git workflow, and DockerFile for crystal library --- .github/workflows/container.yml | 1 + backend/Dockerfile | 10 ++++++ backend/crystal_library/README.md | 3 ++ .../src/entities/crystal_wells.rs | 8 +++++ backend/crystal_library/src/entities/mod.rs | 1 + .../src/graphql/crystal_wells_res.rs | 7 +++++ backend/crystal_library/src/graphql/mod.rs | 6 ++++ backend/crystal_library/src/main.rs | 31 ++++++++++++++++++- backend/crystal_library/src/migrator.rs | 3 ++ 9 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 backend/crystal_library/README.md diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index de177af6..7e7999a7 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -14,6 +14,7 @@ jobs: - chimp_chomp - chimp_controller - compound_library + - crystal_library - pin_packing - soakdb_sync - targeting diff --git a/backend/Dockerfile b/backend/Dockerfile index db28e4eb..f63e9f2f 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -12,6 +12,7 @@ COPY chimp_chomp/Cargo.toml chimp_chomp/Cargo.toml COPY chimp_controller/Cargo.toml chimp_controller/Cargo.toml COPY chimp_protocol/Cargo.toml chimp_protocol/Cargo.toml COPY compound_library/Cargo.toml compound_library/Cargo.toml +COPY crystal_library/Cargo.toml crystal_library/Cargo.toml COPY graphql_endpoints/Cargo.toml graphql_endpoints/Cargo.toml COPY graphql_event_broker/Cargo.toml graphql_event_broker/Cargo.toml COPY opa_client/Cargo.toml opa_client/Cargo.toml @@ -28,6 +29,8 @@ RUN mkdir chimp_chomp/src \ && echo "fn main() {}" > chimp_controller/src/main.rs \ && mkdir compound_library/src \ && echo "fn main() {}" > compound_library/src/main.rs \ + && mkdir crystal_library/src \ + && echo "fn main() {}" > crystal_library/src/main.rs \ && mkdir graphql_endpoints/src \ && touch graphql_endpoints/src/lib.rs \ && mkdir graphql_event_broker/src \ @@ -53,6 +56,7 @@ RUN touch chimp_chomp/src/main.rs \ && touch chimp_protocol/src/lib.rs \ && touch chimp_controller/src/main.rs \ && touch compound_library/src/main.rs \ + && touch crystal_library/src/main.rs \ && touch graphql_endpoints/src/lib.rs \ && touch graphql_event_broker/src/lib.rs \ && touch opa_client/src/lib.rs \ @@ -97,6 +101,12 @@ COPY --from=build /app/target/release/compound_library /compound_library ENTRYPOINT ["/compound_library"] +FROM gcr.io/distroless/cc as crystal_library + +COPY --from=build /app/target/release/crystal_library /crystal_library + +ENTRYPOINT ["/crystal_library"] + FROM gcr.io/distroless/cc as soakdb_sync COPY --from=build /app/target/release/soakdb_sync /soakdb_sync diff --git a/backend/crystal_library/README.md b/backend/crystal_library/README.md new file mode 100644 index 00000000..aa00147d --- /dev/null +++ b/backend/crystal_library/README.md @@ -0,0 +1,3 @@ +# Crystal Library Service + +This service keeps track of all the crystals used for expeiments at the Diamond Light Source. diff --git a/backend/crystal_library/src/entities/crystal_wells.rs b/backend/crystal_library/src/entities/crystal_wells.rs index 1ee2e918..504d01b3 100644 --- a/backend/crystal_library/src/entities/crystal_wells.rs +++ b/backend/crystal_library/src/entities/crystal_wells.rs @@ -6,18 +6,26 @@ use sea_orm::{ }; use uuid::Uuid; +/// Represents a crystal within the database. #[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, SimpleObject)] #[sea_orm(table_name = "crystal_wells")] #[graphql(name = "crystal_wells")] pub struct Model { + /// ID of the plate on which the crystal is located. #[sea_orm(primary_key, auto_increment = false)] pub plate_id: Uuid, + /// The well on the plate which the crystal is located. #[sea_orm(primary_key, auto_increment = false)] pub well_number: i16, + /// The identifier of the operator which added this entry. pub operator_id: String, + /// The date and time when the compound instance was added. pub timestamp: DateTime, + /// Project proposal number + pub proposal_number: i32, } +#[allow(clippy::missing_docs_in_private_items)] #[derive(Clone, Copy, Debug, EnumIter, DeriveRelation)] pub enum Relation {} diff --git a/backend/crystal_library/src/entities/mod.rs b/backend/crystal_library/src/entities/mod.rs index 65016eb6..32bd7175 100644 --- a/backend/crystal_library/src/entities/mod.rs +++ b/backend/crystal_library/src/entities/mod.rs @@ -1 +1,2 @@ +/// The crystal wells modules pub mod crystal_wells; diff --git a/backend/crystal_library/src/graphql/crystal_wells_res.rs b/backend/crystal_library/src/graphql/crystal_wells_res.rs index e7cd8bd2..49d089cf 100644 --- a/backend/crystal_library/src/graphql/crystal_wells_res.rs +++ b/backend/crystal_library/src/graphql/crystal_wells_res.rs @@ -6,14 +6,17 @@ use sea_orm::{ActiveValue, ColumnTrait, DatabaseConnection, EntityTrait, QueryFi use the_paginator::graphql::{CursorInput, ModelConnection}; use uuid::Uuid; +/// CrystalQuery is a type that represents all the queries for the crystals. #[derive(Debug, Clone, Default)] pub struct CrystalQuery; +/// CrystalMutation is a type that represents all the mutations for the crystals. #[derive(Debug, Clone, Default)] pub struct CrystalMutation; #[Object] impl CrystalQuery { + /// This function fetches all crystals related from the database. async fn crystals( &self, ctx: &Context<'_>, @@ -28,6 +31,7 @@ impl CrystalQuery { .try_into_connection()?) } + /// This function fetches a single crystal using the plate_id and well number. async fn crystal( &self, ctx: &Context<'_>, @@ -46,11 +50,13 @@ impl CrystalQuery { #[Object] impl CrystalMutation { + /// This function adds a crystal to the database async fn add_crystal( &self, ctx: &Context<'_>, plate_id: Uuid, well_number: i16, + proposal_number: i32, ) -> async_graphql::Result { let operator_id = subject_authorization!("xchemlab.crystal_library.write_crystal", ctx).await?; @@ -58,6 +64,7 @@ impl CrystalMutation { let crystal = crystal_wells::ActiveModel { plate_id: ActiveValue::Set(plate_id), well_number: ActiveValue::Set(well_number), + proposal_number: ActiveValue::Set(proposal_number), operator_id: ActiveValue::Set(operator_id), timestamp: ActiveValue::Set(Utc::now()), }; diff --git a/backend/crystal_library/src/graphql/mod.rs b/backend/crystal_library/src/graphql/mod.rs index 34ed5ec7..3944aad1 100644 --- a/backend/crystal_library/src/graphql/mod.rs +++ b/backend/crystal_library/src/graphql/mod.rs @@ -1,16 +1,22 @@ +/// The cyrstal wells resolver module pub mod crystal_wells_res; use async_graphql::{EmptySubscription, MergedObject, Schema, SchemaBuilder}; use crystal_wells_res::{CrystalMutation, CrystalQuery}; +/// Combines all query resolvers into a single GraphQL `Query` type. #[derive(Debug, Clone, MergedObject, Default)] pub struct Query(CrystalQuery); +/// Combines all mutation resolvers into a single GraphQL `Query` type. #[derive(Debug, Clone, MergedObject, Default)] pub struct Mutation(CrystalMutation); +/// Type alias for the complete GraphQL schema. pub type RootSchema = Schema; +/// This function initializes the schema with default instances of `Query`, +/// `Mutation`, and `EmptySubscription`. pub fn root_schema_builder() -> SchemaBuilder { Schema::build(Query::default(), Mutation::default(), EmptySubscription).enable_federation() } diff --git a/backend/crystal_library/src/main.rs b/backend/crystal_library/src/main.rs index 2a84954c..ab357f51 100644 --- a/backend/crystal_library/src/main.rs +++ b/backend/crystal_library/src/main.rs @@ -1,5 +1,15 @@ +#![forbid(unsafe_code)] +#![warn(missing_docs)] +#![warn(clippy::missing_docs_in_private_items)] +#![doc=include_str!("../README.md")] + +/// This module defines the structure and schema of the database tables +/// through various entity structs. mod entities; +/// This module sets up the GraphQL schema, including queries, mutations, +/// and subscriptions. It defines how data is queried and mutated through the API. mod graphql; +/// This module is responsible for defining and applying database migrations. mod migrator; use async_graphql::extensions::Tracing; @@ -18,30 +28,44 @@ use std::{ }; use url::Url; +/// A service for tracking crystals available in the XChem lab #[derive(Debug, Parser)] #[command(author, version, about, long_about = None)] -#[allow(clippy::large_enum_variant)] enum Cli { + /// Starts a webserver serving the GraphQL API Serve(ServeArgs), + /// Prints the GraphQL API to stdout Schema(SchemaArgs), } #[derive(Debug, Parser)] +#[allow(clippy::missing_docs_in_private_items)] struct ServeArgs { + /// The port number to serve on #[arg(short, long, default_value_t = 80)] port: u16, + /// URL for the database #[arg(long, env)] database_url: Url, + /// URL for the OPA server #[arg(long, env)] opa_url: Url, } +/// Arguments for the `schema` command #[derive(Debug, Parser)] struct SchemaArgs { + /// Specifies an optional path to the file to save the schema #[arg(short, long)] path: Option, } +/// Sets up the database connection and performs the migrations +/// The database name is set of compound_library if not provided +/// +/// Returns a `Result` with a `DatabaseConnection` on success, +/// or a `TransactionError` if connecting to the database or running +/// migrations fails async fn setup_database( mut database_url: Url, ) -> Result> { @@ -54,8 +78,12 @@ async fn setup_database( Ok(connection) } +/// Sets up the router for handling GraphQL queries and subscriptions +/// Returns a `Router` configured with routes fn setup_router(schema: RootSchema) -> Router { + /// The endpoint for handling GraphQL queries and mutations const GRAPHQL_ENDPOINT: &str = "/"; + /// The endpoint for establishing WebSocket connections for GraphQL subscriptions const SUBSCRIPTION_ENDPOINT: &str = "/ws"; Router::new() @@ -70,6 +98,7 @@ fn setup_router(schema: RootSchema) -> Router { .route_service(SUBSCRIPTION_ENDPOINT, GraphQLSubscription::new(schema)) } +/// Starts a web server to handle HTTP requests as defined in the provided `router` async fn serve(router: Router, port: u16) { let socket_addr: SocketAddr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, port)); println!("GraphiQL IDE: {}", socket_addr); diff --git a/backend/crystal_library/src/migrator.rs b/backend/crystal_library/src/migrator.rs index 9024bedd..7b9c2ca8 100644 --- a/backend/crystal_library/src/migrator.rs +++ b/backend/crystal_library/src/migrator.rs @@ -3,8 +3,11 @@ use axum::async_trait; use sea_orm::{DbErr, DeriveMigrationName, Schema}; use sea_orm_migration::{MigrationTrait, MigratorTrait, SchemaManager}; +/// Migrator for managing and applying database migrations. pub struct Migrator; +/// This struct is used to define the very first migration that sets up +/// the initial database schema. #[derive(DeriveMigrationName)] struct Initial; From a5099d8e1bfc7b77e44ae1d40883a1456e7c1497 Mon Sep 17 00:00:00 2001 From: iamvigneshwars Date: Thu, 22 Feb 2024 10:50:44 +0000 Subject: [PATCH 09/10] Track crystal plates for crystal library --- .../src/entities/crystal_plates.rs | 40 ++++++++++ .../src/entities/crystal_wells.rs | 25 ++++-- backend/crystal_library/src/entities/mod.rs | 2 + .../src/graphql/crystal_plates_res.rs | 78 +++++++++++++++++++ .../src/graphql/crystal_wells_res.rs | 47 ++++++----- backend/crystal_library/src/graphql/mod.rs | 9 ++- backend/crystal_library/src/migrator.rs | 6 +- policies/crystal_library.rego | 18 ++++- 8 files changed, 193 insertions(+), 32 deletions(-) create mode 100644 backend/crystal_library/src/entities/crystal_plates.rs create mode 100644 backend/crystal_library/src/graphql/crystal_plates_res.rs diff --git a/backend/crystal_library/src/entities/crystal_plates.rs b/backend/crystal_library/src/entities/crystal_plates.rs new file mode 100644 index 00000000..cd595a70 --- /dev/null +++ b/backend/crystal_library/src/entities/crystal_plates.rs @@ -0,0 +1,40 @@ +use super::crystal_wells; +use async_graphql::SimpleObject; +use chrono::{DateTime, Utc}; +use sea_orm::{ + ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait, + EnumIter, PrimaryKeyTrait, Related, RelationDef, RelationTrait, +}; +use uuid::Uuid; + +/// Represents a plate on which crystals are located. +#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, SimpleObject)] +#[sea_orm(table_name = "crystal_plates")] +#[graphql(name = "crystal_plates", complex)] +pub struct Model { + /// ID of the plate on which the crystal is located. + #[sea_orm(primary_key, auto_increment = false)] + pub plate_id: Uuid, + /// Project proposal number + pub proposal_number: i32, + /// The identifier of the operator which added this entry. + pub operator_id: String, + /// The date and time when the compound instance was added. + pub timestamp: DateTime, +} + +/// Defines the relationships between entities in the database schema +#[derive(Clone, Copy, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + /// Defines the relations between the crystal wells and crystal plates + #[sea_orm(has_many = "crystal_wells::Entity")] + CrystalWells, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::CrystalWells.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/backend/crystal_library/src/entities/crystal_wells.rs b/backend/crystal_library/src/entities/crystal_wells.rs index 504d01b3..2b087db2 100644 --- a/backend/crystal_library/src/entities/crystal_wells.rs +++ b/backend/crystal_library/src/entities/crystal_wells.rs @@ -1,15 +1,16 @@ +use super::crystal_plates; use async_graphql::SimpleObject; use chrono::{DateTime, Utc}; use sea_orm::{ ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait, - EnumIter, PrimaryKeyTrait, + EnumIter, PrimaryKeyTrait, Related, RelationDef, RelationTrait, }; use uuid::Uuid; /// Represents a crystal within the database. #[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, SimpleObject)] #[sea_orm(table_name = "crystal_wells")] -#[graphql(name = "crystal_wells")] +#[graphql(name = "crystal_wells", complex)] pub struct Model { /// ID of the plate on which the crystal is located. #[sea_orm(primary_key, auto_increment = false)] @@ -21,12 +22,24 @@ pub struct Model { pub operator_id: String, /// The date and time when the compound instance was added. pub timestamp: DateTime, - /// Project proposal number - pub proposal_number: i32, } -#[allow(clippy::missing_docs_in_private_items)] +/// Defines the relationships between entities in the database schema #[derive(Clone, Copy, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +pub enum Relation { + #[sea_orm( + belongs_to = "crystal_plates::Entity", + from = "Column::PlateId", + to = "crystal_plates::Column::PlateId" + )] + /// Defines the relations between the crystal plates and crystal wells + CrystalPlates, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::CrystalPlates.def() + } +} impl ActiveModelBehavior for ActiveModel {} diff --git a/backend/crystal_library/src/entities/mod.rs b/backend/crystal_library/src/entities/mod.rs index 32bd7175..a519ea01 100644 --- a/backend/crystal_library/src/entities/mod.rs +++ b/backend/crystal_library/src/entities/mod.rs @@ -1,2 +1,4 @@ +/// The crystal plates module +pub mod crystal_plates; /// The crystal wells modules pub mod crystal_wells; diff --git a/backend/crystal_library/src/graphql/crystal_plates_res.rs b/backend/crystal_library/src/graphql/crystal_plates_res.rs new file mode 100644 index 00000000..6686dd25 --- /dev/null +++ b/backend/crystal_library/src/graphql/crystal_plates_res.rs @@ -0,0 +1,78 @@ +use crate::entities::{crystal_plates, crystal_wells}; +use async_graphql::{ComplexObject, Context, Object}; +use chrono::Utc; +use opa_client::subject_authorization; +use sea_orm::{ActiveValue, DatabaseConnection, EntityTrait, ModelTrait}; +use the_paginator::graphql::{CursorInput, ModelConnection}; +use uuid::Uuid; + +/// CrystalQuery is a type that represents all the queries for the crystals. +#[derive(Debug, Clone, Default)] +pub struct CrystalPlatesQuery; + +/// CrystalMutation is a type that represents all the mutations for the crystals. +#[derive(Debug, Clone, Default)] +pub struct CrystalPlatesMutation; + +#[ComplexObject] +impl crystal_plates::Model { + /// This function fetches all crystal well on the crytal plate + async fn wells(&self, ctx: &Context<'_>) -> async_graphql::Result> { + subject_authorization!("xchemlab.crystal_library.read_crystal_plates", ctx).await?; + let db = ctx.data::()?; + Ok(self.find_related(crystal_wells::Entity).all(db).await?) + } +} + +#[Object] +impl CrystalPlatesQuery { + /// Fetches all crystal plates from the database. + async fn crystal_plates( + &self, + ctx: &Context<'_>, + cursor: CursorInput, + ) -> async_graphql::Result> { + subject_authorization!("xchemlab.crystal_library.read_crystal_plates", ctx).await?; + let db = ctx.data::()?; + Ok(cursor + .try_into_query_cursor::()? + .all(db) + .await? + .try_into_connection()?) + } + + /// Fetches a single crystal plate using the plate_id. + async fn crystal_plate( + &self, + ctx: &Context<'_>, + plate_id: Uuid, + ) -> async_graphql::Result> { + subject_authorization!("xchemlab.crystal_library.read_crystal_plates", ctx).await?; + let db = ctx.data::()?; + Ok(crystal_plates::Entity::find_by_id(plate_id).one(db).await?) + } +} + +#[Object] +impl CrystalPlatesMutation { + /// Adds a crystal plates to the database + async fn add_crystal_plate( + &self, + ctx: &Context<'_>, + plate_id: Uuid, + proposal_number: i32, + ) -> async_graphql::Result { + let operator_id = + subject_authorization!("xchemlab.crystal_library.write_crystal_plates", ctx).await?; + let db = ctx.data::()?; + let crystal = crystal_plates::ActiveModel { + plate_id: ActiveValue::Set(plate_id), + proposal_number: ActiveValue::Set(proposal_number), + operator_id: ActiveValue::Set(operator_id), + timestamp: ActiveValue::Set(Utc::now()), + }; + Ok(crystal_plates::Entity::insert(crystal) + .exec_with_returning(db) + .await?) + } +} diff --git a/backend/crystal_library/src/graphql/crystal_wells_res.rs b/backend/crystal_library/src/graphql/crystal_wells_res.rs index 49d089cf..2f233bac 100644 --- a/backend/crystal_library/src/graphql/crystal_wells_res.rs +++ b/backend/crystal_library/src/graphql/crystal_wells_res.rs @@ -1,28 +1,41 @@ -use crate::entities::crystal_wells; -use async_graphql::{Context, Object}; +use crate::entities::{crystal_plates, crystal_wells}; +use async_graphql::{ComplexObject, Context, Object}; use chrono::Utc; use opa_client::subject_authorization; -use sea_orm::{ActiveValue, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter}; +use sea_orm::{ActiveValue, ColumnTrait, DatabaseConnection, EntityTrait, ModelTrait, QueryFilter}; use the_paginator::graphql::{CursorInput, ModelConnection}; use uuid::Uuid; /// CrystalQuery is a type that represents all the queries for the crystals. #[derive(Debug, Clone, Default)] -pub struct CrystalQuery; +pub struct CrystalWellsQuery; /// CrystalMutation is a type that represents all the mutations for the crystals. #[derive(Debug, Clone, Default)] -pub struct CrystalMutation; +pub struct CrystalWellsMutation; + +#[ComplexObject] +impl crystal_wells::Model { + /// Fetches all crystal well on the crytal plate + async fn plate( + &self, + ctx: &Context<'_>, + ) -> async_graphql::Result> { + subject_authorization!("xchemlab.crystal_library.read_crystal_wells", ctx).await?; + let db = ctx.data::()?; + Ok(self.find_related(crystal_plates::Entity).one(db).await?) + } +} #[Object] -impl CrystalQuery { - /// This function fetches all crystals related from the database. - async fn crystals( +impl CrystalWellsQuery { + /// Fetches all crystals related from the database. + async fn crystal_wells( &self, ctx: &Context<'_>, cursor: CursorInput, ) -> async_graphql::Result> { - subject_authorization!("xchemlab.crystal_library.read_crystal", ctx).await?; + subject_authorization!("xchemlab.crystal_library.read_crystal_wells", ctx).await?; let db = ctx.data::()?; Ok(cursor .try_into_query_cursor::()? @@ -31,14 +44,14 @@ impl CrystalQuery { .try_into_connection()?) } - /// This function fetches a single crystal using the plate_id and well number. - async fn crystal( + /// Fetches a single crystal well using the plate_id and well number. + async fn crystal_well( &self, ctx: &Context<'_>, plate_id: Uuid, well_number: i16, ) -> async_graphql::Result> { - subject_authorization!("xchemlab.crystal_library.read_crystal", ctx).await?; + subject_authorization!("xchemlab.crystal_library.read_crystal_wells", ctx).await?; let db = ctx.data::()?; Ok(crystal_wells::Entity::find() .filter(crystal_wells::Column::PlateId.eq(plate_id)) @@ -49,22 +62,20 @@ impl CrystalQuery { } #[Object] -impl CrystalMutation { - /// This function adds a crystal to the database - async fn add_crystal( +impl CrystalWellsMutation { + /// Adds a crystal well to the database + async fn add_crystal_well( &self, ctx: &Context<'_>, plate_id: Uuid, well_number: i16, - proposal_number: i32, ) -> async_graphql::Result { let operator_id = - subject_authorization!("xchemlab.crystal_library.write_crystal", ctx).await?; + subject_authorization!("xchemlab.crystal_library.write_crystal_wells", ctx).await?; let db = ctx.data::()?; let crystal = crystal_wells::ActiveModel { plate_id: ActiveValue::Set(plate_id), well_number: ActiveValue::Set(well_number), - proposal_number: ActiveValue::Set(proposal_number), operator_id: ActiveValue::Set(operator_id), timestamp: ActiveValue::Set(Utc::now()), }; diff --git a/backend/crystal_library/src/graphql/mod.rs b/backend/crystal_library/src/graphql/mod.rs index 3944aad1..63474c39 100644 --- a/backend/crystal_library/src/graphql/mod.rs +++ b/backend/crystal_library/src/graphql/mod.rs @@ -1,16 +1,19 @@ +/// The cyrstal plates resolver module +pub mod crystal_plates_res; /// The cyrstal wells resolver module pub mod crystal_wells_res; use async_graphql::{EmptySubscription, MergedObject, Schema, SchemaBuilder}; -use crystal_wells_res::{CrystalMutation, CrystalQuery}; +use crystal_plates_res::{CrystalPlatesMutation, CrystalPlatesQuery}; +use crystal_wells_res::{CrystalWellsMutation, CrystalWellsQuery}; /// Combines all query resolvers into a single GraphQL `Query` type. #[derive(Debug, Clone, MergedObject, Default)] -pub struct Query(CrystalQuery); +pub struct Query(CrystalWellsQuery, CrystalPlatesQuery); /// Combines all mutation resolvers into a single GraphQL `Query` type. #[derive(Debug, Clone, MergedObject, Default)] -pub struct Mutation(CrystalMutation); +pub struct Mutation(CrystalWellsMutation, CrystalPlatesMutation); /// Type alias for the complete GraphQL schema. pub type RootSchema = Schema; diff --git a/backend/crystal_library/src/migrator.rs b/backend/crystal_library/src/migrator.rs index 7b9c2ca8..f0f21ef9 100644 --- a/backend/crystal_library/src/migrator.rs +++ b/backend/crystal_library/src/migrator.rs @@ -1,4 +1,4 @@ -use crate::entities::crystal_wells; +use crate::entities::{crystal_plates, crystal_wells}; use axum::async_trait; use sea_orm::{DbErr, DeriveMigrationName, Schema}; use sea_orm_migration::{MigrationTrait, MigratorTrait, SchemaManager}; @@ -24,6 +24,10 @@ impl MigrationTrait for Initial { let backend = manager.get_database_backend(); let schema = Schema::new(backend); + manager + .create_table(schema.create_table_from_entity(crystal_plates::Entity)) + .await?; + manager .create_table(schema.create_table_from_entity(crystal_wells::Entity)) .await?; diff --git a/policies/crystal_library.rego b/policies/crystal_library.rego index 671ff082..c76e5b63 100644 --- a/policies/crystal_library.rego +++ b/policies/crystal_library.rego @@ -2,13 +2,23 @@ package xchemlab.crystal_library import data.xchemlab -default read_crystal = {"allowed" : false} -default write_crystal = {"allowed" : false} +default read_crystal_wells = {"allowed" : false} +default write_crystal_wells = {"allowed" : false} +default read_crystal_plates = {"allowed" : false} +default write_crystal_plates = {"allowed" : false} -read_crystal = {"allowed": true, "subject": xchemlab.subject} { +read_crystal_wells = {"allowed": true, "subject": xchemlab.subject} { xchemlab.valid_token } -write_crystal = {"allowed" : true, "subject" : xchemlab.subject} { +write_crystal_wells = {"allowed" : true, "subject" : xchemlab.subject} { + xchemlab.valid_token +} + +read_crystal_plates = {"allowed": true, "subject": xchemlab.subject} { + xchemlab.valid_token +} + +write_crystal_plates = {"allowed" : true, "subject" : xchemlab.subject} { xchemlab.valid_token } From 27e33477f3e687857c8a775d7524ed5d9f494ea7 Mon Sep 17 00:00:00 2001 From: iamvigneshwars Date: Thu, 22 Feb 2024 11:44:10 +0000 Subject: [PATCH 10/10] WellNumber validation for crystal wells and other minor refactor --- backend/crystal_library/src/entities/mod.rs | 4 ---- backend/crystal_library/src/graphql/crystal_plates_res.rs | 2 +- backend/crystal_library/src/graphql/crystal_wells_res.rs | 4 ++-- backend/crystal_library/src/graphql/mod.rs | 4 ++-- backend/crystal_library/src/main.rs | 6 +++--- backend/crystal_library/src/migrator.rs | 2 +- .../src/{entities => tables}/crystal_plates.rs | 0 .../src/{entities => tables}/crystal_wells.rs | 0 backend/crystal_library/src/tables/mod.rs | 4 ++++ 9 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 backend/crystal_library/src/entities/mod.rs rename backend/crystal_library/src/{entities => tables}/crystal_plates.rs (100%) rename backend/crystal_library/src/{entities => tables}/crystal_wells.rs (100%) create mode 100644 backend/crystal_library/src/tables/mod.rs diff --git a/backend/crystal_library/src/entities/mod.rs b/backend/crystal_library/src/entities/mod.rs deleted file mode 100644 index a519ea01..00000000 --- a/backend/crystal_library/src/entities/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -/// The crystal plates module -pub mod crystal_plates; -/// The crystal wells modules -pub mod crystal_wells; diff --git a/backend/crystal_library/src/graphql/crystal_plates_res.rs b/backend/crystal_library/src/graphql/crystal_plates_res.rs index 6686dd25..0a62ac34 100644 --- a/backend/crystal_library/src/graphql/crystal_plates_res.rs +++ b/backend/crystal_library/src/graphql/crystal_plates_res.rs @@ -1,4 +1,4 @@ -use crate::entities::{crystal_plates, crystal_wells}; +use crate::tables::{crystal_plates, crystal_wells}; use async_graphql::{ComplexObject, Context, Object}; use chrono::Utc; use opa_client::subject_authorization; diff --git a/backend/crystal_library/src/graphql/crystal_wells_res.rs b/backend/crystal_library/src/graphql/crystal_wells_res.rs index 2f233bac..16e6cd08 100644 --- a/backend/crystal_library/src/graphql/crystal_wells_res.rs +++ b/backend/crystal_library/src/graphql/crystal_wells_res.rs @@ -1,4 +1,4 @@ -use crate::entities::{crystal_plates, crystal_wells}; +use crate::tables::{crystal_plates, crystal_wells}; use async_graphql::{ComplexObject, Context, Object}; use chrono::Utc; use opa_client::subject_authorization; @@ -68,7 +68,7 @@ impl CrystalWellsMutation { &self, ctx: &Context<'_>, plate_id: Uuid, - well_number: i16, + #[graphql(validator(minimum = 1, maximum = 288))] well_number: i16, ) -> async_graphql::Result { let operator_id = subject_authorization!("xchemlab.crystal_library.write_crystal_wells", ctx).await?; diff --git a/backend/crystal_library/src/graphql/mod.rs b/backend/crystal_library/src/graphql/mod.rs index 63474c39..77b81771 100644 --- a/backend/crystal_library/src/graphql/mod.rs +++ b/backend/crystal_library/src/graphql/mod.rs @@ -1,6 +1,6 @@ -/// The cyrstal plates resolver module +/// A collection of resolvers relating to crystal plates pub mod crystal_plates_res; -/// The cyrstal wells resolver module +/// A collection of resolvers relating to crystal wells pub mod crystal_wells_res; use async_graphql::{EmptySubscription, MergedObject, Schema, SchemaBuilder}; diff --git a/backend/crystal_library/src/main.rs b/backend/crystal_library/src/main.rs index ab357f51..c656482c 100644 --- a/backend/crystal_library/src/main.rs +++ b/backend/crystal_library/src/main.rs @@ -3,14 +3,14 @@ #![warn(clippy::missing_docs_in_private_items)] #![doc=include_str!("../README.md")] -/// This module defines the structure and schema of the database tables -/// through various entity structs. -mod entities; /// This module sets up the GraphQL schema, including queries, mutations, /// and subscriptions. It defines how data is queried and mutated through the API. mod graphql; /// This module is responsible for defining and applying database migrations. mod migrator; +/// This module defines the structure and schema of the database tables +/// through various entity structs. +mod tables; use async_graphql::extensions::Tracing; use axum::{routing::get, Router, Server}; diff --git a/backend/crystal_library/src/migrator.rs b/backend/crystal_library/src/migrator.rs index f0f21ef9..91714411 100644 --- a/backend/crystal_library/src/migrator.rs +++ b/backend/crystal_library/src/migrator.rs @@ -1,4 +1,4 @@ -use crate::entities::{crystal_plates, crystal_wells}; +use crate::tables::{crystal_plates, crystal_wells}; use axum::async_trait; use sea_orm::{DbErr, DeriveMigrationName, Schema}; use sea_orm_migration::{MigrationTrait, MigratorTrait, SchemaManager}; diff --git a/backend/crystal_library/src/entities/crystal_plates.rs b/backend/crystal_library/src/tables/crystal_plates.rs similarity index 100% rename from backend/crystal_library/src/entities/crystal_plates.rs rename to backend/crystal_library/src/tables/crystal_plates.rs diff --git a/backend/crystal_library/src/entities/crystal_wells.rs b/backend/crystal_library/src/tables/crystal_wells.rs similarity index 100% rename from backend/crystal_library/src/entities/crystal_wells.rs rename to backend/crystal_library/src/tables/crystal_wells.rs diff --git a/backend/crystal_library/src/tables/mod.rs b/backend/crystal_library/src/tables/mod.rs new file mode 100644 index 00000000..74d7efd7 --- /dev/null +++ b/backend/crystal_library/src/tables/mod.rs @@ -0,0 +1,4 @@ +/// The table storing crystal plate information +pub mod crystal_plates; +/// The table storing crystal well information +pub mod crystal_wells;