diff --git a/.docs/index.md b/.docs/index.md index 8265da0102bbe966821c48cb4fb9473ac20eca99..e3307bd493e33dc0a03ce3fc2a770e726c30cd3f 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -14,7 +14,7 @@ author: Martin Weise   -Documentation for version: [v1.5.2](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.6.0](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is a repository for data in databases that are used from the beginning until the end of a research project supporting data evolution, -citation and -versioning. It implements the query store of the diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index fa40580f45a4a6b97222a804ae8c8699f39e2748..b6fd193fdf258b8d1fe0215f000bbf23c5cacc53 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -14,7 +14,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.5.2" \ + --version "1.6.0" \ --create-namespace \ --cleanup-on-fail ``` diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ac86d248266d9429e499623a2dba28691420e4dd..9880536a743f257fd91de35b345562218f54db02 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,8 +4,8 @@ variables: TESTCONTAINERS_RYUK_DISABLED: "false" PYTHON_VERSION: "3.11" DOC_VERSION: "1.5" - APP_VERSION: "1.5.2" - CHART_VERSION: "1.5.2" + APP_VERSION: "1.6.0" + CHART_VERSION: "1.6.0" CACHE_FALLBACK_KEY: ${CI_DEFAULT_BRANCH} # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. diff --git a/Makefile b/Makefile index 91994bda3b8a036503e05af28a152452e94fd087..11befeed00edf3090a7a0ac04296b95dd3ccbe7d 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.5.2 -CHART_VERSION ?= 1.5.2 +APP_VERSION ?= 1.6.0 +CHART_VERSION ?= 1.6.0 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/Pipfile b/Pipfile index f0721bfdca857fc7072edafd32a0372e09e1168c..8a4fa7717247edfed259223c282c80998773bc20 100644 --- a/Pipfile +++ b/Pipfile @@ -19,6 +19,7 @@ pydantic = "==2.6.4" tuspy = "==1.0.3" mike = "==2.0.0" anybadge = "==1.14.0" +gunicorn = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index bf3eb9a4ce0a82df43ca1434743b85fd4a1fa88d..a3746e32d2a9dfe31dceb966b3b26a575476d159 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c0f798e1103d6c20c3417ca7db612e28963f1b67de21172dd52ece1bb87f6816" + "sha256": "77395c7261196e0c46c146434bd370d1817840e4ebd695b0215311aa4a78e5ff" }, "pipfile-spec": 6, "requires": { @@ -738,6 +738,15 @@ ], "version": "==2.1.0" }, + "gunicorn": { + "hashes": [ + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==23.0.0" + }, "html5lib": { "hashes": [ "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", @@ -1110,11 +1119,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "paginate": { "hashes": [ diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index 150d5811a6ce29bfc99588c65b5bafe6a2d87e2b..69b9ee840951c7c27bb036d94057477ae73ceb52 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.6.0.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 8e7bafd4267885b6d55789c1c8a07a85c167a58b..77b72d8cd6227a33fe0d17534b98019ad869eba3 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3df8e885e462132896bafc8d6c82c70226fc2352f2088eac67186d3e171b8308" + "sha256": "e3a8db6afce757927a19df8fe01aea426b0f15868df14c8f98a83f2c19a688da" }, "pipfile-spec": 6, "requires": { @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7", - "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361", - "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c", - "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6", - "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550", - "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", - "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b", - "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5", - "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530", - "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180", - "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", - "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066", - "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", - "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0", - "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409", - "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", - "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", - "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60", - "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a", - "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b", - "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe", - "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502", - "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697", - "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", - "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", - "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771", - "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b", - "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a", - "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", - "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", - "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1", - "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", - "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5", - "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", - "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", - "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f", - "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", - "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", - "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", - "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130", - "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba", - "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", - "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d", - "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87", - "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", - "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", - "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39", - "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", - "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa", - "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3", - "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", - "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", - "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", - "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", - "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a", - "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0", - "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", - "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269", - "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0", - "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", - "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e", - "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", - "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7", - "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82", - "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043", - "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7", - "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0", - "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313", - "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", - "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e", - "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", - "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", - "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", - "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", - "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf", - "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b" + "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", + "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", + "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", + "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", + "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", + "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", + "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", + "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", + "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", + "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", + "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", + "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", + "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", + "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", + "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", + "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", + "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", + "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", + "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", + "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", + "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", + "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", + "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", + "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", + "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", + "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", + "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", + "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", + "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", + "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", + "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", + "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", + "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", + "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", + "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", + "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", + "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", + "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", + "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", + "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", + "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", + "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", + "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", + "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", + "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", + "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", + "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", + "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", + "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", + "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", + "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", + "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", + "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", + "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", + "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", + "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", + "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", + "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", + "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", + "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", + "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", + "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", + "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", + "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", + "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", + "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", + "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", + "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", + "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", + "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", + "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", + "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", + "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", + "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", + "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", + "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" ], "markers": "python_version >= '3.9'", - "version": "==3.11.9" + "version": "==3.11.10" }, "aiosignal": { "hashes": [ @@ -175,20 +175,20 @@ }, "boto3": { "hashes": [ - "sha256:88370c6845ba71a4dae7f6b357099df29b3965da584be040c8e72c9902bc9492", - "sha256:dab5bddbbe57dc707b6f6a1f25dc2823b8e234b6fe99fafef7fc406ab73031b9" + "sha256:5ef7166fe5060637b92af8dc152cd7acecf96b3fc9c5456706a886cadb534391", + "sha256:fc8001519c8842e766ad3793bde3fbd0bb39e821a582fc12cf67876b8f3cf7f1" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.35.74" + "version": "==1.35.78" }, "botocore": { "hashes": [ - "sha256:9ac9d33d84dd9f05b35085de081552342a2c9ae22e3c4ee105723c9e92c07bd9", - "sha256:de5c4fa9a24cef3a758974857b5c5820a12fad345ebf33c052a5988e88f33634" + "sha256:41c37bd7c0326f25122f33ec84fb80fc0a14d7fcc9961431b0e57568e88c9cb5", + "sha256:6905036c25449ae8dba5e950e4b908e4b8a6fe6b516bf61e007ecb62fa21f323" ], "markers": "python_version >= '3.8'", - "version": "==1.35.74" + "version": "==1.35.78" }, "certifi": { "hashes": [ @@ -427,9 +427,9 @@ }, "dbrepo": { "hashes": [ - "sha256:292c2631816ca3dbdbd243e4c006c4bd39d512f5ae7e4b10070102c85ec58a10" + "sha256:7164b09a9f578998b3adc1d51d16e4d77404c84ed9a6194ea4b6f07a6b69c27b" ], - "path": "./lib/dbrepo-1.5.2.tar.gz" + "path": "./lib/dbrepo-1.6.0.tar.gz" }, "events": { "hashes": [ @@ -959,65 +959,65 @@ }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" + "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", + "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", + "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", + "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", + "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", + "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", + "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", + "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", + "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", + "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", + "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", + "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", + "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", + "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", + "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", + "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", + "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", + "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", + "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", + "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", + "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", + "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", + "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", + "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", + "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", + "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", + "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", + "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", + "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", + "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", + "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", + "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", + "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", + "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", + "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", + "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", + "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", + "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", + "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", + "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", + "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", + "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", + "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", + "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", + "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", + "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", + "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", + "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", + "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", + "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", + "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", + "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", + "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", + "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", + "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.1.3" + "version": "==2.2.0" }, "opensearch-py": { "hashes": [ @@ -1459,112 +1459,112 @@ }, "rpds-py": { "hashes": [ - "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0", - "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3", - "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9", - "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4", - "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571", - "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0", - "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669", - "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979", - "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141", - "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2", - "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5", - "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a", - "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2", - "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3", - "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b", - "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260", - "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2", - "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e", - "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42", - "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3", - "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795", - "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba", - "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d", - "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71", - "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70", - "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d", - "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0", - "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab", - "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5", - "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939", - "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd", - "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e", - "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3", - "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb", - "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4", - "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb", - "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16", - "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0", - "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50", - "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c", - "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9", - "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f", - "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a", - "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7", - "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1", - "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe", - "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d", - "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496", - "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef", - "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a", - "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d", - "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba", - "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31", - "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7", - "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef", - "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14", - "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3", - "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114", - "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9", - "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e", - "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24", - "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156", - "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a", - "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48", - "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b", - "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578", - "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f", - "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a", - "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49", - "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9", - "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411", - "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161", - "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05", - "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e", - "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f", - "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0", - "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501", - "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec", - "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357", - "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296", - "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f", - "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2", - "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8", - "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561", - "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b", - "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32", - "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312", - "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0", - "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2", - "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e", - "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639", - "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9", - "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695", - "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3", - "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa", - "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21", - "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28", - "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543", - "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac", - "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523", - "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934", - "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72", - "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167" + "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", + "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", + "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", + "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", + "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", + "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543", + "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", + "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", + "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", + "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", + "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", + "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", + "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", + "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", + "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99", + "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", + "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", + "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", + "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", + "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", + "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f", + "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3", + "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca", + "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d", + "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e", + "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", + "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea", + "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", + "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", + "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", + "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", + "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723", + "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e", + "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", + "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6", + "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", + "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091", + "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", + "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", + "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", + "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728", + "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", + "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", + "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", + "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7", + "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", + "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", + "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", + "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", + "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", + "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055", + "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d", + "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", + "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", + "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", + "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", + "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", + "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", + "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", + "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", + "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11", + "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", + "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", + "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", + "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b", + "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", + "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c", + "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9", + "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", + "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", + "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", + "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", + "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", + "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c", + "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", + "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", + "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", + "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", + "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", + "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", + "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", + "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", + "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", + "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", + "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", + "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", + "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", + "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3", + "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", + "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520", + "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831", + "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", + "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", + "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", + "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", + "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", + "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", + "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", + "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", + "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", + "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d", + "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", + "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e" ], "markers": "python_version >= '3.9'", - "version": "==0.22.1" + "version": "==0.22.3" }, "s3transfer": { "hashes": [ @@ -1584,11 +1584,11 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "tinydb": { "hashes": [ @@ -1627,7 +1627,7 @@ "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.8'", "version": "==2.2.3" }, "werkzeug": { @@ -2008,72 +2008,72 @@ }, "coverage": { "hashes": [ - "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", - "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", - "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", - "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", - "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", - "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", - "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", - "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", - "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", - "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", - "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", - "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", - "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", - "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", - "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", - "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", - "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", - "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", - "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", - "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", - "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", - "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", - "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", - "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", - "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", - "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", - "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", - "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", - "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", - "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", - "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", - "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", - "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", - "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", - "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", - "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", - "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", - "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", - "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", - "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", - "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", - "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", - "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", - "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", - "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", - "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", - "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", - "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", - "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", - "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", - "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", - "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", - "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", - "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", - "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", - "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", - "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", - "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", - "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", - "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", - "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", - "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.8" + "version": "==7.6.9" }, "docker": { "hashes": [ @@ -2222,11 +2222,11 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "testcontainers-core": { "hashes": [ @@ -2264,7 +2264,7 @@ "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.8'", "version": "==2.2.3" }, "wrapt": { diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..db73c1e06cf41cf64b5e409a536527ecebe1694f Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz differ diff --git a/dbrepo-auth-service/dbrepo-realm.json b/dbrepo-auth-service/dbrepo-realm.json index e057f778d4796aa1fd90c94c920a4abcec720de2..18dc0c89843de96a003326aae72745793fbf7e6a 100644 --- a/dbrepo-auth-service/dbrepo-realm.json +++ b/dbrepo-auth-service/dbrepo-realm.json @@ -73,7 +73,7 @@ "description" : "${default-system-roles}", "composite" : true, "composites" : { - "realm" : [ "delete-database-view", "update-semantic-unit", "export-query-data", "check-foreign-database-access", "default-data-steward-roles", "execute-query", "default-user-handling", "delete-table-data", "find-query", "list-database-views", "persist-query", "update-search-index", "delete-database-access", "view-table-history", "create-ontology", "update-ontology", "modify-user-theme", "default-system-roles", "create-semantic-concept", "default-container-handling", "create-container", "create-table", "default-broker-handling", "default-maintenance-handling", "execute-semantic-query", "uma_authorization", "table-semantic-analyse", "list-containers", "check-database-access", "escalated-query-handling", "delete-identifier", "modify-database-owner", "list-tables", "export-table-data", "create-database-access", "delete-container", "re-execute-query", "create-semantic-unit", "escalated-identifier-handling", "system", "update-table-statistic", "escalated-semantics-handling", "default-database-handling", "delete-ontology", "find-database", "find-database-view", "update-semantic-concept", "find-user", "import-database-data", "publish-identifier", "default-roles-dbrepo", "find-foreign-user", "create-database", "create-maintenance-message", "find-maintenance-message", "escalated-container-handling", "default-researcher-roles", "default-identifier-handling", "escalated-user-handling", "modify-user-information", "create-database-view", "update-maintenance-message", "delete-foreign-table", "offline_access", "modify-foreign-table-column-semantics", "delete-maintenance-message", "find-container", "insert-table-data", "modify-identifier-metadata", "modify-database-image", "escalated-broker-handling", "modify-table-column-semantics", "escalated-database-handling", "default-semantics-handling", "update-database-access", "default-query-handling", "find-table", "list-queries", "default-developer-roles", "create-identifier", "escalated-table-handling", "find-identifier", "view-database-view-data", "view-table-data", "list-licenses", "default-table-handling", "list-identifiers", "create-foreign-identifier", "list-databases", "list-ontologies", "modify-database-visibility", "list-maintenance-messages", "delete-table" ] + "realm" : [ "delete-database-view", "update-semantic-unit", "export-query-data", "check-foreign-database-access", "default-data-steward-roles", "execute-query", "default-user-handling", "delete-table-data", "find-query", "list-database-views", "persist-query", "update-search-index", "delete-database-access", "view-table-history", "create-ontology", "update-ontology", "modify-user-theme", "default-system-roles", "create-semantic-concept", "default-container-handling", "create-container", "create-table", "default-broker-handling", "default-maintenance-handling", "execute-semantic-query", "uma_authorization", "table-semantic-analyse", "list-containers", "check-database-access", "escalated-query-handling", "delete-identifier", "modify-database-owner", "list-tables", "export-table-data", "create-database-access", "delete-container", "re-execute-query", "create-semantic-unit", "escalated-identifier-handling", "system", "update-table-statistic", "escalated-semantics-handling", "default-database-handling", "delete-ontology", "find-database", "find-database-view", "update-semantic-concept", "find-user", "import-database-data", "publish-identifier", "default-roles-dbrepo", "find-foreign-user", "create-database", "create-maintenance-message", "find-maintenance-message", "escalated-container-handling", "default-researcher-roles", "default-identifier-handling", "escalated-user-handling", "modify-user-information", "create-database-view", "update-maintenance-message", "delete-foreign-table", "offline_access", "modify-foreign-table-column-semantics", "delete-maintenance-message", "find-container", "insert-table-data", "modify-identifier-metadata", "modify-database-image", "escalated-broker-handling", "modify-table-column-semantics", "escalated-database-handling", "default-semantics-handling", "update-database-access", "default-query-handling", "find-table", "list-queries", "default-developer-roles", "create-identifier", "escalated-table-handling", "find-identifier", "view-table-data", "list-licenses", "default-table-handling", "list-identifiers", "create-foreign-identifier", "list-databases", "list-ontologies", "modify-database-visibility", "list-maintenance-messages", "delete-table" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -146,19 +146,11 @@ "description" : "${default-table-handling}", "composite" : true, "composites" : { - "realm" : [ "modify-table-column-semantics", "list-tables", "update-table-statistic", "find-table", "create-table", "delete-table" ] + "realm" : [ "modify-table-column-semantics", "list-tables", "update-table-statistic", "find-table", "create-table", "delete-table", "update-table" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } - }, { - "id" : "b0d66d3d-59b4-4aae-aa66-e3d5a49f28e3", - "name" : "view-database-view-data", - "description" : "${view-database-view-data}", - "composite" : false, - "clientRole" : false, - "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", - "attributes" : { } }, { "id" : "f5ea431a-9b2c-4195-bcb4-9511f38e4b44", "name" : "create-database-view", @@ -219,7 +211,7 @@ "description" : "${default-researcher-roles}", "composite" : true, "composites" : { - "realm" : [ "default-table-handling", "default-semantics-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-broker-handling", "default-identifier-handling" ] + "realm" : [ "default-table-handling", "default-semantics-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-broker-handling", "default-identifier-handling", "default-view-handling" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -264,6 +256,14 @@ "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "22449528-00c9-4e86-9400-4b8ae6fd8f4d", + "name" : "modify-view-visibility", + "description" : "${modify-view-visibility}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "c12c1f4e-186f-4153-a795-26e79fb623d6", "name" : "create-ontology", @@ -296,6 +296,17 @@ "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "d75e7938-9d5e-4cb3-8c57-18a446867d3a", + "name" : "default-view-handling", + "description" : "${default-view-handling}", + "composite" : true, + "composites" : { + "realm" : [ "delete-database-view", "update-database-view", "create-database-view", "modify-view-visibility", "find-database-view", "list-database-views" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "535f1484-4514-4d24-8d97-e3f6c11a426b", "name" : "create-container", @@ -390,13 +401,21 @@ "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "6ae766b0-b8b4-4067-a95d-c8576bc4ac77", + "name" : "update-table", + "description" : "${update-table}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "64c16bfb-2015-48ad-a23f-637ff24419cb", "name" : "default-query-handling", "description" : "${default-query-handling}", "composite" : true, "composites" : { - "realm" : [ "delete-database-view", "export-query-data", "execute-query", "delete-table-data", "export-table-data", "list-queries", "find-query", "list-database-views", "persist-query", "view-database-view-data", "view-table-data", "re-execute-query", "view-table-history", "create-database-view", "find-database-view", "insert-table-data" ] + "realm" : [ "delete-database-view", "export-query-data", "execute-query", "delete-table-data", "export-table-data", "list-queries", "find-query", "list-database-views", "persist-query", "view-table-data", "re-execute-query", "view-table-history", "create-database-view", "find-database-view", "insert-table-data" ] }, "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", @@ -417,6 +436,14 @@ "clientRole" : false, "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", "attributes" : { } + }, { + "id" : "df20b7d1-8d30-4a99-80eb-e8195fab0e76", + "name" : "update-database-view", + "description" : "${update-database-view}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } }, { "id" : "88f82262-be80-4d18-9fb4-5529da031f33", "name" : "system", @@ -1211,12 +1238,13 @@ "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, "fullScopeAllowed" : false, "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] }, { "id" : "d3c4a04e-39ce-4549-a34a-11e25774cd96", @@ -1241,6 +1269,7 @@ "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "post.logout.redirect.uris" : "+", "pkce.code.challenge.method" : "S256" }, @@ -1255,7 +1284,7 @@ "consentRequired" : false, "config" : { } } ], - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] }, { "id" : "81ef0f59-a5ca-4be4-a1d1-0c32edf1cfd6", @@ -1278,12 +1307,14 @@ "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", + "client.use.lightweight.access.token.enabled" : "true", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, + "fullScopeAllowed" : true, "nodeReRegistrationTimeout" : 0, - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] }, { "id" : "88694c91-753d-4c44-9740-ec9ac06bba45", @@ -1306,6 +1337,7 @@ "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "true", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, @@ -1339,6 +1371,7 @@ "frontchannelLogout" : true, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "oidc.ciba.grant.enabled" : "false", "client.secret.creation.time" : "1680085365", "backchannel.logout.session.required" : "true", @@ -1369,11 +1402,11 @@ "protocolMapper" : "oidc-hardcoded-claim-mapper", "consentRequired" : false, "config" : { - "claim.value" : "dbrepo", - "userinfo.token.claim" : "true", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "aud", + "claim.value" : "dbrepo", + "userinfo.token.claim" : "true", "access.tokenResponse.claim" : "false" } }, { @@ -1392,7 +1425,7 @@ "claim.name" : "uid" } } ], - "defaultClientScopes" : [ "roles", "attributes" ], + "defaultClientScopes" : [ "roles", "attributes", "basic" ], "optionalClientScopes" : [ "rabbitmq.read:*/*", "web-origins", "acr", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ] }, { "id" : "25741f6b-4867-4138-8238-6345c6ba8702", @@ -1420,6 +1453,7 @@ "frontchannelLogout" : true, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", "oidc.ciba.grant.enabled" : "false", "client.secret.creation.time" : "1680000860", "backchannel.logout.session.required" : "true", @@ -1437,12 +1471,12 @@ "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "false", "user.attribute" : "username", "id.token.claim" : "false", "access.token.claim" : "true", "claim.name" : "client_id", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "false" } }, { "id" : "f1afc22d-f595-403b-ba2e-6ab19d98205e", @@ -1451,15 +1485,15 @@ "protocolMapper" : "oidc-hardcoded-claim-mapper", "consentRequired" : false, "config" : { - "claim.value" : "rabbitmq", - "userinfo.token.claim" : "false", "id.token.claim" : "false", "access.token.claim" : "true", "claim.name" : "aud", + "claim.value" : "rabbitmq", + "userinfo.token.claim" : "false", "access.tokenResponse.claim" : "false" } } ], - "defaultClientScopes" : [ "web-origins", "acr", "rabbitmq.tag:management" ], + "defaultClientScopes" : [ "web-origins", "acr", "rabbitmq.tag:management", "basic" ], "optionalClientScopes" : [ "rabbitmq.read:*/*", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "roles", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ] }, { "id" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", @@ -1482,6 +1516,7 @@ "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "true", "post.logout.redirect.uris" : "+" }, "authenticationFlowBindingOverrides" : { }, @@ -1512,11 +1547,13 @@ "frontchannelLogout" : false, "protocol" : "openid-connect", "attributes" : { + "realm_client" : "false", + "client.use.lightweight.access.token.enabled" : "true", "post.logout.redirect.uris" : "+", "pkce.code.challenge.method" : "S256" }, "authenticationFlowBindingOverrides" : { }, - "fullScopeAllowed" : false, + "fullScopeAllowed" : true, "nodeReRegistrationTimeout" : 0, "protocolMappers" : [ { "id" : "c4d54410-3f22-4259-9571-94da2c43b752", @@ -1525,15 +1562,15 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "locale", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "locale", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ], - "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] } ], "clientScopes" : [ { @@ -1554,8 +1591,8 @@ "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${emailScopeConsentText}" + "consent.screen.text" : "${emailScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "782819fe-ba5d-4ddb-9f95-cabb69d79c8d", @@ -1564,12 +1601,12 @@ "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "emailVerified", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "email_verified", - "jsonType.label" : "boolean" + "jsonType.label" : "boolean", + "userinfo.token.claim" : "true" } }, { "id" : "ca613fc8-bbf2-4240-8b33-a1874f1559f3", @@ -1578,12 +1615,12 @@ "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "email", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "email", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ] }, { @@ -1593,8 +1630,8 @@ "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${profileScopeConsentText}" + "consent.screen.text" : "${profileScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "84f0487a-1d7d-470c-9b8e-5835294ae235", @@ -1603,12 +1640,12 @@ "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "username", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "preferred_username", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "bbdcdb36-3ec0-443d-b1af-9993d40f0567", @@ -1617,12 +1654,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "gender", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "gender", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "9faa870b-5491-4ce9-b27d-c9ce07d6a95e", @@ -1631,12 +1668,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "birthdate", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "birthdate", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "f0e3c012-9523-4076-83ae-e466e2d08220", @@ -1656,12 +1693,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "profile", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "profile", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "18cfbf4b-0a8e-45c7-a832-c0f72c92f3f3", @@ -1670,12 +1707,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "updatedAt", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "updated_at", - "jsonType.label" : "long" + "jsonType.label" : "long", + "userinfo.token.claim" : "true" } }, { "id" : "841ea785-26ab-429a-a420-09ce3948924d", @@ -1684,12 +1721,12 @@ "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "lastName", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "family_name", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "bfba13ff-f952-4e89-bbb1-a693fdebfae8", @@ -1698,12 +1735,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "website", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "website", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "475f071d-5149-4379-b928-76482f5f519c", @@ -1712,12 +1749,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "zoneinfo", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "zoneinfo", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "b8bebfed-b5e9-4604-a0ee-9817f7d439ac", @@ -1726,12 +1763,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "middleName", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "middle_name", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "445232c8-6830-476c-a6f1-8bbef167595a", @@ -1740,12 +1777,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "picture", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "picture", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "65f2e474-6ede-4872-86e4-e49504dd0f2a", @@ -1754,12 +1791,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "locale", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "locale", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "16cd5a27-ccf3-453c-ae1e-8621813ab73c", @@ -1768,12 +1805,12 @@ "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "firstName", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "given_name", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "f9efedfc-3388-457c-b10a-1dff4525ff9b", @@ -1782,12 +1819,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "nickname", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "nickname", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ] }, { @@ -1821,12 +1858,12 @@ "protocolMapper" : "oidc-usermodel-property-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "username", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "upn", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } } ] }, { @@ -1868,8 +1905,8 @@ "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${phoneScopeConsentText}" + "consent.screen.text" : "${phoneScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "dae802fb-9138-408a-b80e-a40eb0f56814", @@ -1878,12 +1915,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "phoneNumber", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "phone_number", - "jsonType.label" : "String" + "jsonType.label" : "String", + "userinfo.token.claim" : "true" } }, { "id" : "feb06a8d-b0eb-4911-8464-368d93f566fa", @@ -1892,12 +1929,12 @@ "protocolMapper" : "oidc-usermodel-attribute-mapper", "consentRequired" : false, "config" : { - "userinfo.token.claim" : "true", "user.attribute" : "phoneNumberVerified", "id.token.claim" : "true", "access.token.claim" : "true", "claim.name" : "phone_number_verified", - "jsonType.label" : "boolean" + "jsonType.label" : "boolean", + "userinfo.token.claim" : "true" } } ] }, { @@ -1907,8 +1944,8 @@ "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "false", - "display.on.consent.screen" : "false", - "consent.screen.text" : "" + "consent.screen.text" : "", + "display.on.consent.screen" : "false" }, "protocolMappers" : [ { "id" : "c6411e3b-6478-453d-b530-5fe175a4d786", @@ -2004,8 +2041,8 @@ "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "true", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${addressScopeConsentText}" + "consent.screen.text" : "${addressScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "8d4ffe4d-1d01-4ca1-8ff4-44eacca61b30", @@ -2036,6 +2073,41 @@ "gui.order" : "", "consent.screen.text" : "" } + }, { + "id" : "ba11267a-478b-4b32-872f-4eb2d125d116", + "name" : "basic", + "description" : "OpenID Connect scope for add all basic claims to the token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "1445e14f-49b0-4666-8ddc-691493c24ad9", + "name" : "sub", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-sub-mapper", + "consentRequired" : false, + "config" : { + "introspection.token.claim" : "true", + "access.token.claim" : "true" + } + }, { + "id" : "846f1ef0-2b86-4e07-9d25-691d25af5fce", + "name" : "auth_time", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usersessionmodel-note-mapper", + "consentRequired" : false, + "config" : { + "user.session.note" : "AUTH_TIME", + "introspection.token.claim" : "true", + "userinfo.token.claim" : "true", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "auth_time", + "jsonType.label" : "long" + } + } ] }, { "id" : "37f61543-dad7-4a82-8e10-77acdd1eefdc", "name" : "roles", @@ -2043,8 +2115,8 @@ "protocol" : "openid-connect", "attributes" : { "include.in.token.scope" : "false", - "display.on.consent.screen" : "true", - "consent.screen.text" : "${rolesScopeConsentText}" + "consent.screen.text" : "${rolesScopeConsentText}", + "display.on.consent.screen" : "true" }, "protocolMappers" : [ { "id" : "3b6b6914-8ad1-4a71-88ec-444f754aaacb", @@ -2081,7 +2153,7 @@ } } ] } ], - "defaultDefaultClientScopes" : [ "rabbitmq.tag:administrator", "rabbitmq.tag:management" ], + "defaultDefaultClientScopes" : [ "rabbitmq.tag:administrator", "rabbitmq.tag:management", "basic" ], "defaultOptionalClientScopes" : [ "rabbitmq.write:*/*", "offline_access", "rabbitmq.configure:*/*", "roles", "role_list", "address", "phone", "acr", "microprofile-jwt", "email", "attributes", "profile", "rabbitmq.read:*/*", "web-origins" ], "browserSecurityHeaders" : { "contentSecurityPolicyReportOnly" : "", @@ -2143,7 +2215,7 @@ "subType" : "anonymous", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper" ] + "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-role-list-mapper", "saml-user-property-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "saml-user-attribute-mapper", "oidc-usermodel-attribute-mapper" ] } }, { "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", @@ -2169,7 +2241,15 @@ "subType" : "authenticated", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "oidc-address-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "saml-user-attribute-mapper" ] + } + } ], + "org.keycloak.userprofile.UserProfileProvider" : [ { + "id" : "a407a1d6-a7f6-4a72-ba3a-149de03d5a43", + "providerId" : "declarative-user-profile", + "subComponents" : { }, + "config" : { + "kc.user.profile.config" : [ "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}],\"unmanagedAttributePolicy\":\"ENABLED\"}" ] } } ], "org.keycloak.storage.UserStorageProvider" : [ { @@ -2231,19 +2311,19 @@ "providerId" : "group-ldap-mapper", "subComponents" : { }, "config" : { + "mode" : [ "LDAP_ONLY" ], "membership.attribute.type" : [ "DN" ], + "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ], "group.name.ldap.attribute" : [ "cn" ], "preserve.group.inheritance" : [ "false" ], - "membership.user.ldap.attribute" : [ "uid" ], - "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ], - "mode" : [ "LDAP_ONLY" ], - "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ], "ignore.missing.groups" : [ "false" ], "membership.ldap.attribute" : [ "member" ], + "membership.user.ldap.attribute" : [ "uid" ], "memberof.ldap.attribute" : [ "memberOf" ], + "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ], "group.object.classes" : [ "groupOfNames" ], - "groups.path" : [ "/" ], - "drop.non.existing.groups.during.sync" : [ "false" ] + "drop.non.existing.groups.during.sync" : [ "false" ], + "groups.path" : [ "/" ] } }, { "id" : "b6ff3285-35af-4e86-8bb4-d94b8e0d70bb", @@ -2253,8 +2333,8 @@ "config" : { "ldap.attribute" : [ "modifyTimestamp" ], "is.mandatory.in.ldap" : [ "false" ], - "read.only" : [ "true" ], "always.read.value.from.ldap" : [ "true" ], + "read.only" : [ "true" ], "user.model.attribute" : [ "modifyTimestamp" ] } }, { @@ -2267,15 +2347,15 @@ "is.mandatory.in.ldap" : [ "true" ], "attribute.force.default" : [ "false" ], "is.binary.attribute" : [ "false" ], - "read.only" : [ "false" ], "always.read.value.from.ldap" : [ "false" ], + "read.only" : [ "false" ], "user.model.attribute" : [ "username" ] } } ] }, "config" : { - "fullSyncPeriod" : [ "-1" ], "pagination" : [ "false" ], + "fullSyncPeriod" : [ "-1" ], "startTls" : [ "false" ], "usersDn" : [ "ou=users,dc=dbrepo,dc=at" ], "connectionPooling" : [ "true" ], @@ -2303,14 +2383,6 @@ "validatePasswordPolicy" : [ "false" ] } } ], - "org.keycloak.userprofile.UserProfileProvider" : [ { - "id" : "a407a1d6-a7f6-4a72-ba3a-149de03d5a43", - "providerId" : "declarative-user-profile", - "subComponents" : { }, - "config" : { - "kc.user.profile.config" : [ "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}],\"unmanagedAttributePolicy\":\"ENABLED\"}" ] - } - } ], "org.keycloak.keys.KeyProvider" : [ { "id" : "2f53ccf3-37b0-4d34-83e7-ed497499ee51", "name" : "rsa-enc-generated", @@ -2923,10 +2995,12 @@ "actionTokenGeneratedByUserLifespan-idp-verify-account-via-email" : "", "parRequestUriLifespan" : "60", "clientSessionMaxLifespan" : "0", + "organizationsEnabled" : "false", "shortVerificationUri" : "" }, - "keycloakVersion" : "24.0.5", + "keycloakVersion" : "26.0.0", "userManagedAccessAllowed" : false, + "organizationsEnabled" : false, "clientProfiles" : { "profiles" : [ ] }, diff --git a/dbrepo-auth-service/init/Dockerfile b/dbrepo-auth-service/init/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..6ae8e16d77c4aa3c6460ed93973b0d97a8e8720a --- /dev/null +++ b/dbrepo-auth-service/init/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.11-alpine +LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" + +RUN apk add --no-cache alpine-sdk gcc python3-dev mariadb-connector-c-dev + +WORKDIR /home/alpine + +COPY Pipfile Pipfile.lock ./ + +RUN pip install pipenv && \ + pipenv install --system --deploy + +USER 1001 + +WORKDIR /app + +COPY --chown=1001 ./app.py ./app.py + +ENTRYPOINT [ "python", "app.py" ] \ No newline at end of file diff --git a/dbrepo-auth-service/init/Pipfile b/dbrepo-auth-service/init/Pipfile new file mode 100644 index 0000000000000000000000000000000000000000..7c6799865cc4f42f27b46cb768170c2d34237b13 --- /dev/null +++ b/dbrepo-auth-service/init/Pipfile @@ -0,0 +1,11 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +python-keycloak = "*" +mariadb = "*" + +[requires] +python_version = "3.11" diff --git a/dbrepo-auth-service/init/Pipfile.lock b/dbrepo-auth-service/init/Pipfile.lock new file mode 100644 index 0000000000000000000000000000000000000000..cc139b4931f2fb3b0acef6a537300fc7dc309a1d --- /dev/null +++ b/dbrepo-auth-service/init/Pipfile.lock @@ -0,0 +1,391 @@ +{ + "_meta": { + "hash": { + "sha256": "e7d1339d14c1425b18632357a83687250144a76d598d9e2ff66a4c758b41611a" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.11" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "anyio": { + "hashes": [ + "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48", + "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352" + ], + "markers": "python_version >= '3.9'", + "version": "==4.7.0" + }, + "async-property": { + "hashes": [ + "sha256:17d9bd6ca67e27915a75d92549df64b5c7174e9dc806b30a3934dc4ff0506380", + "sha256:8924d792b5843994537f8ed411165700b27b2bd966cefc4daeefc1253442a9d7" + ], + "version": "==0.2.2" + }, + "certifi": { + "hashes": [ + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.8.30" + }, + "cffi": { + "hashes": [ + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" + ], + "markers": "platform_python_implementation != 'PyPy'", + "version": "==1.17.1" + }, + "charset-normalizer": { + "hashes": [ + "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", + "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", + "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", + "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", + "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", + "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", + "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", + "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", + "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", + "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", + "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", + "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", + "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", + "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", + "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", + "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", + "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", + "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", + "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", + "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", + "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", + "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", + "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", + "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", + "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", + "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", + "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", + "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", + "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", + "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", + "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", + "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", + "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", + "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", + "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", + "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", + "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", + "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", + "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", + "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", + "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", + "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", + "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", + "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", + "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", + "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", + "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", + "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", + "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", + "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", + "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", + "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", + "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", + "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", + "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", + "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", + "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", + "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", + "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", + "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", + "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", + "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", + "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", + "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", + "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", + "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", + "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", + "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", + "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", + "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", + "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", + "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", + "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", + "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", + "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", + "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", + "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", + "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", + "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", + "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", + "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", + "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", + "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", + "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", + "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", + "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", + "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", + "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", + "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", + "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", + "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.4.0" + }, + "cryptography": { + "hashes": [ + "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", + "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731", + "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", + "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", + "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", + "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385", + "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", + "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", + "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", + "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", + "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", + "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", + "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", + "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba", + "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", + "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", + "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", + "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", + "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", + "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", + "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", + "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", + "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", + "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", + "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", + "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", + "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", + "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756", + "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4" + ], + "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", + "version": "==44.0.0" + }, + "deprecation": { + "hashes": [ + "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", + "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a" + ], + "version": "==2.1.0" + }, + "h11": { + "hashes": [ + "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", + "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + ], + "markers": "python_version >= '3.7'", + "version": "==0.14.0" + }, + "httpcore": { + "hashes": [ + "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", + "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.7" + }, + "httpx": { + "hashes": [ + "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", + "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + ], + "markers": "python_version >= '3.8'", + "version": "==0.28.1" + }, + "idna": { + "hashes": [ + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + ], + "markers": "python_version >= '3.6'", + "version": "==3.10" + }, + "jwcrypto": { + "hashes": [ + "sha256:150d2b0ebbdb8f40b77f543fb44ffd2baeff48788be71f67f03566692fd55789", + "sha256:771a87762a0c081ae6166958a954f80848820b2ab066937dc8b8379d65b1b039" + ], + "markers": "python_version >= '3.8'", + "version": "==1.5.6" + }, + "mariadb": { + "hashes": [ + "sha256:0f8de8d66ca71bd102f34a970a331b7d75bdf7f8050d80e37cdcc6ff3c85cf7a", + "sha256:2e72ea65f1d7d8563ee84e172f2a583193092bdb6ff83c470ca9722873273ecc", + "sha256:3f64b520089cb60c4f8302f365ed0ae057c4c859ab70fc8b1c4358192c3c8f27", + "sha256:579420293fa790d5ae0a6cb4bdb7e8be8facc2ceefb6123c2b0e8042b3fa725d", + "sha256:6f28d8ccc597a3a1368be14078110f743900dbb3b0c7f1cce3072d83bec59c8a", + "sha256:c1992ebf9c6f012ac158e33fef9f2c4ba899f721064c4ae3a3489233793296c0", + "sha256:cf6647cee081e21d0994b409ba8c8fa2077f3972f1de3627c5502fb31d14f806", + "sha256:d7302ccd15f0beee7b286885cbf6ac71ddc240374691d669784d99f89ba34d79", + "sha256:dbc4cf0e302ca82d46f9431a0b04f048e9c21ee56d6f3162c29605f84d63b40c", + "sha256:e94f1738bec09c97b601ddbb1908eb24524ba4630f507a775d82ffdb6c5794b3", + "sha256:f6dfdc954edf02b6519419a054798cda6034dc459d1d482e3329e37aa27d34f0" + ], + "index": "pypi", + "version": "==1.1.11" + }, + "packaging": { + "hashes": [ + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + ], + "markers": "python_version >= '3.8'", + "version": "==24.2" + }, + "pycparser": { + "hashes": [ + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + ], + "markers": "python_version >= '3.8'", + "version": "==2.22" + }, + "python-keycloak": { + "hashes": [ + "sha256:638a21a450a525989733299b6db1627a0656e770b6cadb2c1d21edb2244df3ce", + "sha256:bb819be1a0c2fca7f41fe045216c1aa03d612c1b62237fd9ccb98688156c4d2b" + ], + "index": "pypi", + "version": "==4.7.3" + }, + "requests": { + "hashes": [ + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + ], + "markers": "python_version >= '3.8'", + "version": "==2.32.3" + }, + "requests-toolbelt": { + "hashes": [ + "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.0.0" + }, + "sniffio": { + "hashes": [ + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + ], + "markers": "python_version >= '3.8'", + "version": "==4.12.2" + }, + "urllib3": { + "hashes": [ + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.3" + } + }, + "develop": {} +} diff --git a/dbrepo-auth-service/init/app.py b/dbrepo-auth-service/init/app.py new file mode 100644 index 0000000000000000000000000000000000000000..d3a26a42fe56d46ceece4199a95b434e109d6ff3 --- /dev/null +++ b/dbrepo-auth-service/init/app.py @@ -0,0 +1,31 @@ +import os +import mariadb +from keycloak import KeycloakAdmin + +system_username = os.getenv('SYSTEM_USERNAME', 'admin') + +admin = KeycloakAdmin(server_url=os.getenv('AUTH_SERVICE_ENDPOINT', 'http://localhost:8080'), + username=os.getenv('AUTH_SERVICE_ADMIN', 'admin'), + password=os.getenv('AUTH_SERVICE_ADMIN_PASSWORD', 'admin'), + verify=True) +user_id = admin.get_user_id(username=system_username) +print(f'Successfully fetched user id: {user_id}') + +try: + conn = mariadb.connect(user="root", + password=os.getenv('METADATA_DB_PASSWORD', 'dbrepo'), + host="metadata-db", + port=3306, + database=os.getenv('METADATA_DB', 'dbrepo')) + cursor = conn.cursor() + cursor.execute( + "INSERT IGNORE INTO `mdb_users` (`id`, `username`, `email`, `mariadb_password`) VALUES (?, ?, ?, PASSWORD(?))", + (user_id, system_username, 'some@admin', '1234567890')) + conn.commit() + conn.close() +except mariadb.Error as e: + print(f"Error connecting to MariaDB Platform: {e}") + exit(1) + +print(f'Successfully inserted user') +exit(0) diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index 5f813b94c7f6861b26e36ceb70c74d3c8c8e26fd..87bdec0b480a7f63c792cf6625d75e03fbf90774 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> <name>dbrepo-data-service</name> - <version>1.5.2</version> + <version>1.6.0</version> <description>Service that manages the data</description> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index a508c88343838c4e04601b6ad91496643eb7bb96..3917fc4976354fffd39805995f82e9a322742631 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-data-service-querystore</artifactId> <name>dbrepo-data-service-querystore</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index da3d605405f9b4ab85d3e23bd30f15025962f187..99c9261cea42c59e2daa5c68140e971c410874be 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>report</artifactId> <name>dbrepo-data-service-report</name> - <version>1.5.2</version> + <version>1.6.0</version> <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index 0859d437249495400f536e22aea82130fdd1ef98..9eb0cddee6c2577ea82dbe09f71f13192bc1a4c4 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>rest-service</artifactId> <name>dbrepo-data-service-rest-service</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>services</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index 2a9beb3d04fdd137340571ea122bf8e398738044..08d287e15356beba71c57ea88aa17e21f13ad200 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -79,7 +79,7 @@ public class TableEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Failed to find database in metadata database or table in data database", + description = "Failed to find database or table in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -97,7 +97,7 @@ public class TableEndpoint { public ResponseEntity<TableDto> create(@NotNull @PathVariable("databaseId") Long databaseId, @Valid @RequestBody TableCreateDto data) throws DatabaseNotFoundException, RemoteUnavailableException, TableMalformedException, DatabaseUnavailableException, TableExistsException, - TableNotFoundException, QueryMalformedException, MetadataServiceException { + TableNotFoundException, QueryMalformedException, MetadataServiceException, ContainerNotFoundException { log.debug("endpoint create table, databaseId={}, data.name={}", databaseId, data.getName()); /* check */ if (data.getConstraints().getPrimaryKey().isEmpty()) { @@ -116,6 +116,50 @@ public class TableEndpoint { } } + @PutMapping("/{tableId}") + @PreAuthorize("hasAuthority('system')") + @Operation(summary = "Update table", + security = {@SecurityRequirement(name = "basicAuth")}, + hidden = true) + @ApiResponses(value = { + @ApiResponse(responseCode = "202", + description = "Updated table", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = TableDto.class))}), + @ApiResponse(responseCode = "400", + description = "Table schema or query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database or table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<TableDto> update(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("tableId") Long tableId, + @Valid @RequestBody TableUpdateDto data) throws RemoteUnavailableException, + TableMalformedException, DatabaseUnavailableException, TableNotFoundException, MetadataServiceException { + log.debug("endpoint update table, databaseId={}, data.description={}", databaseId, data.getDescription()); + /* create */ + final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId); + try { + tableService.updateTable(table, data); + return ResponseEntity.status(HttpStatus.ACCEPTED) + .build(); + } catch (SQLException e) { + log.error("Failed to establish connection to database: {}", e.getMessage()); + throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); + } + } + @DeleteMapping("/{tableId}") @PreAuthorize("hasAuthority('system')") @Operation(summary = "Delete table", diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java index 38b33c4713031d2388ef6b6cf99b67ddc27776ce..a30ffb7b81ec455fc4eaa0ca11472eafa2c7aaf2 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java @@ -265,7 +265,7 @@ public class MariaDbConfig { prepareStatement.setString(5, query.getQueryHash()); prepareStatement.setString(6, query.getResultHash()); prepareStatement.setLong(7, query.getResultNumber()); - prepareStatement.setTimestamp(8, Timestamp.from(query.getCreated())); + prepareStatement.setTimestamp(8, Timestamp.from(query.getExecution())); prepareStatement.setTimestamp(9, Timestamp.from(query.getExecution())); log.trace("prepared statement: {}", prepareStatement); prepareStatement.executeUpdate(); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java index f13b02caa2f8d268ba7449ab322d7e4deab34dd6..d9adc26ffeedfe80ae6d0436e46ed3216550e5e2 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java @@ -86,7 +86,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) public void create_succeeds() throws DatabaseUnavailableException, TableMalformedException, DatabaseNotFoundException, TableExistsException, RemoteUnavailableException, SQLException, - TableNotFoundException, QueryMalformedException, MetadataServiceException { + TableNotFoundException, QueryMalformedException, MetadataServiceException, ContainerNotFoundException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/AnalyseServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/AnalyseServiceGatewayUnitTest.java deleted file mode 100644 index f0a7346ae744a5ea507754ae0efcb5f3f17c99b1..0000000000000000000000000000000000000000 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/AnalyseServiceGatewayUnitTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.exception.*; -import at.tuwien.test.AbstractUnitTest; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.*; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.RestTemplate; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.when; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class AnalyseServiceGatewayUnitTest extends AbstractUnitTest { - - @MockBean - @Qualifier("restTemplate") - private RestTemplate restTemplate; - - @Autowired - private AnalyseServiceGateway dataDatabaseSidecarGateway; - - @BeforeEach - public void beforeEach() { - genesis(); - } - - @Test - public void importDataset_succeeds() throws RemoteUnavailableException, StorageNotFoundException, - AnalyseServiceException { - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class))) - .thenReturn(ResponseEntity.accepted() - .build()); - - /* test */ - dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename"); - } - - @Test - public void importDataset_unavailable_fails() { - - /* mock */ - doThrow(HttpServerErrorException.class) - .when(restTemplate) - .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)); - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename"); - }); - } - - @Test - public void importDataset_statusCode_fails() { - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class))) - .thenReturn(ResponseEntity.status(HttpStatus.OK) - .build()); - - /* test */ - assertThrows(AnalyseServiceException.class, () -> { - dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename"); - }); - } - - @Test - public void importDataset_s3_fails() { - - /* mock */ - doThrow(HttpClientErrorException.BadRequest.class) - .when(restTemplate) - .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)); - - /* test */ - assertThrows(StorageNotFoundException.class, () -> { - dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename"); - }); - } - - @Test - public void exportTable_succeeds() throws RemoteUnavailableException, StorageNotFoundException, - AnalyseServiceException { - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class))) - .thenReturn(ResponseEntity.accepted() - .build()); - - /* test */ - dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID); - } - - @Test - public void exportTable_unavailable_fails() { - - /* mock */ - doThrow(HttpServerErrorException.class) - .when(restTemplate) - .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)); - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID); - }); - } - - @Test - public void exportTable_statusCode_fails() { - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class))) - .thenReturn(ResponseEntity.status(HttpStatus.OK) - .build()); - - /* test */ - assertThrows(AnalyseServiceException.class, () -> { - dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID); - }); - } - - @Test - public void exportTable_s3_fails() { - - /* mock */ - doThrow(HttpClientErrorException.BadRequest.class) - .when(restTemplate) - .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)); - - /* test */ - assertThrows(StorageNotFoundException.class, () -> { - dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID); - }); - } - -} diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java index 2730e94d9cb433b198681720a2d54d1de7fdef7a..6edded0f579ea558176a0bf65526aad674203216 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java @@ -31,7 +31,8 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; @@ -247,6 +248,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { final HttpHeaders headers = new HttpHeaders(); headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); + headers.set("X-Host", CONTAINER_1_HOST); + headers.set("X-Port", "" + CONTAINER_1_PORT); /* mock */ when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class))) diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index f1dc40b5af861fafe7bf81e5a2e9690574c2c1da..f1e5d0670cbcd6bc95456e578fea45104046b1a7 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -58,8 +58,6 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest { assertNull(response.getName()); assertEquals(DATABASE_1_INTERNALNAME, response.getInternalName()); assertEquals(EXCHANGE_DBREPO_NAME, response.getExchangeName()); - assertNotNull(response.getCreator()); - assertEquals(USER_1_ID, response.getCreator().getId()); assertNotNull(response.getOwner()); assertEquals(USER_1_ID, response.getOwner().getId()); assertNotNull(response.getContact()); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java index 23503384b617ec7e066d9a0aeebe6c04c5f22a13..b6867b0c880cdb78ae3c8db040b962db8fdf0630 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java @@ -107,20 +107,13 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest { assertEquals(DATABASE_2_ID, response.getTdbid()); assertTrue(response.getIsVersioned()); assertEquals(DATABASE_2_PUBLIC, response.getIsPublic()); - assertEquals(DATABASE_2_OWNER, response.getCreatedBy()); - assertNotNull(response.getCreator()); - assertEquals(DATABASE_2_OWNER, response.getCreator().getId()); - assertEquals(USER_2_NAME, response.getCreator().getName()); - assertEquals(USER_2_USERNAME, response.getCreator().getUsername()); - assertEquals(USER_2_FIRSTNAME, response.getCreator().getFirstname()); - assertEquals(USER_2_LASTNAME, response.getCreator().getLastname()); - assertEquals(USER_2_QUALIFIED_NAME, response.getCreator().getQualifiedName()); - assertNotNull(response.getCreator().getAttributes()); - assertEquals(USER_2_AFFILIATION, response.getCreator().getAttributes().getAffiliation()); - assertEquals(USER_2_THEME, response.getCreator().getAttributes().getTheme()); - assertEquals(USER_2_LANGUAGE, response.getCreator().getAttributes().getLanguage()); - assertEquals(USER_2_ORCID_URL, response.getCreator().getAttributes().getOrcid()); - assertNull(response.getCreator().getAttributes().getMariadbPassword()); + assertNotNull(response.getOwner()); + assertEquals(DATABASE_2_OWNER, response.getOwner().getId()); + assertEquals(USER_2_NAME, response.getOwner().getName()); + assertEquals(USER_2_USERNAME, response.getOwner().getUsername()); + assertEquals(USER_2_FIRSTNAME, response.getOwner().getFirstname()); + assertEquals(USER_2_LASTNAME, response.getOwner().getLastname()); + assertEquals(USER_2_QUALIFIED_NAME, response.getOwner().getQualifiedName()); final List<IdentifierDto> identifiers = response.getIdentifiers(); assertNotNull(identifiers); assertEquals(0, identifiers.size()); @@ -147,20 +140,13 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest { assertEquals(DATABASE_1_ID, response.getTdbid()); assertTrue(response.getIsVersioned()); assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); - assertEquals(DATABASE_1_OWNER, response.getCreatedBy()); - assertNotNull(response.getCreator()); - assertEquals(DATABASE_1_OWNER, response.getCreator().getId()); - assertEquals(USER_1_NAME, response.getCreator().getName()); - assertEquals(USER_1_USERNAME, response.getCreator().getUsername()); - assertEquals(USER_1_FIRSTNAME, response.getCreator().getFirstname()); - assertEquals(USER_1_LASTNAME, response.getCreator().getLastname()); - assertEquals(USER_1_QUALIFIED_NAME, response.getCreator().getQualifiedName()); - assertNotNull(response.getCreator().getAttributes()); - assertEquals(USER_1_AFFILIATION, response.getCreator().getAttributes().getAffiliation()); - assertEquals(USER_1_THEME, response.getCreator().getAttributes().getTheme()); - assertEquals(USER_1_LANGUAGE, response.getCreator().getAttributes().getLanguage()); - assertEquals(USER_1_ORCID_UNCOMPRESSED, response.getCreator().getAttributes().getOrcid()); - assertNull(response.getCreator().getAttributes().getMariadbPassword()); + assertNotNull(response.getOwner()); + assertEquals(DATABASE_1_OWNER, response.getOwner().getId()); + assertEquals(USER_1_NAME, response.getOwner().getName()); + assertEquals(USER_1_USERNAME, response.getOwner().getUsername()); + assertEquals(USER_1_FIRSTNAME, response.getOwner().getFirstname()); + assertEquals(USER_1_LASTNAME, response.getOwner().getLastname()); + assertEquals(USER_1_QUALIFIED_NAME, response.getOwner().getQualifiedName()); final List<IdentifierDto> identifiers = response.getIdentifiers(); assertNotNull(identifiers); assertEquals(0, identifiers.size()); @@ -373,8 +359,7 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest { assertEquals("not_in_metadata_db2", response.getName()); assertEquals(DATABASE_1_ID, response.getVdbid()); assertEquals(DATABASE_1_ID, response.getDatabase().getId()); - assertEquals(DATABASE_1_OWNER, response.getCreatedBy()); - assertEquals(DATABASE_1_OWNER, response.getCreator().getId()); + assertEquals(DATABASE_1_OWNER, response.getOwner().getId()); assertFalse(response.getIsInitialView()); assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); assertTrue(response.getQuery().length() >= 69); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java index 0f0820926f71b5a78bebd0b6b97f763e99145abe..dc4179f61d44a49ce783c3b1e2e8b25ff7db0fb9 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java @@ -8,7 +8,6 @@ import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.config.S3Config; import at.tuwien.exception.*; -import at.tuwien.gateway.AnalyseServiceGateway; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; @@ -34,7 +33,6 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @Log4j2 @@ -49,9 +47,6 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { @MockBean private MetadataServiceGateway metadataServiceGateway; - @MockBean - private AnalyseServiceGateway dataDatabaseSidecarGateway; - @MockBean private StorageService storageService; @@ -78,8 +73,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { Thread.sleep(1000) /* wait for test container some more */; /* mock */ - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); /* test */ final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, Instant.now(), USER_1_ID, 0L, 10L, null, null); @@ -119,8 +114,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { Thread.sleep(1000) /* wait for test container some more */; /* mock */ - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); /* test */ final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_7_STATEMENT, Instant.now(), USER_1_ID, 0L, 10L, null, null); @@ -150,8 +145,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, QUERY_1_ID)) .thenReturn(List.of(IDENTIFIER_2_DTO)); - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); /* test */ final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, Instant.now(), USER_1_ID, 0L, 1L, null, null); @@ -255,8 +250,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { InterruptedException { /* mock */ - when(metadataServiceGateway.getUserById(QUERY_2_CREATED_BY)) - .thenReturn(QUERY_2_CREATOR); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); /* test */ persist_generic(QUERY_2_ID, List.of(IDENTIFIER_5_DTO), true); @@ -271,8 +266,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { InterruptedException { /* mock */ - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); /* test */ persist_generic(QUERY_1_ID, List.of(IDENTIFIER_2_DTO), false); @@ -322,8 +317,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, QUERY_1_ID)) .thenReturn(List.of(IDENTIFIER_2_DTO)); - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); + when(metadataServiceGateway.getUserById(USER_1_ID)) + .thenReturn(USER_1_DTO); MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, USER_1_ID); /* test */ @@ -388,9 +383,6 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { Thread.sleep(1000) /* wait for test container some more */; /* mock */ - doNothing() - .when(dataDatabaseSidecarGateway) - .exportTable(anyLong(), anyLong()); when(storageService.transformDataset(any(Dataset.class))) .thenReturn(EXPORT_RESOURCE_DTO); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index 3b59dac2c14c6e1194af7b135869273719244d1f..eea27bae218b7ac77dbd81e7c31a3fa122e761a8 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -18,7 +18,6 @@ import at.tuwien.api.database.table.internal.TableCreateDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.exception.*; -import at.tuwien.gateway.AnalyseServiceGateway; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; @@ -42,8 +41,6 @@ import java.util.*; import static at.tuwien.service.SchemaServiceIntegrationTest.assertColumn; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @Log4j2 @@ -58,9 +55,6 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { @MockBean private MetadataServiceGateway metadataServiceGateway; - @MockBean - private AnalyseServiceGateway dataDatabaseSidecarGateway; - @MockBean private StorageService storageService; @@ -742,18 +736,14 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { } @Test - public void exportTable_succeeds() throws QueryMalformedException, RemoteUnavailableException, - StorageNotFoundException, StorageUnavailableException, AnalyseServiceException, TableNotFoundException, - MalformedException { + public void exportTable_succeeds() throws QueryMalformedException, StorageNotFoundException, + StorageUnavailableException, TableNotFoundException, MalformedException { final ExportResourceDto mock = ExportResourceDto.builder() .filename("weather_aus.csv") .resource(new InputStreamResource(InputStream.nullInputStream())) .build(); /* mock */ - doNothing() - .when(dataDatabaseSidecarGateway) - .exportTable(anyLong(), anyLong()); when(storageService.getResource("weather_aus.csv")) .thenReturn(mock); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java index 4018c95334ffff498ac0f72aa28528e719d266f0..bcc0e38a46ef1452902b67136e0a7547d8c84336 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java @@ -115,8 +115,7 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest { assertEquals("not_in_metadata_db2", view0.getInternalName()); assertEquals(DATABASE_1_ID, view0.getVdbid()); assertEquals(DATABASE_1_ID, view0.getDatabase().getId()); - assertEquals(DATABASE_1_OWNER, view0.getCreatedBy()); - assertEquals(DATABASE_1_OWNER, view0.getCreator().getId()); + assertEquals(DATABASE_1_OWNER, view0.getOwner().getId()); assertFalse(view0.getIsInitialView()); assertEquals(DATABASE_1_PUBLIC, view0.getIsPublic()); assertTrue(view0.getQuery().length() >= 69); diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index ee3c9b2b6cb322239efcc4eb8c828a5c6c6e88dc..180987ded0cb6336af854b2d610a5a103619a166 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>services</artifactId> <name>dbrepo-data-service-services</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service-querystore</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/AnalyseServiceGateway.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/AnalyseServiceGateway.java deleted file mode 100644 index 0257f0b2c78ad4c2fff130ff1a96ef2fd6906677..0000000000000000000000000000000000000000 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/AnalyseServiceGateway.java +++ /dev/null @@ -1,31 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.exception.*; - -public interface AnalyseServiceGateway { - - /** - * Imports a given dataset name into the given database. - * - * @param databaseId The database id. - * @param tableId The table id. - * @param filename The dataset name. - * @throws StorageNotFoundException The dataset name was not found in the storage service. - * @throws RemoteUnavailableException Connection to the sidecar could not be established. - * @throws AnalyseServiceException The analyse service failed to import the dataset. - */ - void importDataset(Long databaseId, Long tableId, String filename) throws StorageNotFoundException, - RemoteUnavailableException, AnalyseServiceException; - - /** - * Exports a given dataset name from the given database. - * - * @param databaseId The database id. - * @param tableId The table id. - * @throws StorageNotFoundException The dataset name was not found in the storage service. - * @throws RemoteUnavailableException Connection to the sidecar could not be established. - * @throws AnalyseServiceException The analyse service failed to export the dataset. - */ - void exportTable(Long databaseId, Long tableId) throws StorageNotFoundException, - RemoteUnavailableException, AnalyseServiceException; -} diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/AnalyseServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/AnalyseServiceGatewayImpl.java deleted file mode 100644 index 2ab9d0a0188d1c351584610a2b70287750e6e3c8..0000000000000000000000000000000000000000 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/AnalyseServiceGatewayImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package at.tuwien.gateway.impl; - -import at.tuwien.config.GatewayConfig; -import at.tuwien.exception.AnalyseServiceException; -import at.tuwien.exception.RemoteUnavailableException; -import at.tuwien.exception.StorageNotFoundException; -import at.tuwien.gateway.AnalyseServiceGateway; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.RestTemplate; - -@Log4j2 -@Service -public class AnalyseServiceGatewayImpl implements AnalyseServiceGateway { - - private final RestTemplate restTemplate; - private final GatewayConfig gatewayConfig; - - @Autowired - public AnalyseServiceGatewayImpl(RestTemplate restTemplate, GatewayConfig gatewayConfig) { - this.restTemplate = restTemplate; - this.gatewayConfig = gatewayConfig; - } - - @Override - public void importDataset(Long databaseId, Long tableId, String filename) throws StorageNotFoundException, - RemoteUnavailableException, AnalyseServiceException { - final ResponseEntity<Void> response; - final String url = new StringBuilder(gatewayConfig.getAnalyseEndpoint()) - .append("/api/analyse/import?database_id=") - .append(databaseId) - .append("&table_id=") - .append(tableId) - .append("&filename=") - .append(filename) - .toString(); - log.debug("import file into data database: {}", url); - try { - response = restTemplate.exchange(url, HttpMethod.POST, HttpEntity.EMPTY, Void.class); - } catch (HttpServerErrorException e) { - log.error("Failed to import dataset with filename: {}: {}", filename, e.getMessage()); - throw new RemoteUnavailableException("Failed to import dataset: " + e.getMessage(), e); - } catch (HttpClientErrorException.BadRequest e) { - log.error("Failed to import dataset with filename: {}: not found: {}", filename, e.getMessage()); - throw new StorageNotFoundException("Failed to import dataset: not found: " + e.getMessage(), e); - } - if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) { - log.error("Failed to import dataset with filename: {}: service responded unsuccessful: {}", filename, response.getStatusCode()); - throw new AnalyseServiceException("Failed to import dataset: service responded unsuccessful: " + response.getStatusCode()); - } - } - - @Override - public void exportTable(Long databaseId, Long tableId) throws StorageNotFoundException, RemoteUnavailableException, - AnalyseServiceException { - final ResponseEntity<Void> response; - final String url = new StringBuilder(gatewayConfig.getAnalyseEndpoint()) - .append("/api/analyse/export?database_id=") - .append(databaseId) - .append("&table_id=") - .append(tableId) - .toString(); - log.debug("export file from data database: {}", url); - try { - response = restTemplate.exchange(url, HttpMethod.POST, HttpEntity.EMPTY, Void.class); - } catch (HttpServerErrorException e) { - log.error("Failed to export dataset: {}", e.getMessage()); - throw new RemoteUnavailableException("Failed to export dataset: " + e.getMessage(), e); - } catch (HttpClientErrorException.BadRequest e) { - log.error("Failed to export dataset: not found: {}", e.getMessage()); - throw new StorageNotFoundException("Failed to export dataset: not found: " + e.getMessage(), e); - } - if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) { - log.error("Failed to export dataset: service responded unsuccessful: {}", response.getStatusCode()); - throw new AnalyseServiceException("Failed to export dataset: service responded unsuccessful: " + response.getStatusCode()); - } - } -} diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java index 3c03f022b311bbbe1d161888cec1a10d07bae55a..b6593238fd82daadec664bbb2aa7a09a84e50417 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java @@ -103,7 +103,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find database with id {}: service responded unsuccessful: {}", id, response.getStatusCode()); throw new MetadataServiceException("Failed to find database: service responded unsuccessful: " + response.getStatusCode()); } - final List<String> expectedHeaders = List.of("X-Username", "X-Password"); + final List<String> expectedHeaders = List.of("X-Username", "X-Password", "X-Host", "X-Port"); if (!response.getHeaders().keySet().containsAll(expectedHeaders)) { log.error("Failed to find all privileged database headers"); log.debug("expected headers: {}", expectedHeaders); @@ -117,6 +117,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { final PrivilegedDatabaseDto database = response.getBody(); database.getContainer().setUsername(response.getHeaders().get("X-Username").get(0)); database.getContainer().setPassword(response.getHeaders().get("X-Password").get(0)); + database.getContainer().setHost(response.getHeaders().get("X-Host").get(0)); + database.getContainer().setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0))); log.debug("found privileged database username={}", database.getContainer().getUsername()); return database; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java index 7a268f52487c55fed35ddd8576c78559d57792d1..f617766d2c50fd4fd10760a99afa11a6f9767c69 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java @@ -20,7 +20,7 @@ import at.tuwien.api.database.table.constraints.foreign.ForeignKeyReferenceDto; import at.tuwien.api.database.table.constraints.foreign.ReferenceTypeDto; import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; import at.tuwien.api.database.table.constraints.unique.UniqueDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.config.QueryConfig; import at.tuwien.exception.QueryNotFoundException; import at.tuwien.exception.TableNotFoundException; @@ -115,8 +115,7 @@ public interface DataMapper { .toString()) .columns(new LinkedList<>()) .identifiers(new LinkedList<>()) - .creator(database.getOwner()) - .createdBy(database.getOwner().getId()) + .owner(database.getOwner()) .build(); } @@ -369,13 +368,9 @@ public interface DataMapper { /* note that next() is called outside this mapping function */ return QueryDto.builder() .id(data.getLong(1)) - .created(LocalDateTime.parse(data.getString(2), mariaDbFormatter) - .atZone(ZoneId.of("UTC")) - .toInstant()) - .creator(UserDto.builder() + .owner(UserBriefDto.builder() .id(UUID.fromString(data.getString(3))) .build()) - .createdBy(UUID.fromString(data.getString(3))) .query(data.getString(4)) .queryHash(data.getString(5)) .resultHash(data.getString(6)) @@ -489,7 +484,7 @@ public interface DataMapper { if (!resultSet.next()) { throw new TableNotFoundException("Failed to find table in the information schema"); } - final TableDto table = TableDto.builder() + return TableDto.builder() .name(resultSet.getString(1)) .internalName(resultSet.getString(1)) .isVersioned(resultSet.getString(2).equals("SYSTEM VERSIONED")) @@ -503,7 +498,7 @@ public interface DataMapper { .description(resultSet.getString(10)) .columns(new LinkedList<>()) .identifiers(new LinkedList<>()) - .creator(database.getOwner()) + .owner(database.getOwner()) .owner(database.getOwner()) .constraints(ConstraintsDto.builder() .foreignKeys(new LinkedList<>()) @@ -513,11 +508,6 @@ public interface DataMapper { .build()) .isPublic(database.getIsPublic()) .build(); - if (resultSet.getString(7) != null && !resultSet.getString(7).isEmpty()) { - table.setCreated(Timestamp.valueOf(resultSet.getString(7)) - .toInstant()); - } - return table; } default Object dataColumnToObject(Object data, ColumnDto column) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java index 62a5fada07dd427822fb6ef39e697ccee71c8cdc..56f51468b7188b463c8fa1e4d10129b17c0cfca7 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java @@ -307,6 +307,14 @@ public interface MariaDbMapper { return statement.toString(); } + default String tableNameToUpdateTableRawQuery(String internalName) { + final StringBuilder stringBuilder = new StringBuilder("ALTER TABLE `") + .append(internalName) + .append("` COMMENT = ?;"); + log.trace("mapped update table statement: {}", stringBuilder); + return stringBuilder.toString(); + } + default String tableCreateDtoToCreateTableRawQuery(at.tuwien.api.database.table.internal.TableCreateDto data) { final StringBuilder stringBuilder = new StringBuilder("CREATE TABLE `") .append(nameToInternalName(data.getName())) diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java index a585f2e98ad8d39b4c0c290ae9c48fc8840f7581..61a95b32d3f004de402c3619aa322a349a040d32 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -13,6 +13,8 @@ import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; +import at.tuwien.api.identifier.IdentifierBriefDto; +import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.PrivilegedUserDto; import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; @@ -55,4 +57,6 @@ public interface MetadataMapper { }) TableBriefDto tableDtoToTableBriefDto(TableDto data); + IdentifierBriefDto identifierDtoToIdentifierBriefDto(IdentifierDto data); + } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java index b346a187a59756a934ed47c1168472c485252ffc..77482805ee6fb49d9ae992cd1f871ae162430499 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java @@ -1,14 +1,12 @@ package at.tuwien.service; import at.tuwien.ExportResourceDto; -import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.exception.MalformedException; import at.tuwien.exception.StorageNotFoundException; import at.tuwien.exception.StorageUnavailableException; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; -import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -71,7 +69,7 @@ public interface StorageService { /** * Transforms the given dataset into a downloadable dataset. * - * @param data The dataset. + * @param data The dataset. * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. */ ExportResourceDto transformDataset(Dataset<Row> data) throws StorageUnavailableException; @@ -85,6 +83,7 @@ public interface StorageService { * @return The dataset. * @throws StorageNotFoundException The key was not found in the Storage Service. * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. + * @throws MalformedException The field lengths for the table and dataset are not the same. */ Dataset<Row> loadDataset(List<String> columns, String key, Boolean withHeader) throws StorageNotFoundException, StorageUnavailableException, MalformedException; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java index 938da8820c829113193be4e5fd95d2e20e0c0029..78b2fe8f8986c97b39618022284f011020e1e26c 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java @@ -82,6 +82,7 @@ public interface SubsetService { * @return The row count. * @throws TableMalformedException The table is malformed. * @throws SQLException The connection to the database could not be established. + * @throws QueryMalformedException The re-execute query is malformed. */ Long reExecuteCount(PrivilegedDatabaseDto database, QueryDto query) throws TableMalformedException, SQLException, QueryMalformedException; @@ -113,10 +114,11 @@ public interface SubsetService { * @throws StorageNotFoundException The exported subset was not found from the key provided by the sidecar in the Storage Service. * @throws StorageUnavailableException The communication to the Storage Service failed. * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. + * @throws ViewNotFoundException The source view was not found in the metadata database. */ ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp) throws SQLException, QueryMalformedException, StorageNotFoundException, StorageUnavailableException, RemoteUnavailableException, - ViewNotFoundException, MalformedException; + ViewNotFoundException; /** * Executes a subset query without saving it. @@ -141,12 +143,11 @@ public interface SubsetService { * @throws QueryNotFoundException The query store did not return a query. * @throws SQLException The connection to the database could not be established. * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. - * @throws UserNotFoundException The user that created the query was not found in the Metadata Service. * @throws DatabaseNotFoundException The database metadata was not found in the Metadata Service. * @throws MetadataServiceException Communication with the Metadata Service failed. */ QueryDto findById(PrivilegedDatabaseDto database, Long queryId) throws QueryNotFoundException, SQLException, - RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, MetadataServiceException; + RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException; /** * Inserts a query and metadata to the query store of a given database id. @@ -182,6 +183,16 @@ public interface SubsetService { */ void deleteStaleQueries(PrivilegedDatabaseDto database) throws SQLException, QueryStoreGCException; - Dataset<Row> getData(@NotNull PrivilegedDatabaseDto database, String viewName, Instant timestamp) throws ViewNotFoundException, - QueryMalformedException; + /** + * Exports data as dataset from the database view with given name at a given timestamp. + * + * @param database The database. + * @param viewName The view name. + * @param timestamp The timestamp. + * @return The dataset. + * @throws ViewNotFoundException The view was not found in the metadata database. + * @throws QueryMalformedException The query to eis malformed. + */ + Dataset<Row> getData(@NotNull PrivilegedDatabaseDto database, String viewName, Instant timestamp) + throws ViewNotFoundException, QueryMalformedException; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java index c70d1b703f714f9201aa8ffb972763aca1c72691..7bf4fb3f566b0e490d0ded26abb7dbc568d4e77f 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java @@ -61,14 +61,26 @@ public interface TableService { * @param database The data database privileged object. * @param data The table definition. * @return The created table, if successful. - * @throws SQLException Failed to parse SQL query, contains invalid syntax. - * @throws TableNotFoundException The table could not be inspected in the data database. - * @throws TableExistsException The table name already exists in the information_schema. - * @throws TableNotFoundException The table could not be inspected in the data database. + * @throws SQLException Query statement is malformed. + * @throws TableMalformedException The table schema is malformed. + * @throws TableExistsException The table name already exists in the information_schema. + * @throws TableNotFoundException The table could not be inspected in the metadata database. */ TableDto createTable(PrivilegedDatabaseDto database, TableCreateDto data) throws SQLException, TableMalformedException, TableExistsException, TableNotFoundException; + /** + * Updating table description. + * + * @param table The table. + * @param data The description. + * @throws SQLException Query statement is malformed. + * @throws TableMalformedException The table schema is malformed. + * @throws TableNotFoundException The table could not be inspected in the metadata database. + */ + void updateTable(PrivilegedTableDto table, TableUpdateDto data) throws SQLException, + TableMalformedException, TableNotFoundException; + /** * Drops a table in given table object. * @@ -122,8 +134,8 @@ public interface TableService { * @param table The table. * @param data The dataset metadata. * @throws MalformedException The dataset is malformed. - * @throws StorageUnavailableException Failed to establish a connection with the Storage Service. * @throws StorageNotFoundException The storage service was not able to find the dataset for import. + * @throws StorageUnavailableException Failed to establish a connection with the Storage Service. * @throws SQLException Failed to parse SQL query, contains invalid syntax. * @throws QueryMalformedException The import query is malformed, likely due to a bug in the application. */ diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java index 26c04e401bb15945f1b438bd5af10beeccd470f7..48aa5ec3cfbd3968a00f3d1dcaf46108fd33eb07 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java @@ -6,7 +6,6 @@ import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.exception.*; import jakarta.validation.constraints.NotNull; import org.apache.spark.sql.Dataset; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java index b2a9b0c8408953e0a694a1ae6d3e36c8ebfe485d..7bb5927692131560b8a54e78c78c418d67ecc757 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java @@ -3,7 +3,7 @@ package at.tuwien.service.impl; import at.tuwien.api.container.internal.PrivilegedContainerDto; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.config.RabbitConfig; import at.tuwien.exception.DatabaseMalformedException; @@ -53,13 +53,10 @@ public class DatabaseServiceMariaDbImpl extends HibernateConnector implements Da return PrivilegedDatabaseDto.builder() .internalName(data.getInternalName()) .exchangeName(rabbitConfig.getExchangeName()) - .creator(UserDto.builder() + .owner(UserBriefDto.builder() .id(data.getUserId()) .build()) - .owner(UserDto.builder() - .id(data.getUserId()) - .build()) - .contact(UserDto.builder() + .contact(UserBriefDto.builder() .id(data.getUserId()) .build()) .container(container) diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java index 1aba3c6b9942386f171c1a4fe029658667a633a1..faa9510a0981106a1fd6f82038143429d6f71f2b 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java @@ -105,9 +105,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche } } table.setTdbid(database.getId()); - database.getCreator().getAttributes().setMariadbPassword(null); - table.setCreator(database.getCreator()); - table.setCreatedBy(database.getCreator().getId()); + table.setOwner(database.getOwner()); final TableDto tmpTable = table; tmpTable.getColumns() .forEach(column -> { @@ -143,8 +141,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche ViewDto view = dataMapper.schemaResultSetToView(database, resultSet1); view.setDatabase(database); view.setVdbid(database.getId()); - view.setCreator(database.getOwner()); - view.setCreatedBy(privilegedDatabase.getOwner().getId()); + view.setOwner(database.getOwner()); /* obtain view columns */ start = System.currentTimeMillis(); final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java index 8c5cc6d601a4165d4abc22c1a9ab1e0e94766656..9a0f1fb27902a291e4676ba3b565b6161e41a152 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java @@ -8,6 +8,7 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.columns.ColumnDto; +import at.tuwien.api.identifier.IdentifierBriefDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.identifier.IdentifierTypeDto; import at.tuwien.exception.*; @@ -162,6 +163,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs query.setIdentifiers(identifiers.stream() .filter(i -> i.getType().equals(IdentifierTypeDto.SUBSET)) .filter(i -> i.getQueryId().equals(query.getId())) + .map(metadataMapper::identifierDtoToIdentifierBriefDto) .toList()); queries.add(query); } @@ -178,7 +180,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs @Override public ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp) throws SQLException, QueryMalformedException, StorageNotFoundException, StorageUnavailableException, - RemoteUnavailableException, ViewNotFoundException, MalformedException { + RemoteUnavailableException, ViewNotFoundException { final String viewName = "ex_" + Hashing.sha512() .hashString(new String(RandomUtils.nextBytes(256), Charset.defaultCharset()), Charset.defaultCharset()) .toString() @@ -261,7 +263,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs @Override public QueryDto findById(PrivilegedDatabaseDto database, Long queryId) throws QueryNotFoundException, SQLException, - RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, MetadataServiceException { + RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException { final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); try { @@ -274,8 +276,12 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs throw new QueryNotFoundException("Failed to find query"); } final QueryDto query = dataMapper.resultSetToQueryDto(resultSet); - query.setIdentifiers(metadataServiceGateway.getIdentifiers(database.getId(), queryId)); - query.setCreator(database.getOwner()); + final List<IdentifierBriefDto> identifiers = metadataServiceGateway.getIdentifiers(database.getId(), queryId) + .stream() + .map(metadataMapper::identifierDtoToIdentifierBriefDto) + .toList(); + query.setIdentifiers(identifiers); + query.setOwner(database.getOwner()); query.setDatabaseId(database.getId()); return query; } catch (SQLException e) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java index 0eea223f7e450ad54efba1cd28063b116ea9afe9..db46aed12b9917c25ef5c1a6a348f179e8fd6a42 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java @@ -166,6 +166,30 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table return table; } + @Override + public void updateTable(PrivilegedTableDto table, TableUpdateDto data) throws SQLException, + TableMalformedException { + final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase()); + final Connection connection = dataSource.getConnection(); + try { + /* create table if not exists */ + final long start = System.currentTimeMillis(); + final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.tableNameToUpdateTableRawQuery(table.getInternalName())); + log.trace("prepare with arg 1={}", data.getDescription()); + statement.setString(1, data.getDescription()); + statement.executeUpdate(); + log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + connection.commit(); + } catch (SQLException e) { + connection.rollback(); + log.error("Failed to update table: {}", e.getMessage()); + throw new TableMalformedException("Failed to update table: " + e.getMessage(), e); + } finally { + dataSource.close(); + } + log.info("Updated table with name {}", table.getInternalName()); + } + @Override public void delete(PrivilegedTableDto table) throws SQLException, QueryMalformedException { final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase()); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java index 7ca776ff8a37987aaf640012d665036f695bf058..49cc6b7505ce3561b6f336196438c692a08e2b16 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java @@ -114,8 +114,7 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe .hashString(data.getQuery(), StandardCharsets.UTF_8) .toString()) .isPublic(database.getIsPublic()) - .creator(database.getOwner()) - .createdBy(database.getOwner().getId()) + .owner(database.getOwner()) .identifiers(new LinkedList<>()) .isInitialView(false) .vdbid(database.getId()) diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf index dfec5ea42bbe5f4c77e0858d7e54213c60d99372..15daf4381ddfa3195e999801d509aba4a778cb6c 100644 --- a/dbrepo-gateway-service/dbrepo.conf +++ b/dbrepo-gateway-service/dbrepo.conf @@ -105,7 +105,7 @@ server { proxy_read_timeout 90; } - location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export|statistic) { + location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export) { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/dbrepo-metadata-db/1_setup-schema.sql b/dbrepo-metadata-db/1_setup-schema.sql index 29a0e856569f3a2b1a0c69d207a7a4bdf5b079cc..0a43ef604460e8deb4e4fee4f457c0ca833fc6a2 100644 --- a/dbrepo-metadata-db/1_setup-schema.sql +++ b/dbrepo-metadata-db/1_setup-schema.sql @@ -78,23 +78,23 @@ CREATE TABLE IF NOT EXISTS `mdb_licenses` CREATE TABLE IF NOT EXISTS `mdb_databases` ( - id SERIAL, - cid BIGINT UNSIGNED NOT NULL, - name character varying(255) NOT NULL, - internal_name character varying(255) NOT NULL, - exchange_name character varying(255) NOT NULL, - description text, - engine character varying(20), - is_public boolean NOT NULL DEFAULT TRUE, - image longblob, - created_by character varying(36), - owned_by character varying(36), - contact_person character varying(36), - created timestamp NOT NULL DEFAULT NOW(), - last_modified timestamp, + id SERIAL, + cid BIGINT UNSIGNED NOT NULL, + name character varying(255) NOT NULL, + internal_name character varying(255) NOT NULL, + exchange_name character varying(255) NOT NULL, + description text, + engine character varying(20), + is_public boolean NOT NULL DEFAULT TRUE, + is_schema_public boolean NOT NULL DEFAULT TRUE, + image longblob, + owned_by character varying(36), + contact_person character varying(36), + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, PRIMARY KEY (id), FOREIGN KEY (cid) REFERENCES mdb_containers (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), FOREIGN KEY (owned_by) REFERENCES mdb_users (id), FOREIGN KEY (contact_person) REFERENCES mdb_users (id) ) WITH SYSTEM VERSIONING; @@ -108,33 +108,34 @@ CREATE TABLE IF NOT EXISTS `mdb_databases_subjects` CREATE TABLE IF NOT EXISTS `mdb_tables` ( - ID SERIAL, - tDBID BIGINT UNSIGNED NOT NULL, - tName VARCHAR(64) NOT NULL, - internal_name VARCHAR(64) NOT NULL, - queue_name VARCHAR(255) NOT NULL, - routing_key VARCHAR(255), - tDescription VARCHAR(2048), - num_rows BIGINT, - data_length BIGINT, - max_data_length BIGINT, - avg_row_length BIGINT, - `separator` CHAR(1), - quote CHAR(1), - element_null VARCHAR(50), - skip_lines BIGINT, - element_true VARCHAR(50), - element_false VARCHAR(50), - Version TEXT, - created timestamp NOT NULL DEFAULT NOW(), - versioned boolean not null default true, - created_by character varying(36) NOT NULL, - owned_by character varying(36) NOT NULL, - last_modified timestamp, + ID SERIAL, + tDBID BIGINT UNSIGNED NOT NULL, + tName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + queue_name VARCHAR(255) NOT NULL, + routing_key VARCHAR(255), + tDescription VARCHAR(2048), + num_rows BIGINT, + data_length BIGINT, + max_data_length BIGINT, + avg_row_length BIGINT, + `separator` CHAR(1), + quote CHAR(1), + element_null VARCHAR(50), + skip_lines BIGINT, + element_true VARCHAR(50), + element_false VARCHAR(50), + Version TEXT, + created timestamp NOT NULL DEFAULT NOW(), + versioned boolean not null default true, + is_public boolean not null default true, + is_schema_public boolean not null default true, + owned_by character varying(36) NOT NULL, + last_modified timestamp, PRIMARY KEY (ID), UNIQUE (tDBID, internal_name), FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), FOREIGN KEY (owned_by) REFERENCES mdb_users (id) ) WITH SYSTEM VERSIONING; @@ -314,20 +315,21 @@ CREATE TABLE IF NOT EXISTS `mdb_columns_units` CREATE TABLE IF NOT EXISTS `mdb_view` ( - id SERIAL, - vdbid BIGINT UNSIGNED NOT NULL, - vName VARCHAR(64) NOT NULL, - internal_name VARCHAR(64) NOT NULL, - Query TEXT NOT NULL, - query_hash VARCHAR(255) NOT NULL, - Public BOOLEAN NOT NULL, - InitialView BOOLEAN NOT NULL, - created timestamp NOT NULL DEFAULT NOW(), - last_modified timestamp, - created_by character varying(36) NOT NULL, + id SERIAL, + vdbid BIGINT UNSIGNED NOT NULL, + vName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + Query TEXT NOT NULL, + query_hash VARCHAR(255) NOT NULL, + Public BOOLEAN NOT NULL DEFAULT TRUE, + is_schema_public boolean NOT NULL DEFAULT TRUE, + InitialView BOOLEAN NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + owned_by character varying(36) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (vdbid) REFERENCES mdb_databases (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id) + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) ) WITH SYSTEM VERSIONING; CREATE TABLE IF NOT EXISTS `mdb_banner_messages` @@ -395,11 +397,11 @@ CREATE TABLE IF NOT EXISTS `mdb_identifiers` result_number BIGINT, doi VARCHAR(255), created TIMESTAMP NOT NULL DEFAULT NOW(), - created_by VARCHAR(36) NOT NULL, + owned_by VARCHAR(36) NOT NULL, last_modified TIMESTAMP, PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ FOREIGN KEY (dbid) REFERENCES mdb_databases (id), - FOREIGN KEY (created_by) REFERENCES mdb_users (id) + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) ) WITH SYSTEM VERSIONING; CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` @@ -451,8 +453,8 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` CREATE TABLE IF NOT EXISTS `mdb_related_identifiers` ( id SERIAL, - pid BIGINT UNSIGNED NOT NULL, - value varchar(255) NOT NULL, + pid BIGINT UNSIGNED NOT NULL, + value varchar(255) NOT NULL, type ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID') NOT NULL, relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL, PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ diff --git a/dbrepo-metadata-service/api/pom.xml b/dbrepo-metadata-service/api/pom.xml index 9196e2d228a12234adee7a5cbf0eb9a51da8adf6..8e77c818a4f1c0b353a854636b1f437edf4d5546 100644 --- a/dbrepo-metadata-service/api/pom.xml +++ b/dbrepo-metadata-service/api/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-api</artifactId> <name>dbrepo-metadata-service-api</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service-entities</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> <scope>compile</scope> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java index 7acd4fc3ce7d225eb38de8a369dc34c60d185c49..4038a39dc608db197ca0572882cca1218b4f6c32 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java @@ -46,9 +46,4 @@ public class ContainerBriefDto { @NotNull @Schema(example = "10") private Integer count; - - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java index 8f745f9ee9795b1dc69dd92bdd0a660ee8e2b071..9928c8e54d39287fc7a19bf84b6a99c7429f69bd 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java @@ -35,6 +35,7 @@ public class ContainerDto { @NotBlank private String host; + @NotNull private Integer port; @JsonProperty("ui_host") @@ -54,9 +55,4 @@ public class ContainerDto { @Schema(example = "10") private Long count; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java index 3a7a375618d22c2fb3f85bb14d5494401d03dc04..545bd2a2d91cffbffa330ba047532ca654a9b256 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java @@ -35,6 +35,7 @@ public class PrivilegedContainerDto { @NotBlank private String host; + @NotNull private Integer port; @JsonProperty("ui_host") @@ -46,19 +47,10 @@ public class PrivilegedContainerDto { @NotNull private ImageDto image; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - @ToString.Exclude private String username; @ToString.Exclude private String password; - private Long defaultTimestampFormatId; - - private Long defaultDateFormatId; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java index 271bae9b4d589c0b1fd03b2e0413ddacfcca20d4..7abc667741cc8ae31f3e0a7dd3e4ef66e8b78ccd 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java @@ -1,6 +1,7 @@ package at.tuwien.api.database; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -33,14 +34,9 @@ public class DatabaseAccessDto { private Long hdbid; @NotNull - private UserDto user; + private UserBriefDto user; @NotNull private AccessTypeDto type; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java index 49c7c58e8a1dfb00bd89dafca87afa74effbeea9..e8456c42ef8d0dc6a464a43be64c940faa46c792 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java @@ -1,5 +1,6 @@ package at.tuwien.api.database; +import at.tuwien.api.identifier.IdentifierBriefDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; @@ -42,18 +43,14 @@ public class DatabaseBriefDto { @Schema(example = "true") private Boolean isPublic; - private List<IdentifierDto> identifiers; + private List<IdentifierBriefDto> identifiers; @ToString.Exclude @NotNull private UserBriefDto contact; @NotNull - private UserBriefDto owner; - - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; + @JsonProperty("owner_id") + private UserBriefDto ownerId; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java index 264919dfaa0631f503bc50b5aecb1c966d6e0018..a20d9456bbd33addde563579ee03e9f7d17c6f73 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java @@ -30,4 +30,9 @@ public class DatabaseCreateDto { @Schema(example = "true") private Boolean isPublic; + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java index d68e6802da3141d362eafed4c1e258eeeecdf3de..3343f23b68597b89d1fcd1af177191365ce20d1c 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java @@ -1,9 +1,9 @@ package at.tuwien.api.database; -import at.tuwien.api.container.ContainerDto; -import at.tuwien.api.database.table.TableDto; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.container.ContainerBriefDto; +import at.tuwien.api.database.table.TableBriefDto; +import at.tuwien.api.identifier.IdentifierBriefDto; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; @@ -48,42 +48,39 @@ public class DatabaseDto { @Schema(example = "Air Quality") private String description; - private List<TableDto> tables; + private List<TableBriefDto> tables; - private List<ViewDto> views; + private List<ViewBriefDto> views; @NotNull @JsonProperty("is_public") @Schema(example = "true") private Boolean isPublic; + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + @ToString.Exclude @NotNull - private ContainerDto container; + private ContainerBriefDto container; private List<DatabaseAccessDto> accesses; - private List<IdentifierDto> identifiers; + private List<IdentifierBriefDto> identifiers; - private List<IdentifierDto> subsets; + private List<IdentifierBriefDto> subsets; @ToString.Exclude @NotNull - private UserDto creator; + private UserBriefDto contact; @ToString.Exclude @NotNull - private UserDto contact; - - @NotNull - private UserDto owner; + private UserBriefDto owner; @JsonProperty("preview_image") private String previewImage; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java index 9fb05f6d09d3dbc17a38159c56adbf2ba6bf4ea3..f5a9aa0961a5e9bb99862354e723701ba1b5ba74 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java @@ -21,4 +21,9 @@ public class DatabaseModifyVisibilityDto { @Schema(example = "true") private Boolean isPublic; + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java index fbdbcc53801811c82f4e66aa30e30107e63f0cfc..7c4a9a72472e8b36cfe3964262c75c77ef916e10 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java @@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized; @ToString public class LoadFileDto { - @NotBlank(message = "filepath is required") + @NotBlank @Schema(example = "sample.csv") private String filepath; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java index ffb4ccb3de3964661744f8e4555f89178df5c2a3..e29bfbc109b13b9671b66e94d86d104e2fa2ad23 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java @@ -1,15 +1,12 @@ package at.tuwien.api.database; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import lombok.*; import lombok.extern.jackson.Jacksonized; import java.time.Instant; @@ -40,12 +37,14 @@ public class ViewBriefDto { @Schema(example = "air_quality") private String internalName; - private IdentifierDto identifier; - @JsonProperty("is_public") @Schema(example = "true") private Boolean isPublic; + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + @JsonProperty("initial_view") @Schema(example = "true", description = "True if it is the default view for the database") private Boolean isInitialView; @@ -59,20 +58,7 @@ public class ViewBriefDto { @Schema(example = "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916") private String queryHash; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - - @JsonIgnore - private UUID createdBy; - - @NotNull - private UserDto creator; - - @JsonProperty("last_modified") - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant lastModified; + @JsonProperty("owned_by") + private UUID ownedBy; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java index 583b5f0d81aab8f8af7ca71efcd743ac8a079b27..9fcb734f58e342c7bef4d28ab062b6752176eb9f 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java @@ -32,4 +32,9 @@ public class ViewCreateDto { @Schema(example = "true") private Boolean isPublic; + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java index 30f16448d36462da23dc27ba38512f61dab58b25..294bd04bd4ef873ac08cab943d0726f6ba9efaeb 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java @@ -1,20 +1,17 @@ package at.tuwien.api.database; import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import lombok.*; +import lombok.extern.jackson.Jacksonized; import java.time.Instant; import java.util.List; -import java.util.UUID; @Getter @Setter @@ -51,6 +48,10 @@ public class ViewDto { @Schema(example = "true") private Boolean isPublic; + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + @JsonProperty("initial_view") @Schema(example = "true", description = "True if it is the default view for the database") private Boolean isInitialView; @@ -65,22 +66,9 @@ public class ViewDto { private String queryHash; @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - - @JsonIgnore - private UUID createdBy; - - @NotNull - private UserDto creator; + private UserBriefDto owner; @NotNull private List<ViewColumnDto> columns; - @JsonProperty("last_modified") - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant lastModified; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewUpdateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewUpdateDto.java new file mode 100644 index 0000000000000000000000000000000000000000..434ce0d9b695ba45d127bcc16725cc72e3bc83c2 --- /dev/null +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewUpdateDto.java @@ -0,0 +1,28 @@ +package at.tuwien.api.database; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Jacksonized +@ToString +public class ViewUpdateDto { + + @NotNull + @JsonProperty("is_public") + @Schema(example = "true") + private Boolean isPublic; + + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + +} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java index 2ad2c1a968bf2b59ac6a9812d5b9dc09bf2ca53a..a9eaba6a8556d931c73f599bb1c9716ee8663c27 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java @@ -5,8 +5,7 @@ import at.tuwien.api.database.DatabaseAccessDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; -import com.fasterxml.jackson.annotation.JsonFormat; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -14,7 +13,6 @@ import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.extern.jackson.Jacksonized; -import java.time.Instant; import java.util.List; @Getter @@ -59,6 +57,12 @@ public class PrivilegedDatabaseDto { @Schema(example = "true") private Boolean isPublic; + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + + @ToString.Exclude @NotNull private PrivilegedContainerDto container; @@ -66,18 +70,17 @@ public class PrivilegedDatabaseDto { private List<IdentifierDto> identifiers; - @NotNull - private UserDto creator; + private List<IdentifierDto> subsets; + @ToString.Exclude @NotNull - private UserDto contact; + private UserBriefDto contact; + @ToString.Exclude @NotNull - private UserDto owner; + private UserBriefDto owner; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; + @JsonProperty("preview_image") + private String previewImage; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java index 5053f8c5d6330834acf382435218353841be4c8b..135073d55646eb8aab92a2d4311b686527b2bc1e 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java @@ -1,23 +1,18 @@ package at.tuwien.api.database.internal; -import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.ViewColumnDto; -import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.extern.jackson.Jacksonized; -import org.springframework.data.annotation.Id; import java.time.Instant; import java.util.List; -import java.util.UUID; @Getter @Setter @@ -28,7 +23,6 @@ import java.util.UUID; @ToString public class PrivilegedViewDto { - @Id @NotNull private Long id; @@ -37,6 +31,7 @@ public class PrivilegedViewDto { private Long vdbid; @NotNull + @ToString.Exclude private PrivilegedDatabaseDto database; @NotBlank @@ -54,6 +49,10 @@ public class PrivilegedViewDto { @Schema(example = "true") private Boolean isPublic; + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + @JsonProperty("initial_view") @Schema(example = "true", description = "True if it is the default view for the database") private Boolean isInitialView; @@ -68,22 +67,9 @@ public class PrivilegedViewDto { private String queryHash; @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - - @JsonIgnore - private UUID createdBy; + private UserBriefDto owner; @NotNull - private UserDto creator; - - @NotNull(message = "columns are required") private List<ViewColumnDto> columns; - @JsonProperty("last_modified") - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant lastModified; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java index afc6a6b640051597b35ad5927f42b0ee48f8b42c..fbc8bfebe0b58bfe48e976af1c2e00fcc159e12d 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java @@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized; @ToString public class ExecuteStatementDto { - @NotBlank(message = "statement is required") + @NotBlank @Schema(example = "SELECT `id` FROM `air_quality`") private String statement; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java index b844947b836a0b2cee5771fc8ecdb022664a0b33..1b2b1e03865f982d79d1a226990d6bd45bd07d10 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java @@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized; @ToString public class ExportDto { - @NotBlank(message = "location is required") + @NotBlank @Schema(example = "/tmp/file.csv") private String location; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java index 1b31d9d6199c3f6ba2c24ae8a25c09dbd1cf0522..a50c2d1bdf3e0cce964669dfe6bf779581c2b2b5 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java @@ -17,7 +17,7 @@ import lombok.extern.jackson.Jacksonized; @ToString public class ImportDto { - @NotBlank(message = "location is required") + @NotBlank @Schema(example = "file.csv") private String location; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java index 64a54bcb1a2fb7940c10ec996cff3a53db14900e..28f8b61a52cd63df6ad0a750cf9dad28ee04dba8 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java @@ -1,20 +1,17 @@ package at.tuwien.api.database.query; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.identifier.IdentifierBriefDto; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import lombok.*; import lombok.extern.jackson.Jacksonized; import java.time.Instant; import java.util.List; -import java.util.UUID; @Getter @@ -26,26 +23,22 @@ import java.util.UUID; @ToString public class QueryBriefDto { - @NotNull(message = "id is required") + @NotNull private Long id; - @NotNull(message = "database id is required") + @NotNull @JsonProperty("database_id") private Long databaseId; - @JsonIgnore - @NotNull(message = "created by is required") - private UUID createdBy; - - @NotNull(message = "creator is required") - private UserDto creator; + @NotNull + private UserBriefDto owner; @NotNull @Schema(example = "2022-01-01 08:00:00.000") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC") private Instant execution; - @NotBlank(message = "statement is required") + @NotBlank @Schema(example = "SELECT `id` FROM `air_quality`") private String query; @@ -53,7 +46,7 @@ public class QueryBriefDto { @Schema(example = "SELECT `id` FROM `air_quality`") private String queryNormalized; - @NotBlank(message = "query hash is required") + @NotBlank @JsonProperty("query_hash") @Schema(example = "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76") private String queryHash; @@ -74,17 +67,6 @@ public class QueryBriefDto { @Schema(example = "query") private QueryTypeDto type; - private List<IdentifierDto> identifiers; - - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - - @NotNull - @JsonProperty("last_modified") - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant lastModified; + private List<IdentifierBriefDto> identifiers; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java index 8ba38220618c88065402f2bbc1664313311177b2..b26a8c3c4ef8dbd4144f373d8d5211f6f4b3ae5d 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java @@ -1,20 +1,17 @@ package at.tuwien.api.database.query; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.identifier.IdentifierBriefDto; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import lombok.*; import lombok.extern.jackson.Jacksonized; import java.time.Instant; import java.util.List; -import java.util.UUID; @Getter @Setter @@ -25,27 +22,22 @@ import java.util.UUID; @ToString public class QueryDto { - @NotNull(message = "id is required") + @NotNull private Long id; - @NotNull(message = "database id is required") + @NotNull @JsonProperty("database_id") private Long databaseId; - @JsonIgnore - @EqualsAndHashCode.Exclude - @NotNull(message = "created by is required") - private UUID createdBy; - - @NotNull(message = "creator is required") - private UserDto creator; + @NotNull + private UserBriefDto owner; @NotNull @Schema(example = "2021-03-12T15:26:21Z") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant execution; - @NotBlank(message = "statement is required") + @NotBlank @Schema(example = "SELECT `id` FROM `air_quality`") private String query; @@ -58,9 +50,9 @@ public class QueryDto { private QueryTypeDto type; @NotNull - private List<IdentifierDto> identifiers; + private List<IdentifierBriefDto> identifiers; - @NotBlank(message = "query hash is required") + @NotBlank @JsonProperty("query_hash") @Schema(example = "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76") private String queryHash; @@ -78,15 +70,4 @@ public class QueryDto { @Schema(example = "1") private Long resultNumber; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonProperty("last_modified") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant lastModified; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java index 724d3da41ac0e71d52a009e1733e73c093413a55..19fd6ffbaf7827b60f63f1a08bd9103363a40e26 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java @@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized; @ToString public class SaveStatementDto { - @NotBlank(message = "statement is required") + @NotBlank @Schema(example = "SELECT `id` FROM `air_quality`") private String statement; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java index 11f99f48eb7cf29d06a03b7ab8b8fb6930769672..615948486cd07626d9701b03df99852df4cebb9c 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java @@ -12,6 +12,7 @@ import jakarta.validation.constraints.NotNull; import lombok.extern.jackson.Jacksonized; import java.util.List; +import java.util.UUID; @Getter @Setter @@ -47,5 +48,16 @@ public class TableBriefDto { private Boolean isVersioned; @NotNull - private UserBriefDto owner; + @JsonProperty("is_public") + @Schema(example = "true") + private Boolean isPublic; + + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + + @NotNull + @JsonProperty("owned_by") + private UUID ownedBy; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java index e2ef252708c4457165e126ea228b17aa00177c57..602eef4e5dcd6ad6155df627afdea411ce1bc73e 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java @@ -31,6 +31,16 @@ public class TableCreateDto { @Schema(example = "Air Quality in Austria") private String description; + @NotNull + @JsonProperty("is_public") + @Schema(example = "true") + private Boolean isPublic; + + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + @NotNull private List<ColumnCreateDto> columns; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java index a512cf8010195e5c107f35d8d2756251460bca62..2370f45429c10e01b5de09ea3a2a8dd278e2c729 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java @@ -3,20 +3,18 @@ package at.tuwien.api.database.table; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.constraints.ConstraintsDto; import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.*; import lombok.extern.jackson.Jacksonized; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - import java.time.Instant; import java.util.List; -import java.util.UUID; @Getter @Setter @@ -57,14 +55,12 @@ public class TableDto { private Boolean isVersioned; @NotNull - @JsonProperty("created_by") - private UUID createdBy; - - @NotNull - private UserDto creator; + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; @NotNull - private UserDto owner; + private UserBriefDto owner; @NotBlank @JsonProperty("queue_name") @@ -84,7 +80,7 @@ public class TableDto { @Schema(example = "Air Quality in Austria") private String description; - @NotNull(message = "isPublic is required") + @NotNull @JsonProperty("is_public") @Schema(example = "true") private Boolean isPublic; @@ -105,11 +101,6 @@ public class TableDto { @Schema(example = "3276", description = "in bytes") private Long avgRowLength; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - @NotNull private List<ColumnDto> columns; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java index b127b0b1b8a8712ab3bf284ab1014bc7c2f10bae..87dfbd2eef6b121f27febf12357821ce6a585327 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java @@ -18,15 +18,15 @@ import java.time.Instant; @ToString public class TableHistoryDto { - @NotNull(message = "event timestamp is required") + @NotNull @Schema(example = "2021-03-12T15:26:21Z") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant timestamp; - @NotNull(message = "event name is required") + @NotNull private String event; - @NotNull(message = "total number is required") + @NotNull @Schema(example = "1") private Long total; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableUpdateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableUpdateDto.java new file mode 100644 index 0000000000000000000000000000000000000000..d8db27005306a871fc3b8c250fcda5737abd79ef --- /dev/null +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableUpdateDto.java @@ -0,0 +1,32 @@ +package at.tuwien.api.database.table; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Jacksonized +@ToString +public class TableUpdateDto { + + @Size(max = 180) + @Schema(example = "Air Quality in Austria") + private String description; + + @NotNull + @JsonProperty("is_public") + @Schema(example = "true") + private Boolean isPublic; + + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; +} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java index e3a0845c88a6b310a21094ab533281ded387b817..eb626b0eaf806fab422ffb2c91f0cd38ac8e486c 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java @@ -16,7 +16,7 @@ import java.util.Map; @ToString public class TupleDeleteDto { - @NotNull(message = "primary key columns are required") + @NotNull private Map<String, Object> keys; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java index 2378318ae534ab75a30811cd27cde6da8927dd3b..fee00469b127f71361fbfd88013c915038023fae 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java @@ -16,10 +16,10 @@ import java.util.Map; @ToString public class TupleUpdateDto { - @NotNull(message = "data is required") + @NotNull private Map<String, Object> data; - @NotNull(message = "primary key columns are required") + @NotNull private Map<String, Object> keys; } \ No newline at end of file diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java index e811991912c8188ae0506d8bc344eb53f208e90d..938315457433287d353a1e5722719d53a776098c 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java @@ -17,22 +17,22 @@ import lombok.extern.jackson.Jacksonized; @ToString public class ColumnBriefDto { - @NotNull(message = "id is required") + @NotNull private Long id; @JsonProperty("database_id") - @NotNull(message = "database id is required") + @NotNull private Long databaseId; @JsonProperty("table_id") - @NotNull(message = "table id is required") + @NotNull private Long tableId; - @NotBlank(message = "name is required") + @NotBlank @Schema(example = "date") private String name; - @NotBlank(message = "internal name is required") + @NotBlank @JsonProperty("internal_name") @Schema(example = "mdb_date") private String internalName; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java index dc9c62f00a27a4fd6d86c5f6a32c84a759d7d628..df171a5ee45c2dd81af2454d9c6a564ed333cfca 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java @@ -32,11 +32,6 @@ public class ConceptDto { private String description; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - @NotNull private List<ColumnBriefDto> columns; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java index 89c64b2c03895b8662dfc174d215434a17f651bc..bd2975c0cc53162fab217c49f8a4a0001f6b047d 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java @@ -32,11 +32,6 @@ public class UnitDto { private String description; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - @NotNull private List<ColumnBriefDto> columns; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java index e166e4e0b2c9e5922ca49aa3769081a9b50629b1..fcc95fdc0c63d58803d3fe6ca2136dbd6322f8f1 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java @@ -4,18 +4,18 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.constraints.ConstraintsDto; import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.user.UserDto; +import at.tuwien.api.user.UserBriefDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.*; import lombok.extern.jackson.Jacksonized; import java.time.Instant; import java.util.List; -import java.util.UUID; @Getter @Setter @@ -24,6 +24,7 @@ import java.util.UUID; @AllArgsConstructor @Jacksonized @ToString +@EqualsAndHashCode(onlyExplicitlyIncluded = true) public class PrivilegedTableDto { @NotNull @@ -31,6 +32,7 @@ public class PrivilegedTableDto { @NotNull @JsonProperty("database_id") + @EqualsAndHashCode.Include private Long tdbid; @NotBlank @@ -40,6 +42,7 @@ public class PrivilegedTableDto { @NotBlank @JsonProperty("internal_name") @Schema(example = "air_quality") + @EqualsAndHashCode.Include private String internalName; @Schema @@ -53,14 +56,12 @@ public class PrivilegedTableDto { private Boolean isVersioned; @NotNull - @JsonProperty("created_by") - private UUID createdBy; - - @NotNull - private UserDto creator; + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; @NotNull - private UserDto owner; + private UserBriefDto owner; @NotBlank @JsonProperty("queue_name") @@ -73,13 +74,14 @@ public class PrivilegedTableDto { @NotBlank @JsonProperty("routing_key") - @Schema(example = "dbrepo.database.air_quality") + @Schema(example = "dbrepo.1.2") private String routingKey; + @Size(max = 2048) @Schema(example = "Air Quality in Austria") private String description; - @NotNull(message = "isPublic is required") + @NotNull @JsonProperty("is_public") @Schema(example = "true") private Boolean isPublic; @@ -100,11 +102,6 @@ public class PrivilegedTableDto { @Schema(example = "3276", description = "in bytes") private Long avgRowLength; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - @NotNull private List<ColumnDto> columns; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java index 0db45a9f1b5690c4cb1d4e3a988b4c76824713e1..777a870bb9650f0e06b732f0a5776a6768902945 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java @@ -2,6 +2,7 @@ package at.tuwien.api.database.table.internal; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -29,6 +30,16 @@ public class TableCreateDto { @Schema(example = "Air Quality in Austria") private String description; + @NotNull + @JsonProperty("is_public") + @Schema(example = "true") + private Boolean isPublic; + + @NotNull + @JsonProperty("is_schema_public") + @Schema(example = "true") + private Boolean isSchemaPublic; + @NotNull private List<ColumnCreateDto> columns; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java index 686c86e5c65ca7356160e4cee5ff890cc6a1bf78..0a36c561a30a480f14251e1ddab396b8a3fcc9ae 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java @@ -3,11 +3,13 @@ package at.tuwien.api.identifier; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.extern.jackson.Jacksonized; import java.time.Instant; +import java.util.List; import java.util.UUID; @Getter @@ -27,21 +29,40 @@ public class IdentifierBriefDto { @Schema(example = "1") private Long databaseId; - private IdentifierStatusTypeDto status; + @JsonProperty("query_id") + @Schema(example = "1") + private Long queryId; + + @JsonProperty("table_id") + @Schema(example = "1") + private Long tableId; + + @JsonProperty("view_id") + @Schema(example = "1") + private Long viewId; @NotNull - @JsonProperty("created_by") - private UUID createdBy; + private IdentifierTypeDto type; @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; + private List<IdentifierTitleDto> titles; + + @Schema(example = "10.1038/nphys1170") + private String doi; + + @NotBlank + @Schema(example = "TU Wien") + private String publisher; + + @NotNull + @JsonProperty("publication_year") + @Schema(example = "2022") + private Integer publicationYear; + + private IdentifierStatusTypeDto status; @NotNull - @JsonProperty("last_modified") - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant lastModified; + @JsonProperty("created_by") + private UUID createdBy; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java index 156111771606f756ad997d71659a19a4da9f731e..bff087c5905b817df53f5b338d2cee0284dfa95e 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java @@ -4,14 +4,12 @@ import at.tuwien.api.database.LanguageTypeDto; import at.tuwien.api.database.LicenseDto; import at.tuwien.api.user.UserDto; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.extern.jackson.Jacksonized; -import org.springframework.data.annotation.Id; import java.time.Instant; import java.util.List; @@ -94,7 +92,7 @@ public class IdentifierDto { private String publisher; @NotNull - private UserDto creator; + private UserDto owner; @JsonProperty("publication_day") @Schema(example = "15") @@ -122,15 +120,4 @@ public class IdentifierDto { @JsonProperty("created_by") private UUID createdBy; - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - - @NotNull - @JsonProperty("last_modified") - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant lastModified; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java index 0306da3a7c390e0cb02fe77ff9875b6659365379..271333c49dcce9d0be8a16605c6dd89ad11f837e 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java @@ -37,11 +37,6 @@ public class RelatedIdentifierDto { @Schema(example = "Cites") private RelationTypeDto relation; - @ToString.Exclude - @JsonIgnore - @NotNull - private UserDto creator; - } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java index c5972276838a99410b941e352d83b98e874ea5ae..09099331ec7cb5a37fd2b3ce8604f59b97005d7b 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java @@ -51,11 +51,4 @@ public class OntologyDto { @Schema(example = "rdf/om-2.0.rdf") private String rdfPath; - private UserBriefDto creator; - - @NotNull - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - } diff --git a/dbrepo-metadata-service/entities/pom.xml b/dbrepo-metadata-service/entities/pom.xml index c308f0163b8da4f65b01efcfbedce90d7a0fb9c1..6a8f527f188040713c0f259fb9ade60e7ef5b4dd 100644 --- a/dbrepo-metadata-service/entities/pom.xml +++ b/dbrepo-metadata-service/entities/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-entities</artifactId> <name>dbrepo-metadata-service-entity</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies/> diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java index 17b8308bbaac7e202557208875e566240d928d32..41808a14535ff310233cc77627376cc6684365bc 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java @@ -50,17 +50,6 @@ public class Database implements Serializable { @Column(updatable = false, nullable = false) private Long id; - @ToString.Exclude - @JdbcTypeCode(java.sql.Types.VARCHAR) - @Column(name = "created_by", columnDefinition = "VARCHAR(36)") - private UUID createdBy; - - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) - @JoinColumns({ - @JoinColumn(name = "created_by", referencedColumnName = "ID", insertable = false, updatable = false) - }) - private User creator; - @ToString.Exclude @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "owned_by", columnDefinition = "VARCHAR(36)") @@ -130,9 +119,12 @@ public class Database implements Serializable { @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<DatabaseAccess> accesses; - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "boolean default true") private Boolean isPublic; + @Column(nullable = false, columnDefinition = "boolean default true") + private Boolean isSchemaPublic; + @Lob @Basic(fetch = FetchType.LAZY) @Column(columnDefinition = "LONGBLOB") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java index 28f2ec69c28e84dffcb7c08f9f28941c4dcced54..2421612358cf37f8ce600c494dc3eca30afe0762 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java @@ -29,9 +29,9 @@ import java.util.UUID; @Table(name = "mdb_view") @NamedQueries({ @NamedQuery(name = "View.findAllPublicByDatabaseId", query = "select v from View v where v.database.id = ?1 and v.isPublic = true"), - @NamedQuery(name = "View.findAllPublicOrMineByDatabaseId", query = "select v from View v where v.database.id = ?1 and (v.isPublic = true or v.createdBy = ?2)"), + @NamedQuery(name = "View.findAllPublicOrMineByDatabaseId", query = "select v from View v where v.database.id = ?1 and (v.isPublic = true or v.ownedBy = ?2)"), @NamedQuery(name = "View.findPublicByDatabaseIdAndId", query = "select v from View v where v.database.id = ?1 and v.id = ?2 and v.isPublic = true"), - @NamedQuery(name = "View.findPublicOrMineByDatabaseIdAndId", query = "select v from View v where v.database.id = ?1 and v.id = ?2 and (v.isPublic = true or v.createdBy = ?3)") + @NamedQuery(name = "View.findPublicOrMineByDatabaseIdAndId", query = "select v from View v where v.database.id = ?1 and v.id = ?2 and (v.isPublic = true or v.ownedBy = ?3)") }) public class View { @@ -48,14 +48,14 @@ public class View { @ToString.Exclude @JdbcTypeCode(java.sql.Types.VARCHAR) - @Column(name = "created_by", columnDefinition = "VARCHAR(36)") - private UUID createdBy; + @Column(name = "owned_by", columnDefinition = "VARCHAR(36)") + private UUID ownedBy; @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumns({ - @JoinColumn(name = "created_by", referencedColumnName = "ID", insertable = false, updatable = false) + @JoinColumn(name = "owned_by", referencedColumnName = "ID", insertable = false, updatable = false) }) - private User creator; + private User owner; @Column(name = "vname", nullable = false, columnDefinition = "VARCHAR(64)") private String name; @@ -63,9 +63,12 @@ public class View { @Column(nullable = false, columnDefinition = "VARCHAR(64)") private String internalName; - @Column(name = "public", nullable = false) + @Column(name = "public", nullable = false, columnDefinition = "boolean default true") private Boolean isPublic; + @Column(name = "is_schema_public", nullable = false, columnDefinition = "boolean default true") + private Boolean isSchemaPublic; + @Column(name = "initialview", nullable = false) private Boolean isInitialView; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java index 08f6bd9426a8906d4edc4863ecc6f3540cb39448..2fe81e2e37df1e23822ae8a4216a332411d221fe 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -1,13 +1,14 @@ package at.tuwien.entities.database.table; -import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.entities.database.Database; +import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.entities.database.table.constraints.Constraints; import at.tuwien.entities.identifier.Identifier; import at.tuwien.entities.user.User; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.CascadeType; import jakarta.persistence.OrderBy; +import jakarta.persistence.*; import lombok.*; import lombok.extern.log4j.Log4j2; import org.hibernate.annotations.*; @@ -15,8 +16,6 @@ import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import jakarta.persistence.*; - import java.time.Instant; import java.util.List; import java.util.UUID; @@ -45,18 +44,6 @@ public class Table { @Column(updatable = false, nullable = false) private Long tdbid; - @JdbcTypeCode(java.sql.Types.VARCHAR) - @Column(name = "created_by", columnDefinition = "VARCHAR(36)") - private UUID createdBy; - - @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumns({ - @JoinColumn(name = "created_by", referencedColumnName = "ID", insertable = false, updatable = false) - }) - private User creator; - - @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "owned_by", columnDefinition = "VARCHAR(36)") private UUID ownedBy; @@ -103,9 +90,15 @@ public class Table { @Embedded private Constraints constraints; - @Column(name = "versioned", columnDefinition = "boolean default true") + @Column(name = "versioned", nullable = false, columnDefinition = "boolean default true") private Boolean isVersioned; + @Column(name = "is_public", nullable = false, columnDefinition = "boolean default true") + private Boolean isPublic; + + @Column(name = "is_schema_public", nullable = false, columnDefinition = "boolean default true") + private Boolean isSchemaPublic; + @Column(name = "num_rows") private Long numRows; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java index abf76758cc49fefe717f6546198559fa2b0e17af..7e4252a44504746f8c3d4c409f4242e3a523d9f1 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java @@ -155,9 +155,9 @@ public class Identifier implements Serializable { @Column private String doi; - @Column(nullable = false) + @Column(name = "owned_by", nullable = false) @JdbcTypeCode(java.sql.Types.VARCHAR) - private UUID createdBy; + private UUID ownedBy; /** * Users are never created/updated/deleted by the Identifier entity. @@ -165,9 +165,9 @@ public class Identifier implements Serializable { @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ - @JoinColumn(name = "createdBy", referencedColumnName = "ID", insertable = false, updatable = false) + @JoinColumn(name = "owned_by", referencedColumnName = "ID", insertable = false, updatable = false) }) - private User creator; + private User owner; @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") diff --git a/dbrepo-metadata-service/metrics.md b/dbrepo-metadata-service/metrics.md index 440f20b8e05ea12053ab275bb019a8cd444b1180..56a69c68f6913ab2e3ea192cde66f329ea336e10 100644 --- a/dbrepo-metadata-service/metrics.md +++ b/dbrepo-metadata-service/metrics.md @@ -51,6 +51,7 @@ | `dbrepo_statistic_table_update` | Update statistics | | `dbrepo_table_create` | Create table | | `dbrepo_table_delete` | Delete table | +| `dbrepo_table_update` | Update table | | `dbrepo_tables_find` | Find table | | `dbrepo_tables_findall` | List tables | | `dbrepo_tables_refresh` | Update database table schemas | @@ -64,5 +65,6 @@ | `dbrepo_view_create` | Create view | | `dbrepo_view_delete` | Delete view | | `dbrepo_view_find` | Get view | +| `dbrepo_view_update` | Update view | | `dbrepo_views_findall` | List views | | `dbrepo_views_refresh` | Update database view schemas | diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index fddf87ecb4127be0539b63697cba01d0ffa59d61..32925ee9ff1c042a0edb5a22ebb1929f9ff63390 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-oai</artifactId> <name>dbrepo-metadata-service-oai</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index 56ab43349a657baf2cdc5b8bd84f7d1fc19e72f2..138d346aeedf77ed2ae7c991a209e76ba11ae443 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> <name>dbrepo-metadata-service</name> - <version>1.5.2</version> + <version>1.6.0</version> <description>Service that manages the metadata</description> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 95ea8b8b975a11e5851dbde6e60de8e01a8f20f5..f71cbfeb96f6307986b2ee87a5f9ba99f8cfd001 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-report</artifactId> <name>dbrepo-metadata-service-report</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 816f71a1cb2390a56ecf35eb3682ed29e34d0372..480ba479be0f98ca6d7748a25545625cce000ecd 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-repositories</artifactId> <name>dbrepo-metadata-service-repositories</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java index 82e09d1c0f2f5867a2064a67853691a5bb034778..98c77c7b0d64d8ced9436ae67cda9fca73bf07b1 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -10,6 +10,7 @@ import at.tuwien.api.container.image.ImageCreateDto; import at.tuwien.api.container.image.ImageDto; import at.tuwien.api.crossref.CrossrefDto; import at.tuwien.api.database.*; +import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; @@ -117,7 +118,9 @@ public interface MetadataMapper { @Mapping(target = "id", source = "id"), @Mapping(target = "count", expression = "java(data.getDatabases().size())"), }) - ContainerBriefDto containerToDatabaseContainerBriefDto(Container data); + ContainerBriefDto containerToContainerBriefDto(Container data); + + PrivilegedDatabaseDto databaseToPrivilegedDatabaseDto(Database data); @Mappings({ @Mapping(target = "titles", source = "."), @@ -298,6 +301,9 @@ public interface MetadataMapper { }) IdentifierDto identifierToIdentifierDto(Identifier data); + @Mappings({ + @Mapping(target = "databaseId", source = "database.id") + }) IdentifierBriefDto identifierToIdentifierBriefDto(Identifier data); default IdentifierTitle identifierToIdentifierTitle(Identifier data, String lang) { @@ -477,12 +483,11 @@ public interface MetadataMapper { @Mappings({ @Mapping(target = "databaseId", source = "tdbid"), + @Mapping(target = "isPublic", source = "database.isPublic"), }) TableBriefDto tableToTableBriefDto(Table data); default UniqueDto uniqueToUniqueDto(Unique data) { -// data.getTable().setOwner(null); /* loop */ -// data.getTable().setCreator(null); /* loop */ return UniqueDto.builder() .id(data.getId()) .name(data.getName()) @@ -494,10 +499,6 @@ public interface MetadataMapper { .build(); } - @Mappings({ - @Mapping(target = "table.owner", ignore = true), - @Mapping(target = "referencedTable.owner", ignore = true), - }) ForeignKeyDto foreignKeyToForeignKeyDto(ForeignKey data); ForeignKeyBriefDto foreignKeyDtoToForeignKeyBriefDto(ForeignKeyDto data); @@ -524,73 +525,82 @@ public interface MetadataMapper { } default TableDto customTableToTableDto(Table data) { + return customTableToTableDto(data, true, true, true); + } + + default TableDto customTableToTableDto(Table data, Boolean broker, Boolean statistic, Boolean schema) { final TableDto table = TableDto.builder() .id(data.getId()) .name(data.getName()) .internalName(data.getInternalName()) - .owner(userToUserDto(data.getOwner())) - .createdBy(data.getCreatedBy()) - .creator(userToUserDto(data.getCreator())) + .owner(userToUserBriefDto(data.getOwner())) .tdbid(data.getTdbid()) - .routingKey("dbrepo." + data.getTdbid() + "." + data.getId()) - .queueName(data.getQueueName()) .isPublic(data.getDatabase().getIsPublic()) + .isSchemaPublic(data.getIsSchemaPublic()) .isVersioned(true) - .avgRowLength(data.getAvgRowLength()) - .maxDataLength(data.getMaxDataLength()) - .dataLength(data.getDataLength()) - .numRows(data.getNumRows()) .description(data.getDescription()) .identifiers(new LinkedList<>()) .columns(new LinkedList<>()) - .created(data.getCreated()) .constraints(constraintsToConstraintsDto(data.getConstraints())) .build(); - table.getConstraints() - .getPrimaryKey() - .forEach(pk -> { - pk.getTable().setDatabaseId(data.getDatabase().getId()); - pk.getColumn().setTableId(data.getId()); - pk.getColumn().setDatabaseId(data.getDatabase().getId()); - }); - table.getConstraints() - .getForeignKeys() - .forEach(fk -> { - fk.getTable().setDatabaseId(table.getTdbid()); - fk.getReferencedTable().setDatabaseId(table.getTdbid()); - fk.getReferences() - .forEach(ref -> { - ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk)); - ref.getColumn().setTableId(table.getId()); - ref.getColumn().setDatabaseId(table.getTdbid()); - ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId()); - ref.getReferencedColumn().setDatabaseId(table.getTdbid()); - }); - }); - table.getConstraints() - .getUniques() - .forEach(uk -> { - uk.getTable().setDatabaseId(data.getDatabase().getId()); - uk.getColumns() - .forEach(column -> { - column.setTableId(data.getId()); - column.setDatabaseId(data.getDatabase().getId()); - }); - }); - if (data.getConstraints().getChecks() == null || data.getConstraints().getChecks().isEmpty()) { - table.getConstraints().setChecks(new LinkedHashSet<>()); - } if (data.getIdentifiers() != null) { table.setIdentifiers(new LinkedList<>(data.getIdentifiers() .stream() .map(this::identifierToIdentifierDto) .toList())); } - if (data.getColumns() != null) { - table.setColumns(new LinkedList<>(data.getColumns() - .stream() - .map(this::tableColumnToColumnDto) - .toList())); + if (broker) { + table.setQueueName(data.getQueueName()); + table.setQueueType("quorum"); + table.setRoutingKey("dbrepo." + data.getTdbid() + "." + data.getId()); + } + if (statistic) { + table.setAvgRowLength(data.getAvgRowLength()); + table.setMaxDataLength(data.getMaxDataLength()); + table.setDataLength(data.getDataLength()); + table.setNumRows(data.getNumRows()); + } + if (schema) { + table.getConstraints() + .getPrimaryKey() + .forEach(pk -> { + pk.getTable().setDatabaseId(data.getDatabase().getId()); + pk.getColumn().setTableId(data.getId()); + pk.getColumn().setDatabaseId(data.getDatabase().getId()); + }); + table.getConstraints() + .getForeignKeys() + .forEach(fk -> { + fk.getTable().setDatabaseId(table.getTdbid()); + fk.getReferencedTable().setDatabaseId(table.getTdbid()); + fk.getReferences() + .forEach(ref -> { + ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk)); + ref.getColumn().setTableId(table.getId()); + ref.getColumn().setDatabaseId(table.getTdbid()); + ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId()); + ref.getReferencedColumn().setDatabaseId(table.getTdbid()); + }); + }); + table.getConstraints() + .getUniques() + .forEach(uk -> { + uk.getTable().setDatabaseId(data.getDatabase().getId()); + uk.getColumns() + .forEach(column -> { + column.setTableId(data.getId()); + column.setDatabaseId(data.getDatabase().getId()); + }); + }); + if (data.getConstraints().getChecks() == null || data.getConstraints().getChecks().isEmpty()) { + table.getConstraints().setChecks(new LinkedHashSet<>()); + } + if (data.getColumns() != null) { + table.setColumns(new LinkedList<>(data.getColumns() + .stream() + .map(this::tableColumnToColumnDto) + .toList())); + } } return table; } @@ -615,9 +625,6 @@ public interface MetadataMapper { }) Table tableDtoToTable(TableDto data); - @Mappings({ - @Mapping(target = "table.owner", ignore = true) - }) PrimaryKeyDto primaryKeyToPrimaryKeyDto(PrimaryKey data); ReferenceType referenceTypeDtoToReferenceType(ReferenceTypeDto data); @@ -831,9 +838,6 @@ public interface MetadataMapper { ViewBriefDto viewToViewBriefDto(View data); - @Mappings({ - @Mapping(target = "createdBy", source = "creator.id"), - }) View viewDtoToView(ViewDto data); /* keep */ @@ -855,7 +859,18 @@ public interface MetadataMapper { LanguageType languageTypeDtoToLanguageType(LanguageTypeDto data); - default DatabaseDto customDatabaseToDatabaseDto(Database data) { + default Boolean onlyIsPublicOrOwner(Boolean isPublic, User caller, User owner, User databaseOwner) { + if (isPublic) { + return true; + } + /* private schema */ + if (caller == null) { + return false; + } + return owner.equals(caller) || databaseOwner.equals(caller); + } + + default DatabaseDto customDatabaseToDatabaseDto(Database data, User caller) { if (data == null) { return null; } @@ -867,11 +882,10 @@ public interface MetadataMapper { .exchangeName(data.getExchangeName()) .previewImage(data.getImage() != null ? "/api/database/" + data.getId() + "/image" : null) .isPublic(data.getIsPublic()) - .container(containerToContainerDto(data.getContainer())) - .creator(userToUserDto(data.getCreator())) - .owner(userToUserDto(data.getOwner())) - .created(data.getCreated()) - .contact(userToUserDto(data.getContact())) + .isSchemaPublic(data.getIsSchemaPublic()) + .container(containerToContainerBriefDto(data.getContainer())) + .owner(userToUserBriefDto(data.getOwner())) + .contact(userToUserBriefDto(data.getContact())) .subsets(new LinkedList<>()) .accesses(new LinkedList<>()) .tables(new LinkedList<>()) @@ -880,19 +894,21 @@ public interface MetadataMapper { if (data.getSubsets() != null) { database.setSubsets(new LinkedList<>(data.getSubsets() .stream() - .map(this::identifierToIdentifierDto) + .map(this::identifierToIdentifierBriefDto) .toList())); } if (data.getTables() != null) { database.setTables(new LinkedList<>(data.getTables() .stream() - .map(this::customTableToTableDto) + .filter(t -> onlyIsPublicOrOwner(t.getIsSchemaPublic() || t.getIsPublic(), caller, t.getOwner(), t.getDatabase().getOwner())) + .map(this::tableToTableBriefDto) .toList())); } if (data.getViews() != null) { database.setViews(new LinkedList<>(data.getViews() .stream() - .map(this::viewToViewDto) + .filter(v -> onlyIsPublicOrOwner(v.getIsSchemaPublic() || v.getIsPublic(), caller, v.getOwner(), v.getDatabase().getOwner())) + .map(this::viewToViewBriefDto) .toList())); } if (data.getAccesses() != null) { @@ -904,15 +920,12 @@ public interface MetadataMapper { if (data.getIdentifiers() != null) { database.setIdentifiers(new LinkedList<>(data.getIdentifiers() .stream() - .map(this::identifierToIdentifierDto) + .map(this::identifierToIdentifierBriefDto) .toList())); } return database; } - @Mappings({ - @Mapping(target = "created", source = "created", dateFormat = "dd-MM-yyyy HH:mm"), - }) DatabaseBriefDto databaseToDatabaseBriefDto(Database data); AccessType accessTypeDtoToAccessType(AccessTypeDto data); diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index 613d4c4d4a6bd2db151b037fc8933013a370e9bd..67b149976cd1bb218d2e995b89e6c3d8e81ced3a 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-rest-service</artifactId> <name>dbrepo-metadata-service-rest</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java index 62319662e24b78f9e456d1d0cabd8fd79639c85f..7995b79bf62117f2f360375af08eb93e1d80eee5 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java @@ -67,7 +67,7 @@ public class ContainerEndpoint { log.debug("endpoint find all containers, limit={}", limit); final List<ContainerBriefDto> dtos = containerService.getAll(limit) .stream() - .map(metadataMapper::containerToDatabaseContainerBriefDto) + .map(metadataMapper::containerToContainerBriefDto) .collect(Collectors.toList()); log.debug("find all containers resulted in {} container(s)", dtos.size()); return ResponseEntity.ok() diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index 2eeb947c5586bbcfedceebed30918c3ea7212bd8..f0e2aaeaa1c046aa582d6ea97931fa5c706dcf2d 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -3,7 +3,6 @@ package at.tuwien.endpoints; import at.tuwien.api.database.*; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.entities.container.Container; -import at.tuwien.entities.container.image.DataType; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.user.User; @@ -155,13 +154,14 @@ public class DatabaseEndpoint { SearchServiceException, SearchServiceConnectionException, ContainerQuotaException { log.debug("endpoint create database, data.name={}", data.getName()); final Container container = containerService.find(data.getCid()); + final User caller = userService.findByUsername(principal.getName()); if (container.getDatabases().size() + 1 > container.getQuota()) { log.error("Failed to create database: quota of {} exceeded", container.getQuota()); throw new ContainerQuotaException("Failed to create database: quota of " + container.getQuota() + " exceeded"); } final User user = userService.findByUsername(principal.getName()); final Database database = databaseService.create(container, data, user); - final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database); + final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database, caller); return ResponseEntity.status(HttpStatus.CREATED) .body(dto); } @@ -207,16 +207,17 @@ public class DatabaseEndpoint { }) public ResponseEntity<DatabaseDto> refreshTableMetadata(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull Principal principal) throws DataServiceException, - DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, + DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, UserNotFoundException, SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, MalformedException, TableNotFoundException { log.debug("endpoint refresh database metadata, databaseId={}", databaseId); - Database database = databaseService.findById(databaseId); + final Database database = databaseService.findById(databaseId); + final User caller = userService.findByUsername(principal.getName()); if (!database.getOwner().equals(principal)) { log.error("Failed to refresh database tables metadata: not owner"); throw new NotAllowedException("Failed to refresh tables metadata: not owner"); } - final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateTableMetadata(database)); + final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateTableMetadata(database), caller); return ResponseEntity.ok(dto); } @@ -256,15 +257,16 @@ public class DatabaseEndpoint { }) public ResponseEntity<DatabaseDto> refreshViewMetadata(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull Principal principal) throws DataServiceException, - DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, + DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, UserNotFoundException, SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, ViewNotFoundException { log.debug("endpoint refresh database metadata, databaseId={}", databaseId); - Database database = databaseService.findById(databaseId); + final Database database = databaseService.findById(databaseId); + final User caller = userService.findByUsername(principal.getName()); if (!database.getOwner().equals(principal)) { log.error("Failed to refresh database views metadata: not owner"); throw new NotAllowedException("Failed to refresh database views metadata: not owner"); } - final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateViewMetadata(database)); + final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateViewMetadata(database), caller); return ResponseEntity.ok(dto); } @@ -310,14 +312,15 @@ public class DatabaseEndpoint { public ResponseEntity<DatabaseDto> visibility(@NotNull @PathVariable("databaseId") Long databaseId, @Valid @RequestBody DatabaseModifyVisibilityDto data, @NotNull Principal principal) throws DatabaseNotFoundException, - NotAllowedException, SearchServiceException, SearchServiceConnectionException { + NotAllowedException, SearchServiceException, SearchServiceConnectionException, UserNotFoundException { log.debug("endpoint modify database visibility, databaseId={}, data={}", databaseId, data); final Database database = databaseService.findById(databaseId); - if (!database.getOwner().equals(principal)) { + final User caller = userService.findByUsername(principal.getName()); + if (!database.getOwner().equals(caller)) { log.error("Failed to modify database visibility: not owner"); throw new NotAllowedException("Failed to modify database visibility: not owner"); } - final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyVisibility(database, data)); + final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyVisibility(database, data), caller); return ResponseEntity.accepted() .body(dto); } @@ -368,13 +371,13 @@ public class DatabaseEndpoint { SearchServiceException, SearchServiceConnectionException { log.debug("endpoint transfer database, databaseId={}, transferDto.id={}", databaseId, data.getId()); final Database database = databaseService.findById(databaseId); - final User user = userService.findByUsername(principal.getName()); + final User caller = userService.findByUsername(principal.getName()); final User newOwner = userService.findById(data.getId()); - if (!database.getOwner().equals(user)) { + if (!database.getOwner().equals(caller)) { log.error("Failed to transfer database: not owner"); throw new NotAllowedException("Failed to transfer database: not owner"); } - final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyOwner(database, newOwner)); + final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyOwner(database, newOwner), caller); return ResponseEntity.accepted() .body(dto); } @@ -425,8 +428,8 @@ public class DatabaseEndpoint { StorageUnavailableException, StorageNotFoundException { log.debug("endpoint modify database image, databaseId={}, data.key={}", databaseId, data.getKey()); final Database database = databaseService.findById(databaseId); - final User user = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(user)) { + final User caller = userService.findByUsername(principal.getName()); + if (!database.getOwner().equals(caller)) { log.error("Failed to update database image: not owner"); throw new NotAllowedException("Failed to update database image: not owner"); } @@ -435,7 +438,7 @@ public class DatabaseEndpoint { if (data.getKey() != null) { image = storageService.getBytes(data.getKey()); } - dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyImage(database, image)); + dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyImage(database, image), caller); return ResponseEntity.accepted() .body(dto); } @@ -480,7 +483,7 @@ public class DatabaseEndpoint { mediaType = "application/json", schema = @Schema(implementation = DatabaseDto.class))}), @ApiResponse(responseCode = "404", - description = "Database or exchange could not be found", + description = "Database, user or exchange could not be found", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -497,10 +500,16 @@ public class DatabaseEndpoint { }) public ResponseEntity<DatabaseDto> findById(@NotNull @PathVariable("databaseId") Long databaseId, Principal principal) throws DataServiceException, - DataServiceConnectionException, DatabaseNotFoundException, ExchangeNotFoundException { + DataServiceConnectionException, DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException { log.debug("endpoint find database, databaseId={}", databaseId); final Database database = databaseService.findById(databaseId); - final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database); + final User caller; + if (principal != null) { + caller = userService.findByUsername(principal.getName()); + } else { + caller = null; + } + final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database, caller); if (database.getOwner().equals(principal)) { log.debug("current logged-in user is also the owner: additionally load access list"); /* only owner sees the access rights */ @@ -514,7 +523,9 @@ public class DatabaseEndpoint { if (UserUtil.isSystem(principal)) { headers.set("X-Username", database.getContainer().getPrivilegedUsername()); headers.set("X-Password", database.getContainer().getPrivilegedPassword()); - headers.set("Access-Control-Expose-Headers", "X-Username X-Password"); + headers.set("X-Host", database.getContainer().getHost()); + headers.set("X-Port", "" + database.getContainer().getPort()); + headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port"); } return ResponseEntity.status(HttpStatus.OK) .headers(headers) diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java index 7f2e0ee93d25bd1a0b593803983fd870bc22214a..354b7245fd1daa18faa5824c74d20fb5ffb1ce58 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java @@ -3,7 +3,10 @@ package at.tuwien.endpoints; import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.table.columns.concepts.ConceptDto; import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.api.identifier.*; +import at.tuwien.api.identifier.BibliographyTypeDto; +import at.tuwien.api.identifier.IdentifierCreateDto; +import at.tuwien.api.identifier.IdentifierDto; +import at.tuwien.api.identifier.IdentifierSaveDto; import at.tuwien.api.identifier.ld.LdDatasetDto; import at.tuwien.api.user.external.ExternalMetadataDto; import at.tuwien.config.EndpointConfig; @@ -409,7 +412,7 @@ public class IdentifierEndpoint { final User user = userService.findByUsername(principal.getName()); final Identifier identifier = identifierService.find(identifierId); /* check owner */ - if (!identifier.getCreator().equals(user) && !UserUtil.hasRole(principal, "create-foreign-identifier")) { + if (!identifier.getOwner().equals(user) && !UserUtil.hasRole(principal, "create-foreign-identifier")) { log.error("Failed to save identifier: foreign user"); throw new NotAllowedException("Failed to save identifier: foreign user"); } @@ -436,7 +439,7 @@ public class IdentifierEndpoint { throw new MalformedException("Failed to save view identifier: only parameters database_id & view_id must be present"); } final View view = viewService.findById(database, data.getViewId()); - if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(view.getCreator(), principal, access, "create-foreign-identifier")) { + if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(view.getOwner(), principal, access, "create-foreign-identifier")) { log.error("Failed to save view identifier: insufficient access or role"); throw new MalformedException("Failed to save view identifier: insufficient access or role"); } @@ -459,7 +462,7 @@ public class IdentifierEndpoint { } log.debug("retrieving subset from data service: data.database_id={}, data.query_id={}", data.getDatabaseId(), data.getQueryId()); final QueryDto query = dataServiceGateway.findQuery(data.getDatabaseId(), data.getQueryId()); - final User queryCreator = userService.findById(query.getCreator().getId()); + final User queryCreator = userService.findById(query.getOwner().getId()); if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(queryCreator, principal, access, "create-foreign-identifier")) { log.error("Failed to create subset identifier: insufficient access or role"); throw new MalformedException("Failed to create subset identifier: insufficient access or role"); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index ef897d06ee3701c5018fd7bc3e3ae8fd20de0bf0..3dbc450735cc1db936d1351cf89087411ee7dba8 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -3,6 +3,7 @@ package at.tuwien.endpoints; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.TableDto; +import at.tuwien.api.database.table.TableUpdateDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.api.error.ApiErrorDto; @@ -14,10 +15,7 @@ import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.mapper.MetadataMapper; -import at.tuwien.service.DatabaseService; -import at.tuwien.service.EntityService; -import at.tuwien.service.TableService; -import at.tuwien.service.UserService; +import at.tuwien.service.*; import at.tuwien.utils.UserUtil; import at.tuwien.validation.EndpointValidator; import io.micrometer.observation.annotation.Observed; @@ -53,17 +51,19 @@ public class TableEndpoint { private final UserService userService; private final TableService tableService; private final EntityService entityService; + private final AccessService accessService; private final MetadataMapper metadataMapper; private final DatabaseService databaseService; private final EndpointValidator endpointValidator; @Autowired public TableEndpoint(UserService userService, TableService tableService, EntityService entityService, - MetadataMapper metadataMapper, DatabaseService databaseService, + AccessService accessService, MetadataMapper metadataMapper, DatabaseService databaseService, EndpointValidator endpointValidator) { this.userService = userService; this.tableService = tableService; this.entityService = entityService; + this.accessService = accessService; this.metadataMapper = metadataMapper; this.databaseService = databaseService; this.endpointValidator = endpointValidator; @@ -151,12 +151,12 @@ public class TableEndpoint { .body(dtos); } - @PutMapping("/{tableId}") + @PutMapping("/{tableId}/statistic") @Transactional @PreAuthorize("hasAuthority('update-table-statistic')") @Observed(name = "dbrepo_statistic_table_update") @Operation(summary = "Update statistics", - description = "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. Requires role `update-table-statistic`", + description = "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. Requires role `update-table-statistic`.", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -358,6 +358,63 @@ public class TableEndpoint { .body(dto); } + @PutMapping("/{tableId}") + @Transactional(rollbackFor = {Exception.class}) + @PreAuthorize("hasAuthority('update-table')") + @Observed(name = "dbrepo_table_update") + @Operation(summary = "Update table", + description = "Updates a table in the database with id. Requires role `update-table`.", + security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "202", + description = "Updated the table", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = TableBriefDto.class))}), + @ApiResponse(responseCode = "400", + description = "Update table visibility payload is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Update table visibility not permitted", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Table could not be found", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<TableDto> update(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("tableId") Long tableId, + @NotNull @Valid @RequestBody TableUpdateDto data, + @NotNull Principal principal) throws NotAllowedException, + DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, + SearchServiceException, SearchServiceConnectionException { + log.debug("endpoint update table, databaseId={}, data.is_public={}", databaseId, data.getIsPublic()); + final Table table = tableService.findById(databaseId, tableId); + if (!table.getOwner().equals(principal)) { + log.error("Failed to update table: not owner"); + throw new NotAllowedException("Failed to update table: not owner"); + } + final TableDto dto = metadataMapper.customTableToTableDto(tableService.updateTable(table, data)); + log.info("Updated table with id {}", dto.getId()); + return ResponseEntity.status(HttpStatus.ACCEPTED) + .body(dto); + } + @GetMapping("/{tableId}") @Transactional(readOnly = true) @Observed(name = "dbrepo_tables_find") @@ -405,7 +462,23 @@ public class TableEndpoint { DataServiceConnectionException, TableNotFoundException, DatabaseNotFoundException, QueueNotFoundException { log.debug("endpoint find table, databaseId={}, tableId={}", databaseId, tableId); final Table table = tableService.findById(databaseId, tableId); - final TableDto dto = metadataMapper.customTableToTableDto(table); + boolean hasAccess = UserUtil.isSystem(principal); + boolean isOwner = false; + try { + if (principal != null) { + final User user = userService.findByUsername(principal.getName()); + accessService.find(table.getDatabase(), user); + hasAccess = true; + isOwner = table.getOwner().equals(user); + } + } catch (UserNotFoundException | AccessNotFoundException e) { + /* ignore */ + } + final boolean includeSchema = UserUtil.isSystem(principal) || isOwner || table.getIsSchemaPublic(); + log.trace("user has access: {}", hasAccess); + log.trace("include schema in mapping: {}", includeSchema); + final TableDto dto = metadataMapper.customTableToTableDto(table, hasAccess, table.getDatabase().getIsPublic(), + includeSchema); final HttpHeaders headers = new HttpHeaders(); if (UserUtil.isSystem(principal)) { headers.set("X-Username", table.getDatabase().getContainer().getPrivilegedUsername()); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index cfcc554885e171ac9d35ae3e9f1c24df59f258db..75958f5bde9f8aca33cf1e517fab437d376866cf 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -3,6 +3,7 @@ package at.tuwien.endpoints; import at.tuwien.api.database.ViewBriefDto; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; +import at.tuwien.api.database.ViewUpdateDto; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.View; @@ -94,7 +95,7 @@ public class ViewEndpoint { @PreAuthorize("hasAuthority('create-database-view')") @Observed(name = "dbrepo_view_create") @Operation(summary = "Create view", - description = "Creates a view. Requires role `create-database-view`.", + description = "Creates a view. This can only be performed by the database owner. Requires role `create-database-view`.", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "201", @@ -248,9 +249,9 @@ public class ViewEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<View> delete(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("viewId") Long viewId, - @NotNull Principal principal) throws NotAllowedException, DataServiceException, + public ResponseEntity<?> delete(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("viewId") Long viewId, + @NotNull Principal principal) throws NotAllowedException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException, SearchServiceConnectionException { log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId); @@ -265,4 +266,57 @@ public class ViewEndpoint { .build(); } + @PutMapping("/{viewId}") + @Transactional + @PreAuthorize("hasAuthority('modify-view-visibility')") + @Observed(name = "dbrepo_view_update") + @Operation(summary = "Update view", + description = "Updates a view with id. This can only be performed by the view owner or database owner. Requires role `create-database-view`.", + security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "202", + description = "Update view successfully"), + @ApiResponse(responseCode = "400", + description = "Update view query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Update not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Database or View could not be found", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<ViewDto> update(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("viewId") Long viewId, + @NotNull @Valid @RequestBody ViewUpdateDto data, + @NotNull Principal principal) throws NotAllowedException, + DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException, + SearchServiceConnectionException { + log.debug("endpoint update view, databaseId={}, viewId={}", databaseId, viewId); + final Database database = databaseService.findById(databaseId); + final View view = viewService.findById(database, viewId); + if (!database.getOwner().equals(principal) && !view.getOwner().equals(principal)) { + log.error("Failed to update view: not the database- or view owner"); + throw new NotAllowedException("Failed to update view: not the database- or view owner"); + } + return ResponseEntity.accepted() + .body(metadataMapper.viewToViewDto(viewService.update(database, view, data))); + } + } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java index 75f76d440a4d059dfe9c918952519976aa5cbdb3..75c277a3b9699a722a5d43a6eb6548a809de0406 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java @@ -188,8 +188,8 @@ public class EndpointValidator { return false; } - public boolean validateOnlyMineOrReadAccessOrHasRole(User creator, Principal principal, DatabaseAccess access, String role) { - if (validateOnlyMineOrWriteAccessOrHasRole(creator, principal, access, role)) { + public boolean validateOnlyMineOrReadAccessOrHasRole(User owner, Principal principal, DatabaseAccess access, String role) { + if (validateOnlyMineOrWriteAccessOrHasRole(owner, principal, access, role)) { return true; } if (access.getType().equals(AccessType.READ)) { @@ -203,23 +203,23 @@ public class EndpointValidator { @Transactional(readOnly = true) public void validateOnlyOwnerOrWriteAll(Table table, User user) throws NotAllowedException, AccessNotFoundException { - log.trace("table creator: {}", table.getCreatedBy()); + log.trace("table owner: {}", table.getOwnedBy()); final DatabaseAccess access = accessService.find(table.getDatabase(), user); log.trace("found access {}", access); if (access.getType().equals(AccessType.READ)) { log.error("Access not allowed: insufficient access (only read-access)"); throw new NotAllowedException("Access not allowed: insufficient access (only read-access)"); } - if (table.getCreatedBy().equals(user.getId()) && (access.getType().equals(AccessType.WRITE_OWN) || access.getType().equals(AccessType.WRITE_ALL))) { - log.trace("grant access: table creator with write access"); + if (table.getOwnedBy().equals(user.getId()) && (access.getType().equals(AccessType.WRITE_OWN) || access.getType().equals(AccessType.WRITE_ALL))) { + log.trace("grant access: table owner with write access"); return; } if (access.getType().equals(AccessType.WRITE_ALL)) { log.trace("grant access: write-all access"); return; } - log.error("Access not allowed: insufficient access (neither creator {} nor write-all access)", table.getCreatedBy()); - throw new NotAllowedException("Access not allowed: insufficient access (neither creator nor write-all access)"); + log.error("Access not allowed: insufficient access (neither owner {} nor write-all access)", table.getOwnedBy()); + throw new NotAllowedException("Access not allowed: insufficient access (neither owner nor write-all access)"); } public void validateOnlyPrivateHasRole(Database database, Principal principal, String role) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java index 2d6033ed92c7982b0d87bef1cf433dd1176ba106..9852cde936981ed222260675c248345745314317 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java @@ -1,17 +1,14 @@ package at.tuwien.endpoints; -import at.tuwien.service.StorageService; -import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.database.*; import at.tuwien.entities.database.Database; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.KeycloakGateway; import at.tuwien.repository.UserRepository; -import at.tuwien.service.AccessService; -import at.tuwien.service.ContainerService; -import at.tuwien.service.BrokerService; +import at.tuwien.service.*; import at.tuwien.service.impl.DatabaseServiceImpl; +import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -56,7 +53,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { private DatabaseServiceImpl databaseService; @MockBean - private UserRepository userRepository; + private UserService userService; @MockBean private StorageService storageService; @@ -104,7 +101,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void create_succeeds() throws DataServiceException, DataServiceConnectionException, UserNotFoundException, DatabaseNotFoundException, ContainerNotFoundException, SearchServiceException, SearchServiceConnectionException, AuthServiceException, AuthServiceConnectionException, - CredentialsInvalidException, BrokerServiceException, BrokerServiceConnectionException, ContainerQuotaException { + BrokerServiceException, BrokerServiceConnectionException, ContainerQuotaException { final DatabaseCreateDto request = DatabaseCreateDto.builder() .cid(CONTAINER_1_ID) .name(DATABASE_1_NAME) @@ -121,8 +118,8 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .setVirtualHostPermissions(USER_1); when(keycloakGateway.findByUsername(USER_1_USERNAME)) .thenReturn(USER_1_KEYCLOAK_DTO); - when(userRepository.findByUsername(USER_1_USERNAME)) - .thenReturn(Optional.of(USER_1)); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); /* test */ create_generic(request, USER_1_PRINCIPAL, USER_1); @@ -194,7 +191,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-visibility"}) public void visibility_hasRole_succeeds() throws NotAllowedException, UserNotFoundException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, AuthServiceException, - AuthServiceConnectionException, CredentialsInvalidException { + AuthServiceConnectionException { final DatabaseModifyVisibilityDto request = DatabaseModifyVisibilityDto.builder() .isPublic(true) .build(); @@ -202,8 +199,8 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { /* mock */ when(keycloakGateway.findByUsername(USER_1_USERNAME)) .thenReturn(USER_1_KEYCLOAK_DTO); - when(userRepository.findByUsername(USER_1_USERNAME)) - .thenReturn(Optional.of(USER_1)); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); /* test */ visibility_generic(DATABASE_1_ID, DATABASE_1, request, USER_1_PRINCIPAL); @@ -224,14 +221,14 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-database-visibility"}) - public void visibility_hasRoleForeign_fails() { + public void visibility_hasRoleForeign_fails() throws UserNotFoundException { final DatabaseModifyVisibilityDto request = DatabaseModifyVisibilityDto.builder() .isPublic(true) .build(); /* mock */ - when(userRepository.findByUsername(USER_2_USERNAME)) - .thenReturn(Optional.of(USER_2)); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); /* test */ assertThrows(NotAllowedException.class, () -> { @@ -264,8 +261,8 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { /* mock */ when(databaseService.findById(DATABASE_1_ID)) .thenReturn(DATABASE_1); - when(userRepository.findByUsername(USER_1_USERNAME)) - .thenReturn(Optional.of(USER_1)); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); when(storageService.getBytes(request.getKey())) .thenReturn(new byte[]{}); @@ -288,7 +285,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-database-owner"}) - public void transfer_hasRoleForeign_fails() throws DatabaseNotFoundException { + public void transfer_hasRoleForeign_fails() throws DatabaseNotFoundException, UserNotFoundException { final DatabaseTransferDto request = DatabaseTransferDto.builder() .id(USER_4_ID) .build(); @@ -296,10 +293,10 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { /* mock */ when(databaseService.findById(DATABASE_1_ID)) .thenReturn(DATABASE_1); - when(userRepository.findByUsername(USER_2_USERNAME)) - .thenReturn(Optional.of(USER_2)); - when(userRepository.findById(USER_4_ID)) - .thenReturn(Optional.of(USER_4)); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); + when(userService.findById(USER_4_ID)) + .thenReturn(USER_4); /* test */ assertThrows(NotAllowedException.class, () -> { @@ -311,8 +308,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-owner"}) public void transfer_hasRole_succeeds() throws DataServiceConnectionException, DataServiceException, NotAllowedException, UserNotFoundException, DatabaseNotFoundException, SearchServiceException, - SearchServiceConnectionException, AuthServiceException, AuthServiceConnectionException, - CredentialsInvalidException { + SearchServiceConnectionException, AuthServiceException, AuthServiceConnectionException { final DatabaseTransferDto request = DatabaseTransferDto.builder() .id(USER_4_ID) .build(); @@ -322,10 +318,10 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .thenReturn(DATABASE_1); when(keycloakGateway.findByUsername(USER_1_USERNAME)) .thenReturn(USER_1_KEYCLOAK_DTO); - when(userRepository.findByUsername(USER_1_USERNAME)) - .thenReturn(Optional.of(USER_1)); - when(userRepository.findById(USER_4_ID)) - .thenReturn(Optional.of(USER_4)); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + when(userService.findById(USER_4_ID)) + .thenReturn(USER_4); /* test */ databaseEndpoint.transfer(DATABASE_1_ID, request, USER_1_PRINCIPAL); @@ -333,7 +329,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-owner"}) - public void transfer_hasRoleUserNotExists_succeeds() throws DatabaseNotFoundException { + public void transfer_hasRoleUserNotExists_succeeds() throws DatabaseNotFoundException, UserNotFoundException { final DatabaseTransferDto request = DatabaseTransferDto.builder() .id(UUID.randomUUID()) .build(); @@ -341,8 +337,9 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { /* mock */ when(databaseService.findById(DATABASE_1_ID)) .thenReturn(DATABASE_1); - when(userRepository.findById(any(UUID.class))) - .thenReturn(Optional.empty()); + doThrow(UserNotFoundException.class) + .when(userService) + .findById(any(UUID.class)); /* test */ assertThrows(UserNotFoundException.class, () -> { @@ -353,7 +350,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser public void findById_anonymous_succeeds() throws DataServiceException, DataServiceConnectionException, - DatabaseNotFoundException, ExchangeNotFoundException { + DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException { /* test */ findById_generic(DATABASE_1_ID, DATABASE_1, null); @@ -372,7 +369,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"}) public void findById_hasRole_succeeds() throws DataServiceException, DataServiceConnectionException, - DatabaseNotFoundException, ExchangeNotFoundException { + DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException { /* pre-condition */ assertTrue(DATABASE_3_PUBLIC); @@ -384,7 +381,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"}) public void findById_hasRoleForeign_succeeds() throws DataServiceException, DataServiceConnectionException, - DatabaseNotFoundException, ExchangeNotFoundException { + DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException { /* pre-condition */ assertTrue(DATABASE_3_PUBLIC); @@ -396,7 +393,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"}) public void findById_ownerSeesAccessRights_succeeds() throws DataServiceException, DataServiceConnectionException, - DatabaseNotFoundException, ExchangeNotFoundException { + DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException { /* mock */ when(accessService.list(DATABASE_1)) @@ -501,7 +498,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public void visibility_generic(Long databaseId, Database database, DatabaseModifyVisibilityDto data, Principal principal) throws NotAllowedException, DatabaseNotFoundException, - SearchServiceException, SearchServiceConnectionException { + SearchServiceException, SearchServiceConnectionException, UserNotFoundException { /* mock */ if (database != null) { @@ -523,7 +520,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { public DatabaseDto findById_generic(Long databaseId, Database database, Principal principal) throws DataServiceConnectionException, DatabaseNotFoundException, ExchangeNotFoundException, - DataServiceException { + DataServiceException, UserNotFoundException { /* mock */ if (database != null) { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java index af98f87e571bac44fd2e422848cbfc8e37262ffd..8a98bf11f5035e5e746e3fccfec77691d70a9ff7 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java @@ -1,12 +1,11 @@ package at.tuwien.endpoints; -import at.tuwien.entities.identifier.IdentifierType; -import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.identifier.*; import at.tuwien.config.EndpointConfig; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.identifier.Identifier; +import at.tuwien.entities.identifier.IdentifierType; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; @@ -14,6 +13,7 @@ import at.tuwien.service.AccessService; import at.tuwien.service.DatabaseService; import at.tuwien.service.IdentifierService; import at.tuwien.service.UserService; +import at.tuwien.test.AbstractUnitTest; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.log4j.Log4j2; import org.apache.commons.io.FileUtils; @@ -97,8 +97,6 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { assertEquals(compare.getTitles().size(), body.getTitles().size()); assertEquals(compare.getDescriptions().size(), body.getDescriptions().size()); assertEquals(compare.getDescriptions(), body.getDescriptions()); - assertEquals(compare.getCreated(), body.getCreated()); - assertEquals(compare.getLastModified(), body.getLastModified()); assertEquals(compare.getDoi(), body.getDoi()); assertEquals(compare.getLicenses().size(), body.getLicenses().size()); assertEquals(compare.getPublicationDay(), body.getPublicationDay()); @@ -136,8 +134,6 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { assertEquals(compare.getDescriptions().get(0).getDescription(), body.getDescriptions().get(0).getDescription()); assertEquals(compare.getDescriptions().get(0).getLanguage(), body.getDescriptions().get(0).getLanguage()); assertEquals(compare.getDescriptions().get(0).getDescriptionType(), body.getDescriptions().get(0).getDescriptionType()); - assertEquals(compare.getCreated(), body.getCreated()); - assertEquals(compare.getLastModified(), body.getLastModified()); assertEquals(compare.getDoi(), body.getDoi()); assertEquals(compare.getLicenses().size(), body.getLicenses().size()); assertEquals(compare.getLicenses().get(0).getIdentifier(), body.getLicenses().get(0).getIdentifier()); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java index c84990098596b159be2aa65459638ba0b498c7ee..66add61c3988c483a83b20d9d10b3cbb123d4fcd 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java @@ -2,19 +2,13 @@ package at.tuwien.mapper; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.ViewDto; -import at.tuwien.api.database.table.TableDto; -import at.tuwien.api.database.table.columns.ColumnTypeDto; -import at.tuwien.api.database.table.constraints.foreign.ForeignKeyDto; -import at.tuwien.api.database.table.constraints.foreign.ForeignKeyReferenceDto; -import at.tuwien.api.database.table.constraints.foreign.ReferenceTypeDto; -import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; -import at.tuwien.api.database.table.constraints.unique.UniqueDto; +import at.tuwien.api.database.table.TableBriefDto; +import at.tuwien.api.identifier.IdentifierBriefDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.identifier.IdentifierTypeDto; import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; import at.tuwien.entities.container.Container; -import at.tuwien.entities.database.Database; import at.tuwien.entities.identifier.*; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; @@ -30,7 +24,6 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; @@ -149,7 +142,7 @@ public class MetadataMapperUnitTest extends AbstractUnitTest { assertNull(response.getViewId()); assertNull(response.getQueryId()); assertNull(response.getTableId()); - assertEquals(IDENTIFIER_1_DOI_NOT_NULL, response.getDoi()); + assertEquals(IDENTIFIER_1_DOI, response.getDoi()); assertEquals(IDENTIFIER_1_TYPE, response.getType()); } @@ -183,249 +176,54 @@ public class MetadataMapperUnitTest extends AbstractUnitTest { public void customDatabaseToDatabaseDto_succeeds() { /* test */ - final DatabaseDto response = metadataMapper.customDatabaseToDatabaseDto(DATABASE_1); + final DatabaseDto response = metadataMapper.customDatabaseToDatabaseDto(DATABASE_1, USER_1); assertEquals(DATABASE_1_ID, response.getId()); assertNotNull(response.getContact()); assertEquals(USER_1_ID, response.getContact().getId()); + assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); + assertEquals(DATABASE_1_SCHEMA_PUBLIC, response.getIsSchemaPublic()); /* identifiers formatted */ assertEquals(4, response.getIdentifiers().size()); - final IdentifierDto identifier1 = response.getIdentifiers().get(0); + final IdentifierBriefDto identifier1 = response.getIdentifiers().get(0); assertEquals(DATABASE_1_ID, identifier1.getDatabaseId()); - assertNotNull(identifier1.getCreator()); - assertEquals(IDENTIFIER_1_CREATED_BY, identifier1.getCreator().getId()); - assertNotNull(identifier1.getCreated()); - assertNotNull(identifier1.getLastModified()); - final IdentifierDto identifier2 = response.getIdentifiers().get(1); + final IdentifierBriefDto identifier2 = response.getIdentifiers().get(1); assertEquals(DATABASE_1_ID, identifier2.getDatabaseId()); - assertNotNull(identifier2.getCreator()); - assertEquals(IDENTIFIER_2_CREATED_BY, identifier2.getCreator().getId()); - assertNotNull(identifier2.getCreated()); - assertNotNull(identifier2.getLastModified()); - final IdentifierDto identifier3 = response.getIdentifiers().get(2); + final IdentifierBriefDto identifier3 = response.getIdentifiers().get(2); assertEquals(DATABASE_1_ID, identifier3.getDatabaseId()); - assertNotNull(identifier3.getCreator()); - assertEquals(IDENTIFIER_3_CREATED_BY, identifier3.getCreator().getId()); - assertNotNull(identifier3.getCreated()); - assertNotNull(identifier3.getLastModified()); - final IdentifierDto identifier4 = response.getIdentifiers().get(3); + final IdentifierBriefDto identifier4 = response.getIdentifiers().get(3); assertEquals(DATABASE_1_ID, identifier4.getDatabaseId()); - assertNotNull(identifier4.getCreator()); - assertEquals(IDENTIFIER_4_CREATED_BY, identifier4.getCreator().getId()); - assertNotNull(identifier4.getCreated()); - assertNotNull(identifier4.getLastModified()); /* Table 1 formatted */ - final TableDto table0 = response.getTables().get(0); + final TableBriefDto table0 = response.getTables().get(0); assertEquals(TABLE_1_ID, table0.getId()); assertEquals(TABLE_1_NAME, table0.getName()); assertEquals(TABLE_1_INTERNALNAME, table0.getInternalName()); assertEquals(TABLE_1_DESCRIPTION, table0.getDescription()); - assertEquals(DATABASE_1_ID, table0.getTdbid()); - assertEquals(USER_1_ID, table0.getCreatedBy()); - assertNotNull(table0.getOwner()); - assertEquals(USER_1_ID, table0.getOwner().getId()); - assertNotNull(table0.getCreator()); - assertEquals(USER_1_ID, table0.getCreator().getId()); - assertEquals(TABLE_1_AVG_ROW_LENGTH, table0.getAvgRowLength()); - assertEquals(TABLE_1_NUM_ROWS, table0.getNumRows()); - assertEquals(TABLE_1_DATA_LENGTH, table0.getDataLength()); - assertEquals(TABLE_1_MAX_DATA_LENGTH, table0.getMaxDataLength()); - assertNotNull(table0.getCreated()); - /* columns formatted */ - assertEquals(TABLE_1_COLUMNS.size(), table0.getColumns().size()); - for (int i = 0; i < TABLE_1_COLUMNS.size(); i++) { - assertEquals(TABLE_1_COLUMNS.get(i).getId(), table0.getColumns().get(i).getId()); - assertEquals(TABLE_1_COLUMNS.get(i).getOrdinalPosition(), table0.getColumns().get(i).getOrdinalPosition()); - assertNotNull(table0.getColumns().get(i).getOrdinalPosition()); - assertEquals(TABLE_1_COLUMNS.get(i).getTable().getId(), table0.getColumns().get(i).getTableId()); - assertEquals(TABLE_1_COLUMNS.get(i).getName(), table0.getColumns().get(i).getName()); - assertEquals(TABLE_1_COLUMNS.get(i).getInternalName(), table0.getColumns().get(i).getInternalName()); - assertEquals(List.of(ColumnTypeDto.SERIAL, ColumnTypeDto.DATE, ColumnTypeDto.VARCHAR, ColumnTypeDto.DECIMAL, ColumnTypeDto.DECIMAL).get(i), table0.getColumns().get(i).getColumnType()); - assertEquals(TABLE_1_COLUMNS.get(i).getSize(), table0.getColumns().get(i).getSize()); - assertEquals(TABLE_1_COLUMNS.get(i).getD(), table0.getColumns().get(i).getD()); - assertEquals(TABLE_1_COLUMNS.get(i).getIsNullAllowed(), table0.getColumns().get(i).getIsNullAllowed()); - assertEquals(TABLE_1_COLUMNS.get(i).getEnums(), table0.getColumns().get(i).getEnums()); - assertEquals(TABLE_1_COLUMNS.get(i).getSets(), table0.getColumns().get(i).getSets()); - } - /* constraints formatted */ - assertNotNull(table0.getConstraints()); - assertEquals(0, table0.getConstraints().getUniques().size()); - assertEquals(0, table0.getConstraints().getChecks().size()); - assertEquals(0, table0.getConstraints().getForeignKeys().size()); - assertEquals(1, table0.getConstraints().getPrimaryKey().size()); - final PrimaryKeyDto table0pk = new ArrayList<>(table0.getConstraints().getPrimaryKey()).get(0); - assertEquals(1L, table0pk.getId()); - assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getId(), table0pk.getColumn().getId()); - assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getName(), table0pk.getColumn().getName()); - assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getId(), table0pk.getColumn().getId()); - assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getName(), table0pk.getColumn().getName()); - assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getInternalName(), table0pk.getColumn().getInternalName()); - assertEquals(TABLE_1_ID, table0pk.getTable().getId()); - assertEquals(DATABASE_1_ID, table0pk.getTable().getDatabaseId()); - assertEquals(ColumnTypeDto.SERIAL, table0pk.getColumn().getColumnType()); - assertNull(table0pk.getColumn().getAlias()); - assertEquals(TABLE_1_ID, table0pk.getColumn().getTableId()); - assertEquals(DATABASE_1_ID, table0pk.getColumn().getDatabaseId()); + assertEquals(DATABASE_1_ID, table0.getDatabaseId()); + assertEquals(TABLE_1_SCHEMA_PUBLIC, table0.getIsSchemaPublic()); /* Table 2 formatted */ - final TableDto table1 = response.getTables().get(1); + final TableBriefDto table1 = response.getTables().get(1); assertEquals(TABLE_2_ID, table1.getId()); assertEquals(TABLE_2_NAME, table1.getName()); assertEquals(TABLE_2_INTERNALNAME, table1.getInternalName()); assertEquals(TABLE_2_DESCRIPTION, table1.getDescription()); - assertEquals(DATABASE_1_ID, table1.getTdbid()); - assertEquals(USER_2_ID, table1.getCreatedBy()); - assertNotNull(table1.getOwner()); - assertEquals(USER_2_ID, table1.getOwner().getId()); - assertNotNull(table1.getCreator()); - assertEquals(USER_2_ID, table1.getCreator().getId()); - assertEquals(TABLE_2_AVG_ROW_LENGTH, table1.getAvgRowLength()); - assertEquals(TABLE_2_NUM_ROWS, table1.getNumRows()); - assertEquals(TABLE_2_DATA_LENGTH, table1.getDataLength()); - assertEquals(TABLE_2_MAX_DATA_LENGTH, table1.getMaxDataLength()); - assertNotNull(table1.getCreated()); - /* columns formatted */ - assertEquals(TABLE_2_COLUMNS.size(), table1.getColumns().size()); - for (int i = 0; i < TABLE_2_COLUMNS.size(); i++) { - assertEquals(TABLE_2_COLUMNS.get(i).getId(), table1.getColumns().get(i).getId()); - assertEquals(TABLE_2_COLUMNS.get(i).getOrdinalPosition(), table1.getColumns().get(i).getOrdinalPosition()); - assertNotNull(table1.getColumns().get(i).getOrdinalPosition()); - assertEquals(TABLE_2_COLUMNS.get(i).getTable().getId(), table1.getColumns().get(i).getTableId()); - assertEquals(TABLE_2_COLUMNS.get(i).getName(), table1.getColumns().get(i).getName()); - assertEquals(TABLE_2_COLUMNS.get(i).getInternalName(), table1.getColumns().get(i).getInternalName()); - assertEquals(List.of(ColumnTypeDto.VARCHAR, ColumnTypeDto.DECIMAL, ColumnTypeDto.DECIMAL).get(i), table1.getColumns().get(i).getColumnType()); - assertEquals(TABLE_2_COLUMNS.get(i).getSize(), table1.getColumns().get(i).getSize()); - assertEquals(TABLE_2_COLUMNS.get(i).getD(), table1.getColumns().get(i).getD()); - assertEquals(TABLE_2_COLUMNS.get(i).getIsNullAllowed(), table1.getColumns().get(i).getIsNullAllowed()); - assertEquals(TABLE_2_COLUMNS.get(i).getEnums(), table1.getColumns().get(i).getEnums()); - assertEquals(TABLE_2_COLUMNS.get(i).getSets(), table1.getColumns().get(i).getSets()); - } - /* constraints formatted */ - assertNotNull(table1.getConstraints()); - assertEquals(1, table1.getConstraints().getUniques().size()); - final UniqueDto table1uk = table1.getConstraints().getUniques().get(0); - assertEquals(1L, table1uk.getId()); - assertEquals(TABLE_2_ID, table1uk.getTable().getId()); - assertEquals(DATABASE_1_ID, table1uk.getTable().getDatabaseId()); - assertEquals("uk_1", table1uk.getName()); - assertEquals(TABLE_2_COLUMNS_DTO.get(1).getId(), table1uk.getColumns().get(0).getId()); - assertEquals(1, table1.getConstraints().getChecks().size()); - assertEquals("`mintemp` > 0", new ArrayList<>(table1.getConstraints().getChecks()).get(0)); - assertEquals(1, table1.getConstraints().getForeignKeys().size()); - final ForeignKeyDto table1fk = new ArrayList<>(table1.getConstraints().getForeignKeys()).get(0); - assertEquals("fk_location", table1fk.getName()); - assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnDelete()); - assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnUpdate()); - assertEquals(TABLE_2_ID, table1fk.getTable().getId()); - assertEquals(DATABASE_1_ID, table1fk.getTable().getDatabaseId()); - assertEquals(TABLE_1_ID, table1fk.getReferencedTable().getId()); - assertEquals(DATABASE_1_ID, table1fk.getReferencedTable().getDatabaseId()); - final ForeignKeyReferenceDto table1fkr = table1fk.getReferences().get(0); - assertEquals(1L, table1fkr.getId()); - assertEquals(TABLE_2_COLUMNS_DTO.get(2).getId(), table1fkr.getColumn().getId()); - assertEquals(TABLE_2_COLUMNS_DTO.get(2).getTableId(), table1fkr.getColumn().getTableId()); - assertEquals(TABLE_2_COLUMNS_DTO.get(2).getDatabaseId(), table1fkr.getColumn().getDatabaseId()); - assertEquals(TABLE_1_COLUMNS_DTO.get(0).getId(), table1fkr.getReferencedColumn().getId()); - assertEquals(TABLE_1_COLUMNS_DTO.get(0).getTableId(), table1fkr.getReferencedColumn().getTableId()); - assertEquals(TABLE_1_COLUMNS_DTO.get(0).getDatabaseId(), table1fkr.getReferencedColumn().getDatabaseId()); - assertEquals(1, table1.getConstraints().getPrimaryKey().size()); - final PrimaryKeyDto table1pk = new ArrayList<>(table1.getConstraints().getPrimaryKey()).get(0); - assertEquals(2L, table1pk.getId()); - assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getId(), table1pk.getColumn().getId()); - assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getName(), table1pk.getColumn().getName()); - assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getId(), table1pk.getColumn().getId()); - assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getName(), table1pk.getColumn().getName()); - assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getInternalName(), table1pk.getColumn().getInternalName()); - assertEquals(ColumnTypeDto.VARCHAR, table1pk.getColumn().getColumnType()); - assertNull(table1pk.getColumn().getAlias()); - assertEquals(TABLE_2_ID, table1pk.getColumn().getTableId()); - assertEquals(DATABASE_1_ID, table1pk.getColumn().getDatabaseId()); + assertEquals(DATABASE_1_ID, table1.getDatabaseId()); + assertEquals(TABLE_2_SCHEMA_PUBLIC, table1.getIsSchemaPublic()); /* Table 3 formatted */ - final TableDto table2 = response.getTables().get(2); + final TableBriefDto table2 = response.getTables().get(2); assertEquals(TABLE_3_ID, table2.getId()); assertEquals(TABLE_3_NAME, table2.getName()); assertEquals(TABLE_3_INTERNALNAME, table2.getInternalName()); assertEquals(TABLE_3_DESCRIPTION, table2.getDescription()); - assertEquals(DATABASE_1_ID, table2.getTdbid()); - assertEquals(USER_3_ID, table2.getCreatedBy()); - assertNotNull(table2.getOwner()); - assertEquals(USER_3_ID, table2.getOwner().getId()); - assertNotNull(table2.getCreator()); - assertEquals(USER_3_ID, table2.getCreator().getId()); - assertEquals(TABLE_3_AVG_ROW_LENGTH, table2.getAvgRowLength()); - assertEquals(TABLE_3_NUM_ROWS, table2.getNumRows()); - assertEquals(TABLE_3_DATA_LENGTH, table2.getDataLength()); - assertEquals(TABLE_3_MAX_DATA_LENGTH, table2.getMaxDataLength()); - assertNotNull(table2.getCreated()); - /* columns formatted */ - assertEquals(TABLE_3_COLUMNS.size(), table2.getColumns().size()); - for (int i = 0; i < TABLE_3_COLUMNS.size(); i++) { - assertEquals(TABLE_3_COLUMNS.get(i).getId(), table2.getColumns().get(i).getId()); - assertEquals(TABLE_3_COLUMNS.get(i).getOrdinalPosition(), table2.getColumns().get(i).getOrdinalPosition()); - assertNotNull(table2.getColumns().get(i).getOrdinalPosition()); - assertEquals(TABLE_3_COLUMNS.get(i).getTable().getId(), table2.getColumns().get(i).getTableId()); - assertEquals(TABLE_3_COLUMNS.get(i).getName(), table2.getColumns().get(i).getName()); - assertEquals(TABLE_3_COLUMNS.get(i).getInternalName(), table2.getColumns().get(i).getInternalName()); - assertEquals(List.of(ColumnTypeDto.BIGINT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.DATE, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.DATE, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.DATE, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT).get(i), table2.getColumns().get(i).getColumnType()); - assertEquals(TABLE_3_COLUMNS.get(i).getSize(), table2.getColumns().get(i).getSize()); - assertEquals(TABLE_3_COLUMNS.get(i).getD(), table2.getColumns().get(i).getD()); - assertEquals(TABLE_3_COLUMNS.get(i).getIsNullAllowed(), table2.getColumns().get(i).getIsNullAllowed()); - assertEquals(TABLE_3_COLUMNS.get(i).getEnums(), table2.getColumns().get(i).getEnums()); - assertEquals(TABLE_3_COLUMNS.get(i).getSets(), table2.getColumns().get(i).getSets()); - } - /* constraints formatted */ - final PrimaryKeyDto table2pk = new ArrayList<>(table2.getConstraints().getPrimaryKey()).get(0); - assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getId(), table2pk.getColumn().getId()); - assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getName(), table2pk.getColumn().getName()); - assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getId(), table2pk.getColumn().getId()); - assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getName(), table2pk.getColumn().getName()); - assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getInternalName(), table2pk.getColumn().getInternalName()); - assertEquals(ColumnTypeDto.BIGINT, table2pk.getColumn().getColumnType()); - assertNull(table2pk.getColumn().getAlias()); - assertEquals(TABLE_3_ID, table2pk.getColumn().getTableId()); - assertEquals(DATABASE_1_ID, table2pk.getColumn().getDatabaseId()); + assertEquals(DATABASE_1_ID, table2.getDatabaseId()); + assertEquals(TABLE_3_SCHEMA_PUBLIC, table2.getIsSchemaPublic()); /* Table 4 formatted */ - final TableDto table3 = response.getTables().get(3); + final TableBriefDto table3 = response.getTables().get(3); assertEquals(TABLE_4_ID, table3.getId()); assertEquals(TABLE_4_NAME, table3.getName()); assertEquals(TABLE_4_INTERNALNAME, table3.getInternalName()); assertEquals(TABLE_4_DESCRIPTION, table3.getDescription()); - assertEquals(DATABASE_1_ID, table3.getTdbid()); - assertEquals(USER_1_ID, table3.getCreatedBy()); - assertNotNull(table3.getOwner()); - assertEquals(USER_1_ID, table3.getOwner().getId()); - assertNotNull(table3.getCreator()); - assertEquals(USER_1_ID, table3.getCreator().getId()); - assertEquals(TABLE_4_AVG_ROW_LENGTH, table3.getAvgRowLength()); - assertEquals(TABLE_4_NUM_ROWS, table3.getNumRows()); - assertEquals(TABLE_4_DATA_LENGTH, table3.getDataLength()); - assertEquals(TABLE_4_MAX_DATA_LENGTH, table3.getMaxDataLength()); - assertNotNull(table3.getCreated()); - /* columns formatted */ - assertEquals(TABLE_4_COLUMNS.size(), table3.getColumns().size()); - for (int i = 0; i < TABLE_4_COLUMNS.size(); i++) { - assertEquals(TABLE_4_COLUMNS.get(i).getId(), table3.getColumns().get(i).getId()); - assertEquals(TABLE_4_COLUMNS.get(i).getOrdinalPosition(), table3.getColumns().get(i).getOrdinalPosition()); - assertNotNull(table3.getColumns().get(i).getOrdinalPosition()); - assertEquals(TABLE_4_COLUMNS.get(i).getTable().getId(), table3.getColumns().get(i).getTableId()); - assertEquals(TABLE_4_COLUMNS.get(i).getName(), table3.getColumns().get(i).getName()); - assertEquals(TABLE_4_COLUMNS.get(i).getInternalName(), table3.getColumns().get(i).getInternalName()); - assertEquals(List.of(ColumnTypeDto.TIMESTAMP, ColumnTypeDto.DECIMAL).get(i), table3.getColumns().get(i).getColumnType()); - assertEquals(TABLE_4_COLUMNS.get(i).getSize(), table3.getColumns().get(i).getSize()); - assertEquals(TABLE_4_COLUMNS.get(i).getD(), table3.getColumns().get(i).getD()); - assertEquals(TABLE_4_COLUMNS.get(i).getIsNullAllowed(), table3.getColumns().get(i).getIsNullAllowed()); - assertEquals(TABLE_4_COLUMNS.get(i).getEnums(), table3.getColumns().get(i).getEnums()); - assertEquals(TABLE_4_COLUMNS.get(i).getSets(), table3.getColumns().get(i).getSets()); - } - /* constraints formatted */ - final PrimaryKeyDto table3pk = new ArrayList<>(table3.getConstraints().getPrimaryKey()).get(0); - assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getId(), table3pk.getColumn().getId()); - assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getName(), table3pk.getColumn().getName()); - assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getId(), table3pk.getColumn().getId()); - assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getName(), table3pk.getColumn().getName()); - assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getInternalName(), table3pk.getColumn().getInternalName()); - assertEquals(ColumnTypeDto.TIMESTAMP, table3pk.getColumn().getColumnType()); - assertNull(table3pk.getColumn().getAlias()); - assertEquals(TABLE_4_ID, table3pk.getColumn().getTableId()); - assertEquals(DATABASE_1_ID, table3pk.getColumn().getDatabaseId()); + assertEquals(DATABASE_1_ID, table3.getDatabaseId()); + assertEquals(TABLE_4_SCHEMA_PUBLIC, table3.getIsSchemaPublic()); } public static Stream<Arguments> nameToInternalName_parameters() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java index 6a01ae6fec9e06d679fc848af0b697fcfbeba3df..1b8419612e2674b43c29c4c377f88ca38b3c7784 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java @@ -28,7 +28,9 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import java.util.List; +import java.util.Optional; +import static org.mockito.Mockito.when; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -81,7 +83,7 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest genesis(); /* metadata database */ licenseRepository.save(LICENSE_1); - userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4)); + userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4, USER_LOCAL)); containerRepository.save(CONTAINER_1); databaseRepository.save(DATABASE_1); /* keycloak */ @@ -114,7 +116,9 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest .andDo(print()) .andExpect(header().string("X-Username", CONTAINER_1_PRIVILEGED_USERNAME)) .andExpect(header().string("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD)) - .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password")) + .andExpect(header().string("X-Host", CONTAINER_1_HOST)) + .andExpect(header().string("X-Port", "" + CONTAINER_1_PORT)) + .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port")) .andExpect(status().isOk()); } @@ -127,7 +131,9 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest .andDo(print()) .andExpect(header().string("X-Username", CONTAINER_1_PRIVILEGED_USERNAME)) .andExpect(header().string("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD)) - .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password")) + .andExpect(header().string("X-Host", CONTAINER_1_HOST)) + .andExpect(header().string("X-Port", "" + CONTAINER_1_PORT)) + .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port")) .andExpect(status().isOk()); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java index 9c79f01d66c07e36b22d1ab112464b7d3943a693..96af6cfa8d14e4974a4afb8e410d9cc9a29bbbeb 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java @@ -96,7 +96,7 @@ public class MetadataEndpointMvcTest extends AbstractUnitTest { .andDo(print()) .andExpect(content().contentType("text/xml;charset=UTF-8")) .andExpect(xpath("//request[@verb='ListIdentifiers']").exists()) - .andExpect(xpath("//header[1]/identifier").string("oai:" + IDENTIFIER_1_ID)) + .andExpect(xpath("//header[1]/identifier").string("doi:" + IDENTIFIER_1_DOI)) .andExpect(xpath("//header[2]/identifier").string("oai:" + IDENTIFIER_2_ID)) .andExpect(xpath("//header[3]/identifier").string("oai:" + IDENTIFIER_3_ID)) .andExpect(xpath("//header[4]/identifier").string("oai:" + IDENTIFIER_4_ID)) @@ -127,7 +127,7 @@ public class MetadataEndpointMvcTest extends AbstractUnitTest { .andExpect(content().contentType("text/xml;charset=UTF-8")) .andExpect(xpath("//request[@verb='GetRecord']").exists()) .andExpect(xpath("//request[@identifier='oai:" + IDENTIFIER_1_ID + "']").exists()) - .andExpect(xpath("//identifier").string("oai:" + IDENTIFIER_1_ID)) + .andExpect(xpath("//identifier").string("doi:" + IDENTIFIER_1_DOI)) .andExpect(status().isOk()); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java index 648bb6ab290b319a817aba31d49310d43416e4a3..a319044d3909efc8f87f703c9f6658e1d6be8b5b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java @@ -210,7 +210,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { /* test */ final Identifier response = dataCiteIdentifierService.create(DATABASE_1, USER_1, IDENTIFIER_1_CREATE_WITH_DOI_DTO); - assertEquals(IDENTIFIER_1_DOI_NOT_NULL, response.getDoi()); + assertEquals(IDENTIFIER_1_DOI, response.getDoi()); } @Test diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java index 436ccd18794fe1ba46e772c65c785ec4f1240f32..b324a94c9e1c9ba8346eb4d3e3c6a81ecc7cad0b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java @@ -1,7 +1,7 @@ package at.tuwien.service; import at.tuwien.entities.database.Database; -import at.tuwien.exception.*; +import at.tuwien.exception.DatabaseNotFoundException; import at.tuwien.repository.ContainerRepository; import at.tuwien.repository.DatabaseRepository; import at.tuwien.repository.LicenseRepository; @@ -19,7 +19,8 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; @Log4j2 @SpringBootTest @@ -81,13 +82,13 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry()); assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort()); /* creator */ - assertNotNull(response.getCreator()); - assertEquals(USER_1_ID, response.getCreator().getId()); - assertEquals(USER_1_USERNAME, response.getCreator().getUsername()); - assertEquals(USER_1_EMAIL, response.getCreator().getEmail()); - assertEquals(USER_1_THEME, response.getCreator().getTheme()); - assertEquals(USER_1_LANGUAGE, response.getCreator().getLanguage()); - assertNotNull(response.getCreator().getAccesses()); + assertNotNull(response.getOwner()); + assertEquals(USER_1_ID, response.getOwner().getId()); + assertEquals(USER_1_USERNAME, response.getOwner().getUsername()); + assertEquals(USER_1_EMAIL, response.getOwner().getEmail()); + assertEquals(USER_1_THEME, response.getOwner().getTheme()); + assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage()); + assertNotNull(response.getOwner().getAccesses()); } @Test @@ -119,13 +120,13 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry()); assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort()); /* creator */ - assertNotNull(response.getCreator()); - assertEquals(USER_1_ID, response.getCreator().getId()); - assertEquals(USER_1_USERNAME, response.getCreator().getUsername()); - assertEquals(USER_1_EMAIL, response.getCreator().getEmail()); - assertEquals(USER_1_THEME, response.getCreator().getTheme()); - assertEquals(USER_1_LANGUAGE, response.getCreator().getLanguage()); - assertNotNull(response.getCreator().getAccesses()); + assertNotNull(response.getOwner()); + assertEquals(USER_1_ID, response.getOwner().getId()); + assertEquals(USER_1_USERNAME, response.getOwner().getUsername()); + assertEquals(USER_1_EMAIL, response.getOwner().getEmail()); + assertEquals(USER_1_THEME, response.getOwner().getTheme()); + assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage()); + assertNotNull(response.getOwner().getAccesses()); } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java index 8f37dde792c63c54334682e8d830761459fb235b..b0919f816a0b3aa0cbaad90aa62093987c54eabd 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java @@ -158,7 +158,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { SearchServiceConnectionException { /* test */ - generic_modifyVisibility(DATABASE_1, true); + generic_modifyVisibility(DATABASE_1, true, true); } @Test @@ -172,7 +172,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { /* test */ assertThrows(SearchServiceException.class, () -> { - generic_modifyVisibility(DATABASE_1, true); + generic_modifyVisibility(DATABASE_1, true, true); }); } @@ -187,7 +187,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { /* test */ assertThrows(DatabaseNotFoundException.class, () -> { - generic_modifyVisibility(DATABASE_1, true); + generic_modifyVisibility(DATABASE_1, true, true); }); } @@ -202,7 +202,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { /* test */ assertThrows(SearchServiceConnectionException.class, () -> { - generic_modifyVisibility(DATABASE_1, true); + generic_modifyVisibility(DATABASE_1, true, true); }); } @@ -285,12 +285,10 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { assertNotNull(response.getViews()); assertNotNull(response.getAccesses()); assertNotNull(response.getIdentifiers()); - assertNotNull(response.getCreatedBy()); - assertNotNull(response.getCreator()); + assertNotNull(response.getOwnedBy()); + assertNotNull(response.getOwner()); assertNotNull(response.getContactPerson()); assertNotNull(response.getContact()); - assertNotNull(response.getCreatedBy()); - assertNotNull(response.getOwner()); assertNotNull(response.getImage()); assertNotNull(response.getExchangeName()); return response; @@ -309,8 +307,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { return response; } - protected Database generic_modifyVisibility(Database database, Boolean isPublic) throws DatabaseNotFoundException, - SearchServiceException, SearchServiceConnectionException { + protected Database generic_modifyVisibility(Database database, Boolean isPublic, Boolean isSchemaPublic) + throws DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException { /* mock */ when(databaseRepository.save(any(Database.class))) @@ -319,6 +317,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { /* test */ final Database response = databaseService.modifyVisibility(database, DatabaseModifyVisibilityDto.builder() .isPublic(isPublic) + .isSchemaPublic(isSchemaPublic) .build()); assertNotNull(response); return response; diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java index 246ae7de1a4beb7a55f4cadf13f142b48ef995fd..48da5206bbd8ddeb4125605891a7b4bef1e0f1f6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java @@ -487,7 +487,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest { /* test */ final Identifier response = identifierService.create(DATABASE_1, USER_1, IDENTIFIER_1_CREATE_WITH_DOI_DTO); assertEquals(8L, response.getId()); - assertEquals(IDENTIFIER_1_DOI_NOT_NULL, response.getDoi()); + assertEquals(IDENTIFIER_1_DOI, response.getDoi()); } @Test diff --git a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json index 3d557e3201e6a9bd8cbcb5fee0946110331b390e..250db21b8f997330463558b8540a23d2f4521778 100644 --- a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json +++ b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json @@ -22,7 +22,5 @@ "name_identifier": "00000-00000-00000", "name_identifier_scheme": "ORCID" } - ], - "created": "2022-01-07T20:45:52.000+00:00", - "last_modified": "2018-11-07T10:59:12.000+00:00" + ] } \ No newline at end of file diff --git a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json index 63b43d09f57d426fcc02c15ce1af032a69760a18..2a0da11e13c832bb1c9578e6982733fb2eb51c3f 100644 --- a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json +++ b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json @@ -2,6 +2,7 @@ "id": 1, "query_id": 1, "type": "subset", + "doi": "10.12345/183", "titles": [ { "id": 1, @@ -24,7 +25,6 @@ ], "query": "SELECT `id` FROM `foobar`", "query_normalized": "SELECT `id` FROM `foobar`", - "doi": null, "query_hash": "abc", "execution": "2018-11-07T10:59:12.000+00:00", "result_hash": "def", @@ -51,7 +51,5 @@ } ], "publication_month": 5, - "publication_year": 2022, - "created": "2022-01-07T20:45:52.000+00:00", - "last_modified": "2018-11-07T10:59:12.000+00:00" + "publication_year": 2022 } \ No newline at end of file diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index d98e575eb94e6893b67125b2898fcca4a097a151..bb101e9af6539a35e1c761f708392057e48afeea 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-services</artifactId> <name>dbrepo-metadata-service-services</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java index 91fb96e5f93ca5f4fd17c120d2f8f00703f3a3e3..621ee53dfefdf7668c2c18ee45866c50202697ee 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java @@ -10,6 +10,7 @@ import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.TableStatisticDto; +import at.tuwien.api.database.table.TableUpdateDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.exception.*; @@ -75,6 +76,9 @@ public interface DataServiceGateway { void updateDatabase(Long databaseId, UpdateUserPasswordDto data) throws DataServiceConnectionException, DataServiceException, DatabaseNotFoundException; + void updateTable(Long databaseId, Long tableId, TableUpdateDto data) throws DataServiceConnectionException, + DataServiceException, DatabaseNotFoundException; + /** * Creates a table in a given database. * @param databaseId The database id. diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java index 709537862a77b5bb6bccb5be4cae5d26f5622121..09ad1e55da73ed27c0d79b4ed8eae550532ae9ac 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java @@ -7,6 +7,7 @@ import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.TableStatisticDto; +import at.tuwien.api.database.table.TableUpdateDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.config.GatewayConfig; import at.tuwien.exception.*; @@ -159,6 +160,30 @@ public class DataServiceGatewayImpl implements DataServiceGateway { } } + @Override + public void updateTable(Long databaseId, Long tableId, TableUpdateDto data) throws DataServiceConnectionException, + DataServiceException, DatabaseNotFoundException { + final ResponseEntity<Void> response; + final String path = "/api/database/" + databaseId + "/table/" + tableId; + log.trace("update table at endpoint {} with path {}", gatewayConfig.getDataEndpoint(), path); + try { + response = restTemplate.exchange(path, HttpMethod.PUT, new HttpEntity<>(data), Void.class); + } catch (HttpServerErrorException e) { + log.error("Failed to update table in database: {}", e.getMessage()); + throw new DataServiceConnectionException("Failed to update table in database: " + e.getMessage(), e); + } catch (HttpClientErrorException.NotFound e) { + log.error("Failed to update table in database: not found: {}", e.getMessage()); + throw new DatabaseNotFoundException("Failed to update table in database: not found: " + e.getMessage(), e); + } catch (HttpClientErrorException.BadRequest | HttpClientErrorException.Unauthorized e) { + log.error("Failed to update table in database: {}", e.getMessage()); + throw new DataServiceException("Failed to update table in database: " + e.getMessage(), e); + } + if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) { + log.error("Failed to update table in database: wrong http code: {}", response.getStatusCode()); + throw new DataServiceException("Failed to update table in database: wrong http code: " + response.getStatusCode()); + } + } + @Override public void createTable(Long databaseId, TableCreateDto data) throws DataServiceConnectionException, DataServiceException, DatabaseNotFoundException, TableExistsException { diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java index d97483beb1cac9e590b43a2cdf409067f8eb4d74..0f14b8d34826fe94829146f53a0cc22fb9e97333 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java @@ -3,7 +3,9 @@ package at.tuwien.gateway.impl; import at.tuwien.api.database.DatabaseDto; import at.tuwien.config.GatewayConfig; import at.tuwien.entities.database.Database; -import at.tuwien.exception.*; +import at.tuwien.exception.DatabaseNotFoundException; +import at.tuwien.exception.SearchServiceConnectionException; +import at.tuwien.exception.SearchServiceException; import at.tuwien.gateway.SearchServiceGateway; import at.tuwien.mapper.MetadataMapper; import lombok.extern.log4j.Log4j2; @@ -42,7 +44,7 @@ public class SearchServiceGatewayImpl implements SearchServiceGateway { log.trace("update database at endpoint {} with path {}", gatewayConfig.getSearchEndpoint(), path); try { response = restTemplate.exchange(path, HttpMethod.PUT, new HttpEntity<>( - metadataMapper.customDatabaseToDatabaseDto(database), headers), DatabaseDto.class); + metadataMapper.databaseToPrivilegedDatabaseDto(database), headers), DatabaseDto.class); } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable | HttpServerErrorException.InternalServerError e) { log.error("Failed to update database: {}", e.getMessage()); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java index e4767219063b8e9ee504a404be0bbfcf806270d9..9a5c395c72abd23198c1e8d59daf346e42916fb0 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java @@ -1,11 +1,13 @@ package at.tuwien.service; import at.tuwien.api.database.table.TableCreateDto; +import at.tuwien.api.database.table.TableUpdateDto; import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.exception.*; +import org.springframework.transaction.annotation.Transactional; import java.security.Principal; @@ -49,6 +51,10 @@ public interface TableService { */ void deleteTable(Table table) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException, SearchServiceConnectionException; + Table updateTable(Table table, TableUpdateDto data) throws DataServiceException, + DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException, + SearchServiceConnectionException; + TableColumn update(TableColumn column, ColumnSemanticsUpdateDto updateDto) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, MalformedException, OntologyNotFoundException, SemanticEntityNotFoundException; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java index a090ece3cb1182f23e37fcf3ba6821ab6254bd02..9ec30b74f2efd58886269f8e8994f4852ead827e 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java @@ -1,10 +1,12 @@ package at.tuwien.service; import at.tuwien.api.database.ViewCreateDto; +import at.tuwien.api.database.ViewUpdateDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.View; import at.tuwien.entities.user.User; import at.tuwien.exception.*; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -43,7 +45,29 @@ public interface ViewService { * @param user The user. * @param data The given query. * @return The view that was created. + * @throws MalformedException + * @throws DataServiceException + * @throws DataServiceConnectionException + * @throws DatabaseNotFoundException + * @throws SearchServiceException + * @throws SearchServiceConnectionException + * @throws ViewNotFoundException */ View create(Database database, User user, ViewCreateDto data) throws MalformedException, DataServiceException, - DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; + DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, + SearchServiceConnectionException; + + /** + * @param database + * @param view + * @param data + * @return + * @throws DataServiceConnectionException + * @throws DatabaseNotFoundException + * @throws SearchServiceException + * @throws SearchServiceConnectionException + * @throws ViewNotFoundException + */ + View update(Database database, View view, ViewUpdateDto data) throws DataServiceConnectionException, + DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, ViewNotFoundException; } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java index b6af9018118f0e502feb1452b8a4838e9baadb34..b3f98b01bbb2d406738d314fd15333727aaf4885 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.security.Principal; import java.util.List; import java.util.Optional; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java index 330d4518dedba7e1e5e78f25a7433c18762fd579..9ffa720d4d94acc38ebe1652624aa8956f80ae83 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java @@ -11,7 +11,6 @@ import at.tuwien.entities.container.Container; import at.tuwien.entities.database.*; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; -import at.tuwien.entities.database.table.constraints.Constraints; import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey; import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference; import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey; @@ -22,14 +21,17 @@ import at.tuwien.gateway.DataServiceGateway; import at.tuwien.gateway.SearchServiceGateway; import at.tuwien.mapper.MetadataMapper; import at.tuwien.repository.DatabaseRepository; -import at.tuwien.service.*; +import at.tuwien.service.DatabaseService; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; @Log4j2 @Service @@ -88,14 +90,13 @@ public class DatabaseServiceImpl implements DatabaseService { SearchServiceException, SearchServiceConnectionException { Database database = Database.builder() .isPublic(data.getIsPublic()) + .isSchemaPublic(data.getIsSchemaPublic()) .name(data.getName()) .internalName(metadataMapper.nameToInternalName(data.getName()) + "_" + RandomStringUtils.randomAlphabetic(4).toLowerCase()) .cid(data.getCid()) .container(container) .ownedBy(user.getId()) .owner(user) - .createdBy(user.getId()) - .creator(user) .contactPerson(user.getId()) .contact(user) .tables(new LinkedList<>()) @@ -155,6 +156,10 @@ public class DatabaseServiceImpl implements DatabaseService { throws DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException { /* update in metadata database */ database.setIsPublic(data.getIsPublic()); + database.setIsSchemaPublic(data.getIsSchemaPublic()); + log.debug("visibility change affects {} table(s)", database.getTables().stream().filter(t -> !t.getIsSchemaPublic().equals(data.getIsSchemaPublic())).count()); + database.getTables() + .forEach(table -> table.setIsSchemaPublic(data.getIsSchemaPublic())); database = databaseRepository.save(database); /* update in open search service */ searchServiceGateway.update(database); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java index df0f895f5d2d3512444b2d3e10e28e14a70e2c45..0682225e8ad28c1ea0e2fd93c9b6efd9c1366d26 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java @@ -2,7 +2,10 @@ package at.tuwien.service.impl; import at.tuwien.ExportResourceDto; import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.identifier.*; +import at.tuwien.api.identifier.BibliographyTypeDto; +import at.tuwien.api.identifier.IdentifierCreateDto; +import at.tuwien.api.identifier.IdentifierSaveDto; +import at.tuwien.api.identifier.IdentifierTypeDto; import at.tuwien.config.MetadataConfig; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.LanguageType; @@ -16,7 +19,8 @@ import at.tuwien.gateway.DataServiceGateway; import at.tuwien.gateway.SearchServiceGateway; import at.tuwien.mapper.MetadataMapper; import at.tuwien.repository.IdentifierRepository; -import at.tuwien.service.*; +import at.tuwien.service.IdentifierService; +import at.tuwien.service.ViewService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.core.io.InputStreamResource; @@ -27,7 +31,10 @@ import org.thymeleaf.context.Context; import org.thymeleaf.exceptions.TemplateInputException; import java.nio.charset.Charset; -import java.util.*; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.stream.Stream; @Slf4j @@ -159,8 +166,8 @@ public class IdentifierServiceImpl implements IdentifierService { SearchServiceConnectionException, IdentifierNotFoundException, ViewNotFoundException { final Identifier identifier = find(data.getId()); identifier.setDatabase(database); - identifier.setCreatedBy(user.getId()); - identifier.setCreator(user); + identifier.setOwnedBy(user.getId()); + identifier.setOwner(user); identifier.setStatus(IdentifierStatusType.DRAFT); /* set from data */ identifier.setTableId(data.getTableId()); @@ -227,8 +234,8 @@ public class IdentifierServiceImpl implements IdentifierService { SearchServiceConnectionException, IdentifierNotFoundException, ViewNotFoundException { final Identifier identifier = metadataMapper.identifierCreateDtoToIdentifier(data); identifier.setDatabase(database); - identifier.setCreatedBy(user.getId()); - identifier.setCreator(user); + identifier.setOwnedBy(user.getId()); + identifier.setOwner(user); identifier.setStatus(IdentifierStatusType.DRAFT); /* create in metadata database */ if (data.getCreators() != null) { diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java index 4866fea2c10b8afa3bb4f93f2eedb3d2aa8f1ad7..4a4a9ccaca7dedfc88f15db944c474cc5882e400 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java @@ -2,6 +2,7 @@ package at.tuwien.service.impl; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.TableStatisticDto; +import at.tuwien.api.database.table.TableUpdateDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnStatisticDto; import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; @@ -109,12 +110,12 @@ public class TableServiceImpl implements TableService { .queueName(rabbitConfig.getQueueName()) .tdbid(database.getId()) .database(database) - .createdBy(owner.getId()) - .creator(owner) .ownedBy(owner.getId()) .owner(owner) .numRows(0L) .dataLength(0L) + .isPublic(data.getIsPublic()) + .isSchemaPublic(data.getIsSchemaPublic()) .identifiers(new LinkedList<>()) .columns(new LinkedList<>()) .build(); @@ -200,6 +201,34 @@ public class TableServiceImpl implements TableService { log.info("Deleted table with id {}", table.getId()); } + @Transactional + @Override + public Table updateTable(Table table, TableUpdateDto data) throws DataServiceException, + DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException, + SearchServiceConnectionException { + /* update at data service */ + dataServiceGateway.updateTable(table.getDatabase().getId(), table.getId(), data); + /* update in metadata database */ + final Optional<Table> optional = table.getDatabase() + .getTables() + .stream() + .filter(t -> t.getId().equals(table.getId())) + .findFirst(); + if (optional.isEmpty()) { + log.error("Failed to find table with id {}", table.getId()); + throw new TableNotFoundException("Failed to find table with id " + table.getId()); + } + final Table tableEntity = optional.get(); + tableEntity.setIsPublic(data.getIsPublic()); + tableEntity.setDescription(data.getDescription()); + tableEntity.setIsSchemaPublic(data.getIsSchemaPublic()); + final Database database = databaseRepository.save(table.getDatabase()); + /* update in search service */ + searchServiceGateway.update(database); + log.info("Updated table with id {}", table.getId()); + return tableEntity; + } + @Override @Transactional public TableColumn update(TableColumn column, ColumnSemanticsUpdateDto data) throws DataServiceException, diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java index 17a2c26d8929e6e89d220427100e1124c75b92b8..b0a8f017962ccc808d8f3d1a37ae584fb1106316 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java @@ -2,6 +2,7 @@ package at.tuwien.service.impl; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; +import at.tuwien.api.database.ViewUpdateDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.View; import at.tuwien.entities.user.User; @@ -64,7 +65,7 @@ public class ViewServiceImpl implements ViewService { } return database.getViews() .stream() - .filter(v -> v.getIsPublic() || v.getCreatedBy().equals(user.getId())) + .filter(v -> v.getIsPublic() || v.getOwnedBy().equals(user.getId())) .toList(); } @@ -86,16 +87,17 @@ public class ViewServiceImpl implements ViewService { @Override @Transactional - public View create(Database database, User creator, ViewCreateDto data) throws MalformedException, DataServiceException, - DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException { + public View create(Database database, User creator, ViewCreateDto data) throws MalformedException, + DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, + SearchServiceConnectionException { /* create in metadata database */ final View view = View.builder() .vdbid(database.getId()) .database(database) .name(data.getName()) .internalName(metadataMapper.nameToInternalName(data.getName())) - .createdBy(creator.getId()) - .creator(creator) + .ownedBy(creator.getId()) + .owner(creator) .identifiers(new LinkedList<>()) .query(data.getQuery()) .queryHash(Hashing.sha256() @@ -103,6 +105,7 @@ public class ViewServiceImpl implements ViewService { .toString()) .columns(new LinkedList<>()) .isInitialView(false) + .isSchemaPublic(data.getIsSchemaPublic()) .isPublic(data.getIsPublic()) .build(); /* create in data service */ @@ -131,4 +134,26 @@ public class ViewServiceImpl implements ViewService { return optional.get(); } + @Override + @Transactional + public View update(Database database, View view, ViewUpdateDto data) throws DataServiceConnectionException, + DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, ViewNotFoundException { + final Optional<View> optional = database.getViews() + .stream() + .filter(v -> v.getInternalName().equals(view.getInternalName())) + .findFirst(); + if (optional.isEmpty()) { + log.error("Failed to find view"); + throw new ViewNotFoundException("Failed to find view"); + } + final View tmpView = optional.get(); + tmpView.setIsPublic(data.getIsPublic()); + tmpView.setIsSchemaPublic(data.getIsSchemaPublic()); + database = databaseRepository.save(database); + /* update in search service */ + searchServiceGateway.update(database); + log.info("Updated view with id {}", tmpView.getId()); + return optional.get(); + } + } diff --git a/dbrepo-metadata-service/test/pom.xml b/dbrepo-metadata-service/test/pom.xml index dcccbef8f8083ac032d5f4c14618e3661e4efb86..cdb1783c840fcf2e088e5a7d8f29bc67a3d5693d 100644 --- a/dbrepo-metadata-service/test/pom.xml +++ b/dbrepo-metadata-service/test/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.6.0</version> </parent> <artifactId>dbrepo-metadata-service-test</artifactId> <name>dbrepo-metadata-service-test</name> - <version>1.5.2</version> + <version>1.6.0</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java index 8e613cfa7cad69c2de42d96ccacee6957e5f7939..b8c66fa6b75b9041dc61b1d6bebd0f67345f6042 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java @@ -9,11 +9,13 @@ import java.util.List; public abstract class AbstractUnitTest extends BaseTest { public void genesis() { + CONTAINER_1_PRIVILEGED_DTO.setImage(IMAGE_1_DTO); IMAGE_1.setOperators(new LinkedList<>(IMAGE_1_OPERATORS)); CONTAINER_1.setDatabases(new LinkedList<>(List.of(DATABASE_1, DATABASE_2, DATABASE_3))); CONTAINER_4.setDatabases(new LinkedList<>(List.of(DATABASE_4))); /* USER_1 */ USER_1.setAccesses(new LinkedList<>()); + USER_1.setTheme(USER_1_THEME); /* USER_2 */ USER_2.setAccesses(new LinkedList<>()); /* USER_3 */ diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 4586f68d4f9c2d809bb568c0c5e878e86ca345d8..b0fcead7ed246f2e78afd6adfa4635ac2e59dfdf 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -107,7 +107,7 @@ import static java.time.temporal.ChronoUnit.HOURS; import static java.time.temporal.ChronoUnit.MINUTES; /** - * Database 1 (Private, User 1) -> Container 1 + * Database 1 (Private Data, Private Schema, User 1) -> Container 1 * <ul> * <li>Table 1</li> * <li>Table 2</li> @@ -123,7 +123,7 @@ import static java.time.temporal.ChronoUnit.MINUTES; * <li>Identifier 4 (Title=en, Description=en, type=table, tableId=1)</li> * </ul> * <p> - * Database 2 (Private, User 2) -> Container 1 + * Database 2 (Private Data, Public Schema, User 2) -> Container 1 * <ul> * <li>Table 5</li> * <li>Table 6</li> @@ -134,7 +134,7 @@ import static java.time.temporal.ChronoUnit.MINUTES; * <li>Identifier 5 (Title=de, Description=de)</li> * </ul> * <p> - * Database 3 (Public, User 3) -> Container 1 + * Database 3 (Public Data, Private Schema, User 3) -> Container 1 * <ul> * <li>Table 8</li> * <li>Query 3</li> @@ -144,7 +144,7 @@ import static java.time.temporal.ChronoUnit.MINUTES; * <li>Identifier 6 (Title=en, Description=en, Query=3)</li> * </ul> * <p> - * Database 4 (Public, User 4) -> Container 4 + * Database 4 (Public Data, Public Schema, User 4) -> Container 4 * <li>Identifier 7 (Database=4)</li> * <ul> * </ul> @@ -160,6 +160,9 @@ public abstract class BaseTest { public final static String[] DEFAULT_SEMANTICS_HANDLING = new String[]{"default-semantics-handling", "create-semantic-unit", "execute-semantic-query", "table-semantic-analyse", "create-semantic-concept"}; + public final static String[] DEFAULT_VIEW_HANDLING = new String[]{"update-database-view", "create-database-view", + "delete-database-view", "list-database-views", "modify-view-visibility", "find-database-view"}; + public final static String[] ESCALATED_SEMANTICS_HANDLING = new String[]{"escalated-semantics-handling", "update-semantic-concept", "modify-foreign-table-column-semantics", "delete-ontology", "list-ontologies", "update-semantic-unit", "create-ontology", "update-ontology"}; @@ -193,7 +196,7 @@ public abstract class BaseTest { public final static String[] DEFAULT_TABLE_HANDLING = new String[]{"default-table-handling", "list-tables", "create-table", "modify-table-column-semantics", "find-table", "delete-table", - "update-table-statistic"}; + "update-table-statistic", "update-table"}; public final static String[] ESCALATED_TABLE_HANDLING = new String[]{"escalated-table-handling", "delete-foreign-table"}; @@ -205,16 +208,16 @@ public abstract class BaseTest { public final static String[] DEFAULT_RESEARCHER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-researcher-roles"}, DEFAULT_CONTAINER_HANDLING, DEFAULT_DATABASE_HANDLING, DEFAULT_IDENTIFIER_HANDLING, DEFAULT_QUERY_HANDLING, - DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, DEFAULT_SEMANTICS_HANDLING)); + DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, DEFAULT_SEMANTICS_HANDLING, DEFAULT_VIEW_HANDLING)); public final static String[] DEFAULT_DEVELOPER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-developer-roles"}, DEFAULT_CONTAINER_HANDLING, DEFAULT_DATABASE_HANDLING, DEFAULT_IDENTIFIER_HANDLING, DEFAULT_QUERY_HANDLING, DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, ESCALATED_USER_HANDLING, ESCALATED_CONTAINER_HANDLING, ESCALATED_DATABASE_HANDLING, ESCALATED_IDENTIFIER_HANDLING, ESCALATED_QUERY_HANDLING, - ESCALATED_TABLE_HANDLING)); + ESCALATED_TABLE_HANDLING, DEFAULT_VIEW_HANDLING)); public final static String[] DEFAULT_DATA_STEWARD_ROLES = ArrayUtils.merge(List.of(new String[]{"default-data-steward-roles"}, - ESCALATED_IDENTIFIER_HANDLING, DEFAULT_SEMANTICS_HANDLING, ESCALATED_SEMANTICS_HANDLING)); + ESCALATED_IDENTIFIER_HANDLING, DEFAULT_SEMANTICS_HANDLING, ESCALATED_SEMANTICS_HANDLING, DEFAULT_VIEW_HANDLING)); public final static String[] DEFAULT_LOCAL_ADMIN_ROLES = new String[]{"admin"}; @@ -393,6 +396,9 @@ public abstract class BaseTest { public final static UUID USER_LOCAL_ADMIN_ID = UUID.fromString("a54dcb2e-a644-4e82-87e7-05a96413983d"); public final static String USER_LOCAL_ADMIN_USERNAME = "admin"; public final static String USER_LOCAL_ADMIN_PASSWORD = "admin"; + public final static String USER_LOCAL_ADMIN_THEME = "dark"; + public final static String USER_LOCAL_ADMIN_EMAIL = "admin@local"; + public final static String USER_LOCAL_ADMIN_MARIADB_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA"; public final static UserDetails USER_LOCAL_ADMIN_DETAILS = UserDetailsDto.builder() .username(USER_LOCAL_ADMIN_USERNAME) @@ -400,6 +406,14 @@ public abstract class BaseTest { .authorities(AUTHORITY_DEFAULT_LOCAL_ADMIN_AUTHORITIES) .build(); + public final static User USER_LOCAL = User.builder() + .id(USER_LOCAL_ADMIN_ID) + .username(USER_LOCAL_ADMIN_USERNAME) + .email(USER_LOCAL_ADMIN_EMAIL) + .mariadbPassword(USER_LOCAL_ADMIN_MARIADB_PASSWORD) + .theme(USER_LOCAL_ADMIN_THEME) + .build(); + public final static Principal USER_LOCAL_ADMIN_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_LOCAL_ADMIN_DETAILS, USER_LOCAL_ADMIN_PASSWORD, USER_LOCAL_ADMIN_DETAILS.getAuthorities()); @@ -529,6 +543,7 @@ public abstract class BaseTest { .firstname(USER_1_FIRSTNAME) .lastname(USER_1_LASTNAME) .name(USER_1_NAME) + .qualifiedName(USER_1_QUALIFIED_NAME) .build(); public final static UserDetails USER_1_DETAILS = UserDetailsDto.builder() @@ -611,6 +626,7 @@ public abstract class BaseTest { .firstname(USER_2_FIRSTNAME) .lastname(USER_2_LASTNAME) .name(USER_2_NAME) + .qualifiedName(USER_2_QUALIFIED_NAME) .build(); public final static SignupRequestDto USER_2_SIGNUP_REQUEST_DTO = SignupRequestDto.builder() @@ -839,6 +855,13 @@ public abstract class BaseTest { .lastname(USER_5_LASTNAME) .build(); + public final static UserBriefDto USER_5_BRIEF_DTO = UserBriefDto.builder() + .id(USER_5_ID) + .username(USER_5_USERNAME) + .firstname(USER_5_FIRSTNAME) + .lastname(USER_5_LASTNAME) + .build(); + public final static UserDetails USER_5_DETAILS = UserDetailsDto.builder() .id(USER_5_ID.toString()) .username(USER_5_USERNAME) @@ -952,6 +975,7 @@ public abstract class BaseTest { .name(IMAGE_1_NAME) .version(IMAGE_1_VERSION) .isDefault(IMAGE_1_IS_DEFAULT) + .jdbcMethod(IMAGE_1_JDBC) .build(); public final static List<Operator> IMAGE_1_OPERATORS = List.of( @@ -1001,18 +1025,17 @@ public abstract class BaseTest { .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) .image(CONTAINER_1_IMAGE_DTO) - .created(CONTAINER_1_CREATED) .host(CONTAINER_1_HOST) .port(CONTAINER_1_PORT) .build(); - public final static ContainerBriefDto CONTAINER_1_DTO_BRIEF = ContainerBriefDto.builder() + public final static ContainerBriefDto CONTAINER_1_BRIEF_DTO = ContainerBriefDto.builder() .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) - .created(CONTAINER_1_CREATED) .quota(CONTAINER_1_QUOTA) .count(CONTAINER_1_COUNT) + .image(IMAGE_1_BRIEF_DTO) .build(); public final static PrivilegedContainerDto CONTAINER_1_PRIVILEGED_DTO = PrivilegedContainerDto.builder() @@ -1020,7 +1043,6 @@ public abstract class BaseTest { .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) .image(CONTAINER_1_IMAGE_DTO) - .created(CONTAINER_1_CREATED) .host(CONTAINER_1_HOST) .port(CONTAINER_1_PORT) .username(CONTAINER_1_PRIVILEGED_USERNAME) @@ -1060,7 +1082,6 @@ public abstract class BaseTest { .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) .image(CONTAINER_2_IMAGE_DTO) - .created(CONTAINER_2_CREATED) .host(CONTAINER_2_HOST) .port(CONTAINER_2_PORT) .build(); @@ -1069,7 +1090,6 @@ public abstract class BaseTest { .id(CONTAINER_2_ID) .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) - .created(CONTAINER_2_CREATED) .quota(CONTAINER_2_QUOTA) .build(); @@ -1145,6 +1165,7 @@ public abstract class BaseTest { public final static String DATABASE_1_DESCRIPTION = "Weather in Australia"; public final static String DATABASE_1_INTERNALNAME = "weather"; public final static Boolean DATABASE_1_PUBLIC = false; + public final static Boolean DATABASE_1_SCHEMA_PUBLIC = false; public final static String DATABASE_1_EXCHANGE = "dbrepo"; public final static Instant DATABASE_1_CREATED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */; public final static Instant DATABASE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */; @@ -1174,6 +1195,7 @@ public abstract class BaseTest { public final static String DATABASE_2_DESCRIPTION = "Zoo data"; public final static String DATABASE_2_INTERNALNAME = "zoo"; public final static Boolean DATABASE_2_PUBLIC = false; + public final static Boolean DATABASE_2_SCHEMA_PUBLIC = true; public final static String DATABASE_2_EXCHANGE = "dbrepo"; public final static Instant DATABASE_2_CREATED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */; public final static Instant DATABASE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */; @@ -1191,6 +1213,7 @@ public abstract class BaseTest { public final static String DATABASE_3_DESCRIPTION = "Musicology data"; public final static String DATABASE_3_INTERNALNAME = "musicology"; public final static Boolean DATABASE_3_PUBLIC = true; + public final static Boolean DATABASE_3_SCHEMA_PUBLIC = false; public final static String DATABASE_3_EXCHANGE = "dbrepo"; public final static Instant DATABASE_3_CREATED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */; public final static Instant DATABASE_3_LAST_MODIFIED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */; @@ -1202,10 +1225,9 @@ public abstract class BaseTest { public final static DatabaseDto DATABASE_3_DTO = DatabaseDto.builder() .id(DATABASE_3_ID) - .created(DATABASE_3_CREATED) .isPublic(DATABASE_3_PUBLIC) .name(DATABASE_3_NAME) - .container(CONTAINER_1_DTO) + .container(CONTAINER_1_BRIEF_DTO) .internalName(DATABASE_3_INTERNALNAME) .exchangeName(DATABASE_3_EXCHANGE) .tables(new LinkedList<>()) /* TABLE_3, TABLE_3, TABLE_3 */ @@ -1223,6 +1245,7 @@ public abstract class BaseTest { public final static String DATABASE_4_NAME = "Weather AT"; public final static String DATABASE_4_DESCRIPTION = "Weather data"; public final static Boolean DATABASE_4_PUBLIC = true; + public final static Boolean DATABASE_4_SCHEMA_PUBLIC = true; public final static String DATABASE_4_INTERNALNAME = "weather_at"; public final static String DATABASE_4_EXCHANGE = "dbrepo"; public final static Instant DATABASE_4_CREATED = Instant.ofEpochSecond(1677399813L) /* 2023-02-26 08:23:33 (UTC) */; @@ -1232,15 +1255,13 @@ public abstract class BaseTest { public final static DatabaseDto DATABASE_4_DTO = DatabaseDto.builder() .id(DATABASE_4_ID) - .created(Instant.now().minus(4, HOURS)) .isPublic(DATABASE_4_PUBLIC) + .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC) .name(DATABASE_4_NAME) .description(DATABASE_4_DESCRIPTION) .internalName(DATABASE_4_INTERNALNAME) .exchangeName(DATABASE_4_EXCHANGE) - .created(DATABASE_4_CREATED) - .creator(USER_4_DTO) - .owner(USER_4_DTO) + .owner(USER_4_BRIEF_DTO) .tables(new LinkedList<>()) .views(new LinkedList<>()) .identifiers(new LinkedList<>()) @@ -1419,6 +1440,8 @@ public abstract class BaseTest { public final static String TABLE_1_NAME = "Weather AUS"; public final static String TABLE_1_INTERNALNAME = "weather_aus"; public final static Boolean TABLE_1_VERSIONED = true; + public final static Boolean TABLE_1_IS_PUBLIC = false; + public final static Boolean TABLE_1_SCHEMA_PUBLIC = false; public final static Boolean TABLE_1_PROCESSED_CONSTRAINTS = true; public final static String TABLE_1_DESCRIPTION = "Weather in Australia"; public final static String TABLE_1_QUEUE_NAME = TABLE_1_INTERNALNAME; @@ -1435,9 +1458,9 @@ public abstract class BaseTest { .id(TABLE_1_ID) .tdbid(DATABASE_1_ID) .database(null) /* DATABASE_1_PRIVILEGED_DTO */ - .created(TABLE_1_CREATED) .internalName(TABLE_1_INTERNALNAME) .isVersioned(TABLE_1_VERSIONED) + .isPublic(TABLE_1_SCHEMA_PUBLIC) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) .queueName(TABLE_1_QUEUE_NAME) @@ -1445,8 +1468,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_1_COLUMNS_DTO */) .constraints(null) /* TABLE_1_CONSTRAINTS_DTO */ - .createdBy(USER_1_ID) - .owner(USER_1_DTO) + .owner(USER_1_BRIEF_DTO) .isPublic(DATABASE_1_PUBLIC) .avgRowLength(TABLE_1_AVG_ROW_LENGTH) .numRows(TABLE_1_NUM_ROWS) @@ -1461,14 +1483,14 @@ public abstract class BaseTest { .created(TABLE_1_CREATED) .internalName(TABLE_1_INTERNALNAME) .isVersioned(TABLE_1_VERSIONED) + .isPublic(TABLE_1_IS_PUBLIC) + .isSchemaPublic(TABLE_1_SCHEMA_PUBLIC) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) .queueName(TABLE_1_QUEUE_NAME) .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_1_COLUMNS */) .constraints(null) /* TABLE_1_CONSTRAINTS */ - .createdBy(USER_1_ID) - .creator(USER_1) .ownedBy(USER_1_ID) .owner(USER_1) .lastModified(TABLE_1_LAST_MODIFIED) @@ -1481,9 +1503,10 @@ public abstract class BaseTest { public final static TableDto TABLE_1_DTO = TableDto.builder() .id(TABLE_1_ID) .tdbid(DATABASE_1_ID) - .created(TABLE_1_CREATED) .internalName(TABLE_1_INTERNALNAME) .isVersioned(TABLE_1_VERSIONED) + .isPublic(TABLE_1_IS_PUBLIC) + .isSchemaPublic(TABLE_1_SCHEMA_PUBLIC) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) .queueName(TABLE_1_QUEUE_NAME) @@ -1491,8 +1514,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_1_COLUMNS_DTO */) .constraints(null) /* TABLE_1_CONSTRAINT_DTO */ - .createdBy(USER_1_ID) - .owner(USER_1_DTO) + .owner(USER_1_BRIEF_DTO) .avgRowLength(TABLE_1_AVG_ROW_LENGTH) .numRows(TABLE_1_NUM_ROWS) .dataLength(TABLE_1_DATA_LENGTH) @@ -1576,9 +1598,11 @@ public abstract class BaseTest { .id(TABLE_1_ID) .internalName(TABLE_1_INTERNALNAME) .isVersioned(TABLE_1_VERSIONED) + .isPublic(TABLE_1_IS_PUBLIC) + .isSchemaPublic(TABLE_1_SCHEMA_PUBLIC) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) - .owner(USER_1_BRIEF_DTO) + .ownedBy(USER_1_ID) .build(); public final static Long TABLE_1_DATA_COUNT = 3L; @@ -1619,6 +1643,8 @@ public abstract class BaseTest { public final static String TABLE_2_NAME = "Weather Location"; public final static String TABLE_2_INTERNALNAME = "weather_location"; public final static Boolean TABLE_2_VERSIONED = true; + public final static Boolean TABLE_2_IS_PUBLIC = false; + public final static Boolean TABLE_2_SCHEMA_PUBLIC = false; public final static Boolean TABLE_2_PROCESSED_CONSTRAINTS = true; public final static String TABLE_2_DESCRIPTION = "Weather location"; public final static String TABLE_2_QUEUE_NAME = TABLE_2_INTERNALNAME; @@ -1637,14 +1663,14 @@ public abstract class BaseTest { .created(TABLE_2_CREATED) .internalName(TABLE_2_INTERNALNAME) .isVersioned(TABLE_2_VERSIONED) + .isPublic(TABLE_2_IS_PUBLIC) + .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC) .description(TABLE_2_DESCRIPTION) .name(TABLE_2_NAME) .lastModified(TABLE_2_LAST_MODIFIED) .queueName(TABLE_2_QUEUE_NAME) .columns(new LinkedList<>() /* TABLE_2_COLUMNS */) .constraints(null) /* TABLE_2_CONSTRAINTS */ - .creator(USER_2) - .createdBy(USER_2_ID) .owner(USER_2) .ownedBy(USER_2_ID) .avgRowLength(TABLE_2_AVG_ROW_LENGTH) @@ -1657,9 +1683,10 @@ public abstract class BaseTest { .id(TABLE_2_ID) .tdbid(DATABASE_1_ID) .database(null) /* DATABASE_1_PRIVILEGED_DTO */ - .created(TABLE_2_CREATED) .internalName(TABLE_2_INTERNALNAME) .isVersioned(TABLE_2_VERSIONED) + .isPublic(TABLE_2_IS_PUBLIC) + .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC) .description(TABLE_2_DESCRIPTION) .name(TABLE_2_NAME) .queueName(TABLE_2_QUEUE_NAME) @@ -1667,9 +1694,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_2_COLUMNS_DTO */) .constraints(null) /* TABLE_2_CONSTRAINTS_DTO */ - .creator(USER_2_DTO) - .createdBy(USER_2_ID) - .owner(USER_2_DTO) + .owner(USER_2_BRIEF_DTO) .avgRowLength(TABLE_2_AVG_ROW_LENGTH) .numRows(TABLE_2_NUM_ROWS) .dataLength(TABLE_2_DATA_LENGTH) @@ -1679,18 +1704,17 @@ public abstract class BaseTest { public final static TableDto TABLE_2_DTO = TableDto.builder() .id(TABLE_2_ID) .tdbid(DATABASE_1_ID) - .created(TABLE_2_CREATED) .internalName(TABLE_2_INTERNALNAME) .isVersioned(TABLE_2_VERSIONED) + .isPublic(TABLE_2_IS_PUBLIC) + .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC) .description(TABLE_2_DESCRIPTION) .name(TABLE_2_NAME) .queueName(TABLE_2_QUEUE_NAME) .routingKey(TABLE_2_ROUTING_KEY) .columns(new LinkedList<>() /* TABLE_2_COLUMNS_DTO */) .constraints(null) /* TABLE_2_CONSTRAINTS_DTO */ - .creator(USER_2_DTO) - .createdBy(USER_2_ID) - .owner(USER_2_DTO) + .owner(USER_2_BRIEF_DTO) .avgRowLength(TABLE_2_AVG_ROW_LENGTH) .numRows(TABLE_2_NUM_ROWS) .dataLength(TABLE_2_DATA_LENGTH) @@ -1701,15 +1725,19 @@ public abstract class BaseTest { .id(TABLE_2_ID) .internalName(TABLE_2_INTERNALNAME) .isVersioned(TABLE_2_VERSIONED) + .isPublic(TABLE_2_IS_PUBLIC) + .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC) .description(TABLE_2_DESCRIPTION) .name(TABLE_2_NAME) - .owner(USER_2_BRIEF_DTO) + .ownedBy(USER_2_ID) .build(); public final static Long TABLE_3_ID = 3L; public final static String TABLE_3_NAME = "Sensor"; public final static String TABLE_3_INTERNALNAME = "sensor"; public final static Boolean TABLE_3_VERSIONED = true; + public final static Boolean TABLE_3_IS_PUBLIC = false; + public final static Boolean TABLE_3_SCHEMA_PUBLIC = false; public final static Boolean TABLE_3_PROCESSED_CONSTRAINTS = true; public final static String TABLE_3_DESCRIPTION = "Some sensor data"; public final static String TABLE_3_QUEUE_NAME = TABLE_3_INTERNALNAME; @@ -1728,14 +1756,14 @@ public abstract class BaseTest { .created(TABLE_3_CREATED) .internalName(TABLE_3_INTERNALNAME) .isVersioned(TABLE_3_VERSIONED) + .isPublic(TABLE_3_IS_PUBLIC) + .isSchemaPublic(TABLE_3_SCHEMA_PUBLIC) .description(TABLE_3_DESCRIPTION) .name(TABLE_3_NAME) .lastModified(TABLE_3_LAST_MODIFIED) .queueName(TABLE_3_QUEUE_NAME) .columns(new LinkedList<>() /* TABLE_3_COLUMNS */) .constraints(null) /* TABLE_3_CONSTRAINTS */ - .creator(USER_3) - .createdBy(USER_3_ID) .owner(USER_3) .ownedBy(USER_3_ID) .avgRowLength(TABLE_3_AVG_ROW_LENGTH) @@ -1747,18 +1775,17 @@ public abstract class BaseTest { public final static TableDto TABLE_3_DTO = TableDto.builder() .id(TABLE_3_ID) .tdbid(DATABASE_1_ID) - .created(TABLE_3_CREATED) .internalName(TABLE_3_INTERNALNAME) .isVersioned(TABLE_3_VERSIONED) + .isPublic(TABLE_3_IS_PUBLIC) + .isSchemaPublic(TABLE_3_SCHEMA_PUBLIC) .description(TABLE_3_DESCRIPTION) .name(TABLE_3_NAME) .queueName(TABLE_3_QUEUE_NAME) .routingKey(TABLE_3_ROUTING_KEY) .columns(new LinkedList<>() /* TABLE_3_COLUMNS_DTO */) .constraints(null) /* TABLE_3_CONSTRAINTS_DTO */ - .creator(USER_3_DTO) - .createdBy(USER_3_ID) - .owner(USER_3_DTO) + .owner(USER_3_BRIEF_DTO) .avgRowLength(TABLE_3_AVG_ROW_LENGTH) .numRows(TABLE_3_NUM_ROWS) .dataLength(TABLE_3_DATA_LENGTH) @@ -1769,9 +1796,11 @@ public abstract class BaseTest { .id(TABLE_3_ID) .internalName(TABLE_3_INTERNALNAME) .isVersioned(TABLE_3_VERSIONED) + .isPublic(TABLE_3_IS_PUBLIC) + .isSchemaPublic(TABLE_3_SCHEMA_PUBLIC) .description(TABLE_3_DESCRIPTION) .name(TABLE_3_NAME) - .owner(USER_3_BRIEF_DTO) + .ownedBy(USER_3_ID) .build(); public final static ConstraintsCreateDto TABLE_3_CONSTRAINTS_CREATE_DTO = ConstraintsCreateDto.builder() @@ -1809,6 +1838,8 @@ public abstract class BaseTest { public final static String TABLE_5_NAME = "zoo"; public final static String TABLE_5_INTERNALNAME = "zoo"; public final static Boolean TABLE_5_VERSIONED = true; + public final static Boolean TABLE_5_IS_PUBLIC = true; + public final static Boolean TABLE_5_SCHEMA_PUBLIC = true; public final static Boolean TABLE_5_PROCESSED_CONSTRAINTS = true; public final static String TABLE_5_DESCRIPTION = "Some Kaggle dataset"; public final static String TABLE_5_QUEUE_NAME = TABLE_5_INTERNALNAME; @@ -1826,13 +1857,14 @@ public abstract class BaseTest { .created(Instant.now()) .internalName(TABLE_5_INTERNALNAME) .isVersioned(TABLE_5_VERSIONED) + .isPublic(TABLE_5_IS_PUBLIC) + .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC) .description(TABLE_5_DESCRIPTION) .name(TABLE_5_NAME) .lastModified(TABLE_5_LAST_MODIFIED) .queueName(TABLE_5_QUEUE_NAME) .columns(new LinkedList<>()) /* TABLE_5_COLUMNS */ .constraints(null) /* TABLE_5_CONSTRAINTS */ - .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) .build(); @@ -1840,26 +1872,27 @@ public abstract class BaseTest { public final static TableDto TABLE_5_DTO = TableDto.builder() .id(TABLE_5_ID) .tdbid(DATABASE_2_ID) - .created(Instant.now()) .internalName(TABLE_5_INTERNALNAME) .isVersioned(TABLE_5_VERSIONED) + .isPublic(TABLE_5_IS_PUBLIC) + .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC) .description(TABLE_5_DESCRIPTION) .name(TABLE_5_NAME) .queueName(TABLE_5_QUEUE_NAME) .routingKey(TABLE_5_ROUTING_KEY) .columns(new LinkedList<>()) /* TABLE_5_COLUMNS_DTO */ .constraints(null) /* TABLE_5_CONSTRAINTS_DTO */ - .createdBy(USER_1_ID) - .owner(USER_1_DTO) + .owner(USER_1_BRIEF_DTO) .build(); public final static PrivilegedTableDto TABLE_5_PRIVILEGED_DTO = PrivilegedTableDto.builder() .id(TABLE_5_ID) .tdbid(DATABASE_2_ID) .database(null) /* DATABASE_2_PRIVILEGED_DTO */ - .created(TABLE_5_CREATED) .internalName(TABLE_5_INTERNALNAME) .isVersioned(TABLE_5_VERSIONED) + .isPublic(TABLE_5_IS_PUBLIC) + .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC) .description(TABLE_5_DESCRIPTION) .name(TABLE_5_NAME) .queueName(TABLE_5_QUEUE_NAME) @@ -1867,8 +1900,7 @@ public abstract class BaseTest { .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_5_COLUMNS_DTO */) .constraints(null) /* TABLE_5_CONSTRAINTS_DTO */ - .createdBy(USER_5_ID) - .owner(USER_5_DTO) + .owner(USER_5_BRIEF_DTO) .isPublic(DATABASE_2_PUBLIC) .avgRowLength(TABLE_5_AVG_ROW_LENGTH) .numRows(TABLE_5_NUM_ROWS) @@ -1880,15 +1912,19 @@ public abstract class BaseTest { .id(TABLE_5_ID) .internalName(TABLE_5_INTERNALNAME) .isVersioned(TABLE_5_VERSIONED) + .isPublic(TABLE_5_IS_PUBLIC) + .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC) .description(TABLE_5_DESCRIPTION) .name(TABLE_5_NAME) - .owner(USER_1_BRIEF_DTO) + .ownedBy(USER_1_ID) .build(); public final static Long TABLE_6_ID = 6L; public final static String TABLE_6_NAME = "names"; public final static String TABLE_6_INTERNALNAME = "names"; public final static Boolean TABLE_6_VERSIONED = true; + public final static Boolean TABLE_6_IS_PUBLIC = true; + public final static Boolean TABLE_6_SCHEMA_PUBLIC = true; public final static Boolean TABLE_6_PROCESSED_CONSTRAINTS = true; public final static String TABLE_6_DESCRIPTION = "Some names dataset"; public final static String TABLE_6_QUEUE_NAME = TABLE_6_INTERNALNAME; @@ -1902,13 +1938,14 @@ public abstract class BaseTest { .created(TABLE_6_CREATED) .internalName(TABLE_6_INTERNALNAME) .isVersioned(TABLE_6_VERSIONED) + .isPublic(TABLE_6_IS_PUBLIC) + .isSchemaPublic(TABLE_6_SCHEMA_PUBLIC) .description(TABLE_6_DESCRIPTION) .name(TABLE_6_NAME) .lastModified(TABLE_6_LAST_MODIFIED) .queueName(TABLE_6_QUEUE_NAME) .columns(new LinkedList<>()) /* TABLE_6_COLUMNS */ .constraints(null) /* TABLE_6_CONSTRAINTS */ - .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) .created(TABLE_6_CREATED) @@ -1917,33 +1954,36 @@ public abstract class BaseTest { public final static TableDto TABLE_6_DTO = TableDto.builder() .id(TABLE_6_ID) .tdbid(DATABASE_2_ID) - .created(TABLE_6_CREATED) .internalName(TABLE_6_INTERNALNAME) .isVersioned(TABLE_6_VERSIONED) + .isPublic(TABLE_6_IS_PUBLIC) + .isSchemaPublic(TABLE_6_SCHEMA_PUBLIC) .description(TABLE_6_DESCRIPTION) .name(TABLE_6_NAME) .queueName(TABLE_6_QUEUE_NAME) .routingKey(TABLE_6_ROUTING_KEY) .columns(new LinkedList<>()) /* TABLE_6_COLUMNS_DTO */ .constraints(null) /* TABLE_6_CONSTRAINTS_DTO */ - .createdBy(USER_1_ID) - .owner(USER_1_DTO) - .created(TABLE_6_CREATED) + .owner(USER_1_BRIEF_DTO) .build(); public final static TableBriefDto TABLE_6_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_6_ID) .internalName(TABLE_6_INTERNALNAME) .isVersioned(TABLE_6_VERSIONED) + .isPublic(TABLE_6_IS_PUBLIC) + .isSchemaPublic(TABLE_6_SCHEMA_PUBLIC) .description(TABLE_6_DESCRIPTION) .name(TABLE_6_NAME) - .owner(USER_1_BRIEF_DTO) + .ownedBy(USER_1_ID) .build(); public final static Long TABLE_7_ID = 7L; public final static String TABLE_7_NAME = "likes"; public final static String TABLE_7_INTERNAL_NAME = "likes"; public final static Boolean TABLE_7_VERSIONED = true; + public final static Boolean TABLE_7_IS_PUBLIC = true; + public final static Boolean TABLE_7_SCHEMA_PUBLIC = true; public final static Boolean TABLE_7_PROCESSED_CONSTRAINTS = true; public final static String TABLE_7_DESCRIPTION = "Some likes dataset"; public final static String TABLE_7_QUEUE_NAME = TABLE_7_INTERNAL_NAME; @@ -1957,13 +1997,14 @@ public abstract class BaseTest { .created(TABLE_7_CREATED) .internalName(TABLE_7_INTERNAL_NAME) .isVersioned(TABLE_7_VERSIONED) + .isPublic(TABLE_7_IS_PUBLIC) + .isSchemaPublic(TABLE_7_SCHEMA_PUBLIC) .description(TABLE_7_DESCRIPTION) .name(TABLE_7_NAME) .lastModified(TABLE_7_LAST_MODIFIED) .queueName(TABLE_7_QUEUE_NAME) .columns(new LinkedList<>()) /* TABLE_7_COLUMNS */ .constraints(null) /* TABLE_7_CONSTRAINTS */ - .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) .created(TABLE_7_CREATED) @@ -1972,33 +2013,36 @@ public abstract class BaseTest { public final static TableDto TABLE_7_DTO = TableDto.builder() .id(TABLE_7_ID) .tdbid(DATABASE_2_ID) - .created(TABLE_7_CREATED) .internalName(TABLE_7_INTERNAL_NAME) .isVersioned(TABLE_7_VERSIONED) + .isPublic(TABLE_7_IS_PUBLIC) + .isSchemaPublic(TABLE_7_SCHEMA_PUBLIC) .description(TABLE_7_DESCRIPTION) .name(TABLE_7_NAME) .queueName(TABLE_7_QUEUE_NAME) .routingKey(TABLE_7_ROUTING_KEY) .columns(new LinkedList<>()) /* TABLE_7_COLUMNS_DTO */ .constraints(null) /* TABLE_7_CONSTRAINTS_DTO */ - .createdBy(USER_1_ID) - .owner(USER_1_DTO) - .created(TABLE_7_CREATED) + .owner(USER_1_BRIEF_DTO) .build(); public final static TableBriefDto TABLE_7_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_7_ID) .internalName(TABLE_7_INTERNAL_NAME) .isVersioned(TABLE_7_VERSIONED) + .isPublic(TABLE_7_IS_PUBLIC) + .isSchemaPublic(TABLE_7_SCHEMA_PUBLIC) .description(TABLE_7_DESCRIPTION) .name(TABLE_7_NAME) - .owner(USER_1_BRIEF_DTO) + .ownedBy(USER_1_ID) .build(); public final static Long TABLE_4_ID = 4L; public final static String TABLE_4_NAME = "Sensor 2"; public final static String TABLE_4_INTERNALNAME = "sensor_2"; public final static Boolean TABLE_4_VERSIONED = true; + public final static Boolean TABLE_4_IS_PUBLIC = false; + public final static Boolean TABLE_4_SCHEMA_PUBLIC = false; public final static Boolean TABLE_4_PROCESSED_CONSTRAINTS = true; public final static String TABLE_4_DESCRIPTION = "Hello sensor"; public final static String TABLE_4_QUEUE_NAME = TABLE_4_INTERNALNAME; @@ -2021,8 +2065,8 @@ public abstract class BaseTest { .columns(new LinkedList<>()) /* TABLE_4_COLUMNS */ .constraints(null) /* TABLE_4_CONSTRAINTS */ .isVersioned(TABLE_4_VERSIONED) - .creator(USER_1) - .createdBy(USER_1_ID) + .isPublic(TABLE_4_IS_PUBLIC) + .isSchemaPublic(TABLE_4_SCHEMA_PUBLIC) .owner(USER_1) .ownedBy(USER_1_ID) .created(TABLE_4_CREATED) @@ -2044,10 +2088,9 @@ public abstract class BaseTest { .columns(new LinkedList<>()) /* TABLE_4_COLUMNS_DTO */ .constraints(null) /* TABLE_4_CONSTRAINTS_DTO */ .isVersioned(TABLE_4_VERSIONED) - .creator(USER_1_DTO) - .createdBy(USER_1_ID) - .owner(USER_1_DTO) - .created(TABLE_4_CREATED) + .isPublic(TABLE_4_IS_PUBLIC) + .isSchemaPublic(TABLE_4_SCHEMA_PUBLIC) + .owner(USER_1_BRIEF_DTO) .avgRowLength(TABLE_4_AVG_ROW_LENGTH) .numRows(TABLE_4_NUM_ROWS) .dataLength(TABLE_4_DATA_LENGTH) @@ -2060,7 +2103,9 @@ public abstract class BaseTest { .description(TABLE_4_DESCRIPTION) .name(TABLE_4_NAME) .isVersioned(TABLE_4_VERSIONED) - .owner(USER_1_BRIEF_DTO) + .isPublic(TABLE_4_IS_PUBLIC) + .isSchemaPublic(TABLE_4_SCHEMA_PUBLIC) + .ownedBy(USER_1_ID) .build(); public final static ColumnBriefDto TABLE_4_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder() @@ -2151,6 +2196,8 @@ public abstract class BaseTest { public final static String TABLE_8_NAME = "mfcc"; public final static String TABLE_8_INTERNAL_NAME = "mfcc"; public final static Boolean TABLE_8_VERSIONED = true; + public final static Boolean TABLE_8_IS_PUBLIC = false; + public final static Boolean TABLE_8_SCHEMA_PUBLIC = false; public final static Boolean TABLE_8_PROCESSED_CONSTRAINTS = true; public final static String TABLE_8_DESCRIPTION = "Hello mfcc"; public final static String TABLE_8_QUEUE_NAME = TABLE_8_INTERNAL_NAME; @@ -2164,12 +2211,13 @@ public abstract class BaseTest { .internalName(TABLE_8_INTERNAL_NAME) .description(TABLE_8_DESCRIPTION) .isVersioned(TABLE_8_VERSIONED) + .isPublic(TABLE_8_IS_PUBLIC) + .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC) .database(null /* DATABASE_1 */) .name(TABLE_8_NAME) .queueName(TABLE_8_QUEUE_NAME) .columns(new LinkedList<>()) /* TABLE_8_COLUMNS */ .constraints(null) /* TABLE_8_CONSTRAINTS */ - .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) .created(TABLE_8_CREATED) @@ -2182,14 +2230,13 @@ public abstract class BaseTest { .internalName(TABLE_8_INTERNAL_NAME) .description(TABLE_8_DESCRIPTION) .isVersioned(TABLE_8_VERSIONED) + .isPublic(TABLE_8_IS_PUBLIC) + .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC) .name(TABLE_8_NAME) .queueName(TABLE_8_QUEUE_NAME) .columns(new LinkedList<>()) /* TABLE_8_COLUMNS_DTO */ .constraints(null) /* TABLE_8_CONSTRAINTS_DTO */ - .createdBy(USER_1_ID) - .creator(USER_1_DTO) - .owner(USER_1_DTO) - .created(TABLE_8_CREATED) + .owner(USER_1_BRIEF_DTO) .build(); public final static TableBriefDto TABLE_8_BRIEF_DTO = TableBriefDto.builder() @@ -2197,8 +2244,10 @@ public abstract class BaseTest { .internalName(TABLE_8_INTERNAL_NAME) .description(TABLE_8_DESCRIPTION) .isVersioned(TABLE_8_VERSIONED) + .isPublic(TABLE_8_IS_PUBLIC) + .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC) .name(TABLE_8_NAME) - .owner(USER_1_BRIEF_DTO) + .ownedBy(USER_1_ID) .build(); public final static PrivilegedTableDto TABLE_8_PRIVILEGED_DTO = PrivilegedTableDto.builder() @@ -2207,13 +2256,12 @@ public abstract class BaseTest { .internalName(TABLE_8_INTERNAL_NAME) .description(TABLE_8_DESCRIPTION) .isVersioned(TABLE_8_VERSIONED) + .isPublic(TABLE_8_IS_PUBLIC) + .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC) .name(TABLE_8_NAME) .queueName(TABLE_8_QUEUE_NAME) .columns(new LinkedList<>()) /* TABLE_8_COLUMNS_DTO */ - .createdBy(USER_1_ID) - .creator(USER_1_DTO) - .owner(USER_1_DTO) - .created(TABLE_8_CREATED) + .owner(USER_1_BRIEF_DTO) .isPublic(DATABASE_3_PUBLIC) .build(); @@ -2494,8 +2542,6 @@ public abstract class BaseTest { public final static Instant QUERY_1_CREATED = Instant.ofEpochSecond(1677648377L); public final static Instant QUERY_1_EXECUTION = Instant.now(); public final static Boolean QUERY_1_PERSISTED = true; - public final static UserDto QUERY_1_CREATOR = USER_1_DTO; - public final static UUID QUERY_1_CREATED_BY = USER_1_ID; public final static QueryDto QUERY_1_DTO = QueryDto.builder() .id(QUERY_1_ID) @@ -2503,10 +2549,8 @@ public abstract class BaseTest { .query(QUERY_1_STATEMENT) .queryHash(QUERY_1_QUERY_HASH) .resultHash(QUERY_1_RESULT_HASH) - .created(QUERY_1_CREATED) .execution(QUERY_1_EXECUTION) - .creator(QUERY_1_CREATOR) - .createdBy(QUERY_1_CREATED_BY) + .owner(USER_1_BRIEF_DTO) .isPersisted(QUERY_1_PERSISTED) .resultNumber(3L) .build(); @@ -2517,10 +2561,8 @@ public abstract class BaseTest { .query(QUERY_1_STATEMENT) .queryHash(QUERY_1_QUERY_HASH) .resultHash(QUERY_1_RESULT_HASH) - .created(QUERY_1_CREATED) .execution(QUERY_1_EXECUTION) - .createdBy(USER_1_ID) - .creator(USER_1_DTO) + .owner(USER_1_BRIEF_DTO) .isPersisted(QUERY_1_PERSISTED) .resultNumber(3L) .build(); @@ -2534,8 +2576,6 @@ public abstract class BaseTest { public final static Instant QUERY_2_EXECUTION = Instant.now().minus(1, MINUTES); public final static Instant QUERY_2_LAST_MODIFIED = Instant.ofEpochSecond(1541588352L); public final static Boolean QUERY_2_PERSISTED = false; - public final static UserDto QUERY_2_CREATOR = USER_1_DTO; - public final static UUID QUERY_2_CREATED_BY = USER_1_ID; public final static QueryDto QUERY_2_DTO = QueryDto.builder() .id(QUERY_2_ID) @@ -2544,10 +2584,7 @@ public abstract class BaseTest { .queryNormalized(QUERY_2_STATEMENT) .resultNumber(QUERY_2_RESULT_NUMBER) .resultHash(QUERY_2_RESULT_HASH) - .lastModified(QUERY_2_LAST_MODIFIED) - .created(QUERY_2_CREATED) - .creator(QUERY_2_CREATOR) - .createdBy(QUERY_2_CREATED_BY) + .owner(USER_1_BRIEF_DTO) .queryHash(QUERY_2_QUERY_HASH) .execution(QUERY_2_EXECUTION) .isPersisted(QUERY_2_PERSISTED) @@ -2565,8 +2602,6 @@ public abstract class BaseTest { public final static Instant QUERY_3_LAST_MODIFIED = Instant.ofEpochSecond(1541588353L); public final static Long QUERY_3_RESULT_NUMBER = 2L; public final static Boolean QUERY_3_PERSISTED = true; - public final static UserDto QUERY_3_CREATOR = USER_1_DTO; - public final static UUID QUERY_3_CREATED_BY = USER_1_ID; public final static QueryDto QUERY_3_DTO = QueryDto.builder() .id(QUERY_3_ID) @@ -2575,10 +2610,7 @@ public abstract class BaseTest { .queryNormalized(QUERY_3_STATEMENT) .resultNumber(QUERY_3_RESULT_NUMBER) .resultHash(QUERY_3_RESULT_HASH) - .lastModified(QUERY_3_LAST_MODIFIED) - .created(QUERY_3_CREATED) - .creator(QUERY_3_CREATOR) - .createdBy(QUERY_3_CREATED_BY) + .owner(USER_1_BRIEF_DTO) .queryHash(QUERY_3_QUERY_HASH) .execution(QUERY_3_EXECUTION) .isPersisted(QUERY_3_PERSISTED) @@ -2599,20 +2631,16 @@ public abstract class BaseTest { public final static Long QUERY_4_RESULT_NUMBER = 6L; public final static Long QUERY_4_RESULT_ID = 4L; public final static Boolean QUERY_4_PERSISTED = false; - public final static UserDto QUERY_4_CREATOR = USER_1_DTO; - public final static UUID QUERY_4_CREATED_BY = USER_1_ID; public final static QueryDto QUERY_4 = QueryDto.builder() .id(QUERY_4_ID) .query(QUERY_4_STATEMENT) .queryHash(QUERY_4_QUERY_HASH) .resultHash(QUERY_4_RESULT_HASH) - .created(QUERY_4_CREATED) .execution(QUERY_4_EXECUTION) .isPersisted(QUERY_4_PERSISTED) .resultNumber(QUERY_4_RESULT_NUMBER) - .creator(QUERY_4_CREATOR) - .createdBy(QUERY_4_CREATED_BY) + .owner(USER_3_BRIEF_DTO) .isPersisted(QUERY_4_PERSISTED) .build(); @@ -2649,12 +2677,10 @@ public abstract class BaseTest { .queryNormalized(QUERY_4_STATEMENT) .resultNumber(QUERY_4_RESULT_NUMBER) .resultHash(QUERY_4_RESULT_HASH) - .lastModified(QUERY_4_LAST_MODIFIED) - .created(QUERY_4_CREATED) - .createdBy(USER_1_ID) .queryHash(QUERY_4_QUERY_HASH) .execution(QUERY_4_EXECUTION) .isPersisted(QUERY_4_PERSISTED) + .owner(USER_1_BRIEF_DTO) .build(); public final static Long QUERY_5_ID = 5L; @@ -2668,8 +2694,6 @@ public abstract class BaseTest { public final static Instant QUERY_5_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L); public final static Long QUERY_5_RESULT_NUMBER = 6L; public final static Boolean QUERY_5_PERSISTED = true; - public final static UserDto QUERY_5_CREATOR = USER_1_DTO; - public final static UUID QUERY_5_CREATED_BY = USER_1_ID; public final static QueryDto QUERY_5_DTO = QueryDto.builder() .id(QUERY_5_ID) @@ -2678,13 +2702,10 @@ public abstract class BaseTest { .queryNormalized(QUERY_5_STATEMENT) .resultNumber(QUERY_5_RESULT_NUMBER) .resultHash(QUERY_5_RESULT_HASH) - .lastModified(QUERY_5_LAST_MODIFIED) - .created(QUERY_5_CREATED) .queryHash(QUERY_5_QUERY_HASH) .execution(QUERY_5_EXECUTION) .isPersisted(QUERY_5_PERSISTED) - .creator(QUERY_5_CREATOR) - .createdBy(QUERY_5_CREATED_BY) + .owner(USER_1_BRIEF_DTO) .build(); public final static QueryResultDto QUERY_5_RESULT_DTO = QueryResultDto.builder() @@ -2711,8 +2732,6 @@ public abstract class BaseTest { public final static Instant QUERY_6_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L); public final static Long QUERY_6_RESULT_NUMBER = 1L; public final static Boolean QUERY_6_PERSISTED = true; - public final static UserDto QUERY_6_CREATOR = USER_1_DTO; - public final static UUID QUERY_6_CREATED_BY = USER_1_ID; public final static QueryDto QUERY_6_DTO = QueryDto.builder() .id(QUERY_6_ID) @@ -2721,10 +2740,7 @@ public abstract class BaseTest { .queryNormalized(QUERY_6_STATEMENT) .resultNumber(QUERY_6_RESULT_NUMBER) .resultHash(QUERY_6_RESULT_HASH) - .lastModified(QUERY_6_LAST_MODIFIED) - .created(QUERY_6_CREATED) - .creator(QUERY_6_CREATOR) - .createdBy(QUERY_6_CREATED_BY) + .owner(USER_1_BRIEF_DTO) .queryHash(QUERY_6_QUERY_HASH) .execution(QUERY_6_EXECUTION) .isPersisted(QUERY_6_PERSISTED) @@ -4672,6 +4688,7 @@ public abstract class BaseTest { public final static Long VIEW_1_CONTAINER_ID = CONTAINER_1_ID; public final static Long VIEW_1_DATABASE_ID = DATABASE_1_ID; public final static Boolean VIEW_1_PUBLIC = true; + public final static Boolean VIEW_1_SCHEMA_PUBLIC = true; public final static String VIEW_1_QUERY = "select `location`, `lat`, `lng` from `weather_location`"; public final static String VIEW_1_QUERY_HASH = "dc81a6877c7c51a6a6f406e1fc2a255e44a0d49a20548596e0d583c3eb849c23"; @@ -4714,9 +4731,11 @@ public abstract class BaseTest { .internalName(VIEW_1_INTERNAL_NAME) .vdbid(VIEW_1_DATABASE_ID) .isPublic(VIEW_1_PUBLIC) + .isSchemaPublic(VIEW_1_SCHEMA_PUBLIC) .query(VIEW_1_QUERY) .queryHash(VIEW_1_QUERY_HASH) - .createdBy(USER_1_ID) + .ownedBy(USER_1_ID) + .owner(USER_1) .columns(null) /* VIEW_1_COLUMNS */ .build(); @@ -4791,7 +4810,8 @@ public abstract class BaseTest { .internalName(VIEW_1_INTERNAL_NAME) .vdbid(VIEW_1_DATABASE_ID) .isPublic(VIEW_1_PUBLIC) - .createdBy(USER_1_ID) + .isSchemaPublic(VIEW_1_SCHEMA_PUBLIC) + .owner(USER_1_BRIEF_DTO) .query(VIEW_1_QUERY) .queryHash(VIEW_1_QUERY_HASH) .columns(VIEW_1_COLUMNS_DTO) @@ -4806,7 +4826,7 @@ public abstract class BaseTest { .internalName(VIEW_1_INTERNAL_NAME) .vdbid(VIEW_1_DATABASE_ID) .isPublic(VIEW_1_PUBLIC) - .createdBy(USER_1_ID) + .owner(USER_1_BRIEF_DTO) .query(VIEW_1_QUERY) .queryHash(VIEW_1_QUERY_HASH) .columns(VIEW_1_COLUMNS_DTO) @@ -4819,7 +4839,8 @@ public abstract class BaseTest { .internalName(VIEW_1_INTERNAL_NAME) .vdbid(VIEW_1_DATABASE_ID) .isPublic(VIEW_1_PUBLIC) - .createdBy(USER_1_ID) + .isSchemaPublic(VIEW_1_SCHEMA_PUBLIC) + .ownedBy(USER_1_ID) .query(VIEW_1_QUERY) .queryHash(VIEW_1_QUERY_HASH) .build(); @@ -4837,6 +4858,7 @@ public abstract class BaseTest { public final static Long VIEW_2_CONTAINER_ID = CONTAINER_1_ID; public final static Long VIEW_2_DATABASE_ID = DATABASE_1_ID; public final static Boolean VIEW_2_PUBLIC = true; + public final static Boolean VIEW_2_SCHEMA_PUBLIC = true; public final static String VIEW_2_QUERY = "select `date`, `location` as loc, `mintemp`, `rainfall` from `weather_aus` where `location` = 'Albury'"; public final static String VIEW_2_QUERY_HASH = "987fc946772ffb6d85060262dcb5df419692a1f6772ea995e3dedb53c191e984"; @@ -4887,10 +4909,12 @@ public abstract class BaseTest { .internalName(VIEW_2_INTERNAL_NAME) .vdbid(VIEW_2_DATABASE_ID) .isPublic(VIEW_2_PUBLIC) + .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC) .columns(null) /* VIEW_2_COLUMNS */ .query(VIEW_2_QUERY) .queryHash(VIEW_2_QUERY_HASH) - .createdBy(USER_1_ID) + .ownedBy(USER_1_ID) + .owner(USER_1) .build(); public final static List<ViewColumn> VIEW_2_COLUMNS = List.of( @@ -4944,10 +4968,11 @@ public abstract class BaseTest { .internalName(VIEW_2_INTERNAL_NAME) .vdbid(VIEW_2_DATABASE_ID) .isPublic(VIEW_2_PUBLIC) + .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC) .columns(VIEW_2_COLUMNS_DTO) .query(VIEW_2_QUERY) .queryHash(VIEW_2_QUERY_HASH) - .createdBy(USER_1_ID) + .owner(USER_1_BRIEF_DTO) .build(); public final static PrivilegedViewDto VIEW_2_PRIVILEGED_DTO = PrivilegedViewDto.builder() @@ -4958,7 +4983,8 @@ public abstract class BaseTest { .internalName(VIEW_2_INTERNAL_NAME) .vdbid(VIEW_2_DATABASE_ID) .isPublic(VIEW_2_PUBLIC) - .createdBy(USER_2_ID) + .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC) + .owner(USER_2_BRIEF_DTO) .query(VIEW_2_QUERY) .queryHash(VIEW_2_QUERY_HASH) .columns(VIEW_2_COLUMNS_DTO) @@ -4971,9 +4997,10 @@ public abstract class BaseTest { .internalName(VIEW_2_INTERNAL_NAME) .vdbid(VIEW_2_DATABASE_ID) .isPublic(VIEW_2_PUBLIC) + .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC) .query(VIEW_2_QUERY) .queryHash(VIEW_2_QUERY_HASH) - .createdBy(USER_1_ID) + .ownedBy(USER_1_ID) .build(); public final static Long VIEW_3_ID = 3L; @@ -4983,6 +5010,7 @@ public abstract class BaseTest { public final static Long VIEW_3_CONTAINER_ID = CONTAINER_1_ID; public final static Long VIEW_3_DATABASE_ID = DATABASE_1_ID; public final static Boolean VIEW_3_PUBLIC = false; + public final static Boolean VIEW_3_SCHEMA_PUBLIC = false; public final static String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`"; public final static String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255"; @@ -5037,10 +5065,12 @@ public abstract class BaseTest { .internalName(VIEW_3_INTERNAL_NAME) .vdbid(VIEW_3_DATABASE_ID) .isPublic(VIEW_3_PUBLIC) + .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC) .columns(null) /* VIEW_3_COLUMNS */ .query(VIEW_3_QUERY) .queryHash(VIEW_3_QUERY_HASH) - .createdBy(USER_1_ID) + .ownedBy(USER_1_ID) + .owner(USER_1) .build(); public final static PrivilegedViewDto VIEW_3_PRIVILEGED_DTO = PrivilegedViewDto.builder() @@ -5051,7 +5081,8 @@ public abstract class BaseTest { .internalName(VIEW_3_INTERNAL_NAME) .vdbid(VIEW_3_DATABASE_ID) .isPublic(VIEW_3_PUBLIC) - .createdBy(USER_1_ID) + .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC) + .owner(USER_1_BRIEF_DTO) .query(VIEW_3_QUERY) .queryHash(VIEW_3_QUERY_HASH) .columns(VIEW_3_COLUMNS_DTO) @@ -5108,10 +5139,11 @@ public abstract class BaseTest { .internalName(VIEW_3_INTERNAL_NAME) .vdbid(VIEW_3_DATABASE_ID) .isPublic(VIEW_3_PUBLIC) + .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC) .columns(VIEW_3_COLUMNS_DTO) .query(VIEW_3_QUERY) .queryHash(VIEW_3_QUERY_HASH) - .createdBy(USER_1_ID) + .owner(USER_1_BRIEF_DTO) .build(); public final static ViewBriefDto VIEW_3_BRIEF_DTO = ViewBriefDto.builder() @@ -5121,9 +5153,10 @@ public abstract class BaseTest { .internalName(VIEW_3_INTERNAL_NAME) .vdbid(VIEW_3_DATABASE_ID) .isPublic(VIEW_3_PUBLIC) + .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC) .query(VIEW_3_QUERY) .queryHash(VIEW_3_QUERY_HASH) - .createdBy(USER_1_ID) + .ownedBy(USER_1_ID) .build(); public final static Long VIEW_4_ID = 4L; @@ -5135,6 +5168,7 @@ public abstract class BaseTest { public final static Long VIEW_4_TABLE_ID = TABLE_5_ID; public final static Table VIEW_4_TABLE = TABLE_5; public final static Boolean VIEW_4_PUBLIC = true; + public final static Boolean VIEW_4_SCHEMA_PUBLIC = true; public final static String VIEW_4_QUERY = "SELECT `animal_name`, `hair`, `feathers`, `eggs`, `milk`, `airborne`, `aquatic`, `predator`, `backbone`, `breathes`, `venomous`, `fins`, `legs`, `tail`, `domestic`, `catsize`, `class_type` FROM `zoo` WHERE `class_type` = 1"; public final static String VIEW_4_QUERY_HASH = "3561cd0bb0b0e94d6f15ae602134252a5760d09d660a71a4fb015b6991c8ba0b"; @@ -5283,9 +5317,11 @@ public abstract class BaseTest { .internalName(VIEW_4_INTERNAL_NAME) .vdbid(VIEW_4_DATABASE_ID) .isPublic(VIEW_4_PUBLIC) + .isSchemaPublic(VIEW_4_SCHEMA_PUBLIC) .query(VIEW_4_QUERY) .queryHash(VIEW_4_QUERY_HASH) - .createdBy(USER_1_ID) + .ownedBy(USER_1_ID) + .owner(USER_1) .columns(null) /* VIEW_4_COLUMNS */ .build(); @@ -5296,12 +5332,26 @@ public abstract class BaseTest { .internalName(VIEW_4_INTERNAL_NAME) .vdbid(VIEW_4_DATABASE_ID) .isPublic(VIEW_4_PUBLIC) + .isSchemaPublic(VIEW_4_SCHEMA_PUBLIC) .query(VIEW_4_QUERY) .queryHash(VIEW_4_QUERY_HASH) - .createdBy(USER_1_ID) + .owner(USER_1_BRIEF_DTO) .columns(VIEW_4_COLUMNS_DTO) .build(); + public final static ViewBriefDto VIEW_4_BRIEF_DTO = ViewBriefDto.builder() + .id(VIEW_4_ID) + .isInitialView(VIEW_4_INITIAL_VIEW) + .name(VIEW_4_NAME) + .internalName(VIEW_4_INTERNAL_NAME) + .vdbid(VIEW_4_DATABASE_ID) + .isPublic(VIEW_4_PUBLIC) + .isSchemaPublic(VIEW_4_SCHEMA_PUBLIC) + .query(VIEW_4_QUERY) + .queryHash(VIEW_4_QUERY_HASH) + .ownedBy(USER_1_ID) + .build(); + public final static List<ViewColumn> VIEW_4_COLUMNS = List.of( ViewColumn.builder() .id(12L) @@ -5464,6 +5514,7 @@ public abstract class BaseTest { public final static Long VIEW_5_CONTAINER_ID = CONTAINER_2_ID; public final static Long VIEW_5_DATABASE_ID = DATABASE_3_ID; public final static Boolean VIEW_5_PUBLIC = true; + public final static Boolean VIEW_5_SCHEMA_PUBLIC = true; public final static String VIEW_5_QUERY = "SELECT `location`, `lat`, `lng` FROM `weather_location` WHERE `location` = 'Albury'"; public final static String VIEW_5_QUERY_HASH = "120f32478aaff874c25ab32eceb9f00b64cc9d422831046f2f5d43953aca01e7"; @@ -5474,9 +5525,11 @@ public abstract class BaseTest { .internalName(VIEW_5_INTERNAL_NAME) .vdbid(VIEW_5_DATABASE_ID) .isPublic(VIEW_5_PUBLIC) + .isSchemaPublic(VIEW_5_SCHEMA_PUBLIC) .query(VIEW_5_QUERY) .queryHash(VIEW_5_QUERY_HASH) - .createdBy(USER_1_ID) + .ownedBy(USER_1_ID) + .owner(USER_1) .columns(null) .build(); @@ -5487,12 +5540,25 @@ public abstract class BaseTest { .internalName(VIEW_5_INTERNAL_NAME) .vdbid(VIEW_5_DATABASE_ID) .isPublic(VIEW_5_PUBLIC) + .isSchemaPublic(VIEW_5_SCHEMA_PUBLIC) .query(VIEW_5_QUERY) .queryHash(VIEW_5_QUERY_HASH) - .createdBy(USER_1_ID) + .owner(USER_1_BRIEF_DTO) .columns(null) .build(); + public final static ViewBriefDto VIEW_5_BRIEF_DTO = ViewBriefDto.builder() + .id(VIEW_5_ID) + .isInitialView(VIEW_5_INITIAL_VIEW) + .name(VIEW_5_NAME) + .internalName(VIEW_5_INTERNAL_NAME) + .vdbid(VIEW_5_DATABASE_ID) + .isPublic(VIEW_5_PUBLIC) + .isSchemaPublic(VIEW_5_SCHEMA_PUBLIC) + .query(VIEW_5_QUERY) + .queryHash(VIEW_5_QUERY_HASH) + .build(); + public final static List<ViewColumn> VIEW_5_COLUMNS = List.of( ViewColumn.builder() .id(29L) @@ -5644,8 +5710,7 @@ public abstract class BaseTest { public final static Long IDENTIFIER_1_QUERY_ID = null; public final static Long IDENTIFIER_1_CONTAINER_ID = CONTAINER_1_ID; public final static Long IDENTIFIER_1_DATABASE_ID = DATABASE_1_ID; - public final static String IDENTIFIER_1_DOI = null; - public final static String IDENTIFIER_1_DOI_NOT_NULL = "10.12345/183"; + public final static String IDENTIFIER_1_DOI = "10.12345/183"; public final static Instant IDENTIFIER_1_CREATED = Instant.ofEpochSecond(1641588352L) /* 2022-01-07 20:45:52 */; public final static Instant IDENTIFIER_1_MODIFIED = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */; public final static Instant IDENTIFIER_1_EXECUTION = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */; @@ -5660,7 +5725,6 @@ public abstract class BaseTest { public final static String IDENTIFIER_1_PUBLISHER = "Austrian Government"; public final static IdentifierType IDENTIFIER_1_TYPE = IdentifierType.DATABASE; public final static IdentifierTypeDto IDENTIFIER_1_TYPE_DTO = IdentifierTypeDto.DATABASE; - public final static UUID IDENTIFIER_1_CREATED_BY = USER_1_ID; public final static IdentifierStatusType IDENTIFIER_1_STATUS_TYPE = IdentifierStatusType.PUBLISHED; public final static IdentifierStatusTypeDto IDENTIFIER_1_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED; @@ -5871,7 +5935,7 @@ public abstract class BaseTest { .data(DataCiteData.<DataCiteDoi>builder() .type("dois") .attributes(DataCiteDoi.builder() - .doi(IDENTIFIER_1_DOI_NOT_NULL) + .doi(IDENTIFIER_1_DOI) .build()) .build()) .build(); @@ -5895,8 +5959,8 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_1_RESULT_NUMBER) .publisher(IDENTIFIER_1_PUBLISHER) .type(IDENTIFIER_1_TYPE) - .createdBy(USER_1_ID) - .creator(USER_1) + .owner(USER_1) + .ownedBy(USER_1_ID) .licenses(new LinkedList<>(List.of(LICENSE_1))) .creators(new LinkedList<>(List.of(IDENTIFIER_1_CREATOR_1))) .funders(new LinkedList<>(List.of(IDENTIFIER_1_FUNDER_1))) @@ -5908,7 +5972,7 @@ public abstract class BaseTest { .queryId(IDENTIFIER_1_QUERY_ID) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1)) .titles(List.of(IDENTIFIER_1_TITLE_1, IDENTIFIER_1_TITLE_2)) - .doi(IDENTIFIER_1_DOI_NOT_NULL) + .doi(IDENTIFIER_1_DOI) .database(null /* for jpa */) .created(IDENTIFIER_1_CREATED) .lastModified(IDENTIFIER_1_MODIFIED) @@ -5922,7 +5986,7 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_1_RESULT_NUMBER) .publisher(IDENTIFIER_1_PUBLISHER) .type(IDENTIFIER_1_TYPE) - .createdBy(USER_1_ID) + .owner(USER_1) .licenses(List.of(LICENSE_1)) .creators(List.of(IDENTIFIER_1_CREATOR_1)) .funders(List.of(IDENTIFIER_1_FUNDER_1)) @@ -5936,8 +6000,6 @@ public abstract class BaseTest { .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_DTO, IDENTIFIER_1_TITLE_2_DTO)) .doi(IDENTIFIER_1_DOI) - .created(IDENTIFIER_1_CREATED) - .lastModified(IDENTIFIER_1_MODIFIED) .execution(IDENTIFIER_1_EXECUTION) .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) @@ -5948,53 +6010,22 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_1_RESULT_NUMBER) .publisher(IDENTIFIER_1_PUBLISHER) .type(IDENTIFIER_1_TYPE_DTO) - .creator(USER_1_DTO) + .owner(USER_1_DTO) .licenses(List.of(LICENSE_1_DTO)) .creators(List.of(IDENTIFIER_1_CREATOR_1_DTO)) .funders(List.of(IDENTIFIER_1_FUNDER_1_DTO)) .status(IDENTIFIER_1_STATUS_TYPE_DTO) .build(); - public final static IdentifierDto IDENTIFIER_1_WITH_DOI_DTO = IdentifierDto.builder() + public final static IdentifierBriefDto IDENTIFIER_1_BRIEF_DTO = IdentifierBriefDto.builder() .id(IDENTIFIER_1_ID) .databaseId(DATABASE_1_ID) .queryId(IDENTIFIER_1_QUERY_ID) - .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_DTO)) .titles(List.of(IDENTIFIER_1_TITLE_1_DTO, IDENTIFIER_1_TITLE_2_DTO)) - .doi(IDENTIFIER_1_DOI_NOT_NULL) - .created(IDENTIFIER_1_CREATED) - .lastModified(IDENTIFIER_1_MODIFIED) - .execution(IDENTIFIER_1_EXECUTION) - .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) - .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) - .queryHash(IDENTIFIER_1_QUERY_HASH) - .resultHash(IDENTIFIER_1_RESULT_HASH) - .query(IDENTIFIER_1_QUERY) - .queryNormalized(IDENTIFIER_1_NORMALIZED) - .resultNumber(IDENTIFIER_1_RESULT_NUMBER) - .publisher(IDENTIFIER_1_PUBLISHER) - .type(IDENTIFIER_1_TYPE_DTO) - .creator(USER_1_DTO) - .licenses(List.of(LICENSE_1_DTO)) - .creators(List.of(IDENTIFIER_1_CREATOR_1_DTO)) - .funders(List.of(IDENTIFIER_1_FUNDER_1_DTO)) - .status(IDENTIFIER_1_STATUS_TYPE_DTO) - .build(); - - public final static IdentifierDto IDENTIFIER_1_MODIFY_DTO = IdentifierDto.builder() - .id(IDENTIFIER_1_ID) - .databaseId(DATABASE_2_ID) - .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_DTO_MODIFY)) - .titles(List.of(IDENTIFIER_1_TITLE_1_DTO_MODIFY, IDENTIFIER_1_TITLE_2_DTO)) .doi(IDENTIFIER_1_DOI) - .publisher(IDENTIFIER_1_PUBLISHER) .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) - .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) + .publisher(IDENTIFIER_1_PUBLISHER) .type(IDENTIFIER_1_TYPE_DTO) - .created(IDENTIFIER_1_CREATED) - .lastModified(IDENTIFIER_1_MODIFIED) - .licenses(List.of(LICENSE_1_DTO)) - .creators(List.of(IDENTIFIER_1_CREATOR_1_DTO)) .status(IDENTIFIER_1_STATUS_TYPE_DTO) .build(); @@ -6018,7 +6049,7 @@ public abstract class BaseTest { public final static IdentifierCreateDto IDENTIFIER_1_CREATE_WITH_DOI_DTO = IdentifierCreateDto.builder() .databaseId(IDENTIFIER_1_DATABASE_ID) .type(IDENTIFIER_1_TYPE_DTO) - .doi(IDENTIFIER_1_DOI_NOT_NULL) + .doi(IDENTIFIER_1_DOI) .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) .publisher(IDENTIFIER_1_PUBLISHER) .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) @@ -6244,8 +6275,8 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_5_RESULT_NUMBER) .publisher(IDENTIFIER_5_PUBLISHER) .type(IDENTIFIER_5_TYPE) - .createdBy(USER_2_ID) - .creator(USER_2) + .owner(USER_2) + .ownedBy(USER_2_ID) .creators(new LinkedList<>(List.of(IDENTIFIER_5_CREATOR_1, IDENTIFIER_5_CREATOR_2))) .status(IDENTIFIER_5_STATUS_TYPE) .build(); @@ -6257,8 +6288,6 @@ public abstract class BaseTest { .descriptions(List.of(IDENTIFIER_5_DESCRIPTION_1_DTO)) .titles(List.of(IDENTIFIER_5_TITLE_1_DTO)) .doi(IDENTIFIER_5_DOI) - .created(IDENTIFIER_5_CREATED) - .lastModified(IDENTIFIER_5_MODIFIED) .execution(IDENTIFIER_5_EXECUTION) .publicationDay(IDENTIFIER_5_PUBLICATION_DAY) .publicationMonth(IDENTIFIER_5_PUBLICATION_MONTH) @@ -6270,10 +6299,21 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_5_RESULT_NUMBER) .publisher(IDENTIFIER_5_PUBLISHER) .type(IDENTIFIER_5_TYPE_DTO) - .creator(USER_2_DTO) + .owner(USER_2_DTO) .creators(List.of(IDENTIFIER_5_CREATOR_1_DTO, IDENTIFIER_5_CREATOR_2_DTO)) .build(); + public final static IdentifierBriefDto IDENTIFIER_5_BRIEF_DTO = IdentifierBriefDto.builder() + .id(IDENTIFIER_5_ID) + .databaseId(DATABASE_2_ID) + .queryId(IDENTIFIER_5_QUERY_ID) + .titles(List.of(IDENTIFIER_5_TITLE_1_DTO)) + .doi(IDENTIFIER_5_DOI) + .publicationYear(IDENTIFIER_5_PUBLICATION_YEAR) + .publisher(IDENTIFIER_5_PUBLISHER) + .type(IDENTIFIER_5_TYPE_DTO) + .build(); + public final static Long RELATED_IDENTIFIER_5_ID = 1L; public final static Long RELATED_IDENTIFIER_5_IDENTIFIER_ID = 2L; public final static String RELATED_IDENTIFIER_5_VALUE = "10.5281/zenodo.6637333"; @@ -6514,8 +6554,8 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_6_RESULT_NUMBER) .publisher(IDENTIFIER_6_PUBLISHER) .type(IDENTIFIER_6_TYPE) - .createdBy(USER_3_ID) - .creator(USER_3) + .owner(USER_3) + .ownedBy(USER_3_ID) .licenses(new LinkedList<>(List.of(LICENSE_1))) .creators(new LinkedList<>(List.of(IDENTIFIER_6_CREATOR_1, IDENTIFIER_6_CREATOR_2, IDENTIFIER_6_CREATOR_3))) .status(IDENTIFIER_6_STATUS_TYPE) @@ -6528,8 +6568,6 @@ public abstract class BaseTest { .descriptions(List.of(IDENTIFIER_6_DESCRIPTION_1_DTO)) .titles(List.of(IDENTIFIER_6_TITLE_1_DTO)) .doi(IDENTIFIER_6_DOI) - .created(IDENTIFIER_6_CREATED) - .lastModified(IDENTIFIER_6_MODIFIED) .execution(IDENTIFIER_6_EXECUTION) .publicationDay(IDENTIFIER_6_PUBLICATION_DAY) .publicationMonth(IDENTIFIER_6_PUBLICATION_MONTH) @@ -6541,12 +6579,25 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_6_RESULT_NUMBER) .publisher(IDENTIFIER_6_PUBLISHER) .type(IDENTIFIER_6_TYPE_DTO) - .creator(USER_3_DTO) + .owner(USER_3_DTO) .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .creators(new LinkedList<>(List.of(IDENTIFIER_6_CREATOR_1_DTO, IDENTIFIER_6_CREATOR_2_DTO, IDENTIFIER_6_CREATOR_3_DTO))) .status(IDENTIFIER_6_STATUS_TYPE_DTO) .build(); + + public final static IdentifierBriefDto IDENTIFIER_6_BRIEF_DTO = IdentifierBriefDto.builder() + .id(IDENTIFIER_6_ID) + .databaseId(DATABASE_3_ID) + .queryId(IDENTIFIER_6_QUERY_ID) + .titles(List.of(IDENTIFIER_6_TITLE_1_DTO)) + .doi(IDENTIFIER_6_DOI) + .publicationYear(IDENTIFIER_6_PUBLICATION_YEAR) + .publisher(IDENTIFIER_6_PUBLISHER) + .type(IDENTIFIER_6_TYPE_DTO) + .status(IDENTIFIER_6_STATUS_TYPE_DTO) + .build(); + public final static IdentifierCreateDto IDENTIFIER_6_CREATE_DTO = IdentifierCreateDto.builder() .databaseId(IDENTIFIER_6_DATABASE_ID) .publicationYear(IDENTIFIER_6_PUBLICATION_YEAR) @@ -6627,8 +6678,6 @@ public abstract class BaseTest { .descriptions(new LinkedList<>()) .titles(new LinkedList<>()) .doi(IDENTIFIER_7_DOI) - .created(IDENTIFIER_7_CREATED) - .lastModified(IDENTIFIER_7_MODIFIED) .execution(IDENTIFIER_7_EXECUTION) .publicationDay(IDENTIFIER_7_PUBLICATION_DAY) .publicationMonth(IDENTIFIER_7_PUBLICATION_MONTH) @@ -6636,7 +6685,7 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_7_RESULT_NUMBER) .publisher(IDENTIFIER_7_PUBLISHER) .type(IDENTIFIER_7_TYPE_DTO) - .creator(USER_4_DTO) + .owner(USER_4_DTO) .licenses(new LinkedList<>()) .funders(new LinkedList<>()) .creators(new LinkedList<>()) @@ -6724,8 +6773,8 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_2_RESULT_NUMBER) .publisher(IDENTIFIER_2_PUBLISHER) .type(IDENTIFIER_2_TYPE) - .createdBy(USER_1_ID) - .creator(USER_1) + .owner(USER_1) + .ownedBy(USER_1_ID) .licenses(new LinkedList<>(List.of(LICENSE_1))) .creators(new LinkedList<>()) .status(IDENTIFIER_2_STATUS_TYPE) @@ -6738,8 +6787,6 @@ public abstract class BaseTest { .descriptions(new LinkedList<>()) .titles(new LinkedList<>()) .doi(IDENTIFIER_2_DOI) - .created(IDENTIFIER_2_CREATED) - .lastModified(IDENTIFIER_2_MODIFIED) .execution(IDENTIFIER_2_EXECUTION) .publicationDay(IDENTIFIER_2_PUBLICATION_DAY) .publicationMonth(IDENTIFIER_2_PUBLICATION_MONTH) @@ -6751,12 +6798,24 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_2_RESULT_NUMBER) .publisher(IDENTIFIER_2_PUBLISHER) .type(IDENTIFIER_2_TYPE_DTO) - .creator(USER_1_DTO) + .owner(USER_1_DTO) .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .creators(new LinkedList<>()) .status(IDENTIFIER_2_STATUS_TYPE_DTO) .build(); + public final static IdentifierBriefDto IDENTIFIER_2_BRIEF_DTO = IdentifierBriefDto.builder() + .id(IDENTIFIER_2_ID) + .queryId(IDENTIFIER_2_QUERY_ID) + .databaseId(IDENTIFIER_2_DATABASE_ID) + .titles(new LinkedList<>()) + .doi(IDENTIFIER_2_DOI) + .publicationYear(IDENTIFIER_2_PUBLICATION_YEAR) + .publisher(IDENTIFIER_2_PUBLISHER) + .type(IDENTIFIER_2_TYPE_DTO) + .status(IDENTIFIER_2_STATUS_TYPE_DTO) + .build(); + public final static IdentifierSaveDto IDENTIFIER_2_SAVE_DTO = IdentifierSaveDto.builder() .id(IDENTIFIER_2_ID) .databaseId(IDENTIFIER_2_DATABASE_ID) @@ -6815,8 +6874,8 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_3_RESULT_NUMBER) .publisher(IDENTIFIER_3_PUBLISHER) .type(IDENTIFIER_3_TYPE) - .createdBy(USER_1_ID) - .creator(USER_1) + .owner(USER_1) + .ownedBy(USER_1_ID) .licenses(new LinkedList<>(List.of(LICENSE_1))) .creators(new LinkedList<>()) .status(IDENTIFIER_3_STATUS_TYPE) @@ -6829,8 +6888,6 @@ public abstract class BaseTest { .descriptions(new LinkedList<>()) .titles(new LinkedList<>()) .doi(IDENTIFIER_3_DOI) - .created(IDENTIFIER_3_CREATED) - .lastModified(IDENTIFIER_3_MODIFIED) .execution(IDENTIFIER_3_EXECUTION) .publicationDay(IDENTIFIER_3_PUBLICATION_DAY) .publicationMonth(IDENTIFIER_3_PUBLICATION_MONTH) @@ -6842,12 +6899,24 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_3_RESULT_NUMBER) .publisher(IDENTIFIER_3_PUBLISHER) .type(IDENTIFIER_3_TYPE_DTO) - .creator(USER_1_DTO) + .owner(USER_1_DTO) .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .creators(new LinkedList<>()) .status(IDENTIFIER_3_STATUS_TYPE_DTO) .build(); + public final static IdentifierBriefDto IDENTIFIER_3_BRIEF_DTO = IdentifierBriefDto.builder() + .id(IDENTIFIER_3_ID) + .databaseId(IDENTIFIER_3_DATABASE_ID) + .viewId(IDENTIFIER_3_VIEW_ID) + .titles(new LinkedList<>()) + .doi(IDENTIFIER_3_DOI) + .publicationYear(IDENTIFIER_3_PUBLICATION_YEAR) + .publisher(IDENTIFIER_3_PUBLISHER) + .type(IDENTIFIER_3_TYPE_DTO) + .status(IDENTIFIER_3_STATUS_TYPE_DTO) + .build(); + public final static IdentifierCreateDto IDENTIFIER_3_CREATE_DTO = IdentifierCreateDto.builder() .databaseId(IDENTIFIER_3_DATABASE_ID) .viewId(IDENTIFIER_3_VIEW_ID) @@ -6907,8 +6976,8 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_4_RESULT_NUMBER) .publisher(IDENTIFIER_4_PUBLISHER) .type(IDENTIFIER_4_TYPE) - .createdBy(USER_1_ID) - .creator(USER_1) + .owner(USER_1) + .ownedBy(USER_1_ID) .licenses(new LinkedList<>(List.of(LICENSE_1))) .creators(new LinkedList<>()) .status(IDENTIFIER_4_STATUS_TYPE) @@ -6921,8 +6990,6 @@ public abstract class BaseTest { .descriptions(new LinkedList<>()) .titles(new LinkedList<>()) .doi(IDENTIFIER_4_DOI) - .created(IDENTIFIER_4_CREATED) - .lastModified(IDENTIFIER_4_MODIFIED) .execution(IDENTIFIER_4_EXECUTION) .publicationDay(IDENTIFIER_4_PUBLICATION_DAY) .publicationMonth(IDENTIFIER_4_PUBLICATION_MONTH) @@ -6931,12 +6998,24 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_4_RESULT_NUMBER) .publisher(IDENTIFIER_4_PUBLISHER) .type(IDENTIFIER_4_TYPE_DTO) - .creator(USER_1_DTO) + .owner(USER_1_DTO) .licenses(new LinkedList<>(List.of(LICENSE_1_DTO))) .creators(new LinkedList<>()) .status(IDENTIFIER_4_STATUS_TYPE_DTO) .build(); + public final static IdentifierBriefDto IDENTIFIER_4_BRIEF_DTO = IdentifierBriefDto.builder() + .id(IDENTIFIER_4_ID) + .databaseId(IDENTIFIER_4_DATABASE_ID) + .tableId(IDENTIFIER_4_TABLE_ID) + .titles(new LinkedList<>()) + .doi(IDENTIFIER_4_DOI) + .publicationYear(IDENTIFIER_4_PUBLICATION_YEAR) + .publisher(IDENTIFIER_4_PUBLISHER) + .type(IDENTIFIER_4_TYPE_DTO) + .status(IDENTIFIER_4_STATUS_TYPE_DTO) + .build(); + public final static IdentifierCreateDto IDENTIFIER_4_CREATE_DTO = IdentifierCreateDto.builder() .databaseId(IDENTIFIER_4_DATABASE_ID) .publicationYear(IDENTIFIER_4_PUBLICATION_YEAR) @@ -7036,6 +7115,7 @@ public abstract class BaseTest { .created(Instant.now().minus(1, HOURS)) .lastModified(Instant.now()) .isPublic(DATABASE_1_PUBLIC) + .isSchemaPublic(DATABASE_1_SCHEMA_PUBLIC) .name(DATABASE_1_NAME) .description(DATABASE_1_DESCRIPTION) .identifiers(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4)) @@ -7045,8 +7125,8 @@ public abstract class BaseTest { .exchangeName(DATABASE_1_EXCHANGE) .created(DATABASE_1_CREATED) .lastModified(DATABASE_1_LAST_MODIFIED) - .createdBy(DATABASE_1_CREATED_BY) - .creator(USER_1) + .ownedBy(DATABASE_1_CREATED_BY) + .owner(USER_1) .ownedBy(DATABASE_1_OWNER) .owner(USER_1) .image(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) @@ -7061,20 +7141,18 @@ public abstract class BaseTest { public final static DatabaseDto DATABASE_1_DTO = DatabaseDto.builder() .id(DATABASE_1_ID) - .created(Instant.now().minus(1, HOURS)) .isPublic(DATABASE_1_PUBLIC) .name(DATABASE_1_NAME) - .container(CONTAINER_1_DTO) + .container(CONTAINER_1_BRIEF_DTO) .internalName(DATABASE_1_INTERNALNAME) .exchangeName(DATABASE_1_EXCHANGE) - .identifiers(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO)) - .tables(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO)) - .views(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)) + .identifiers(List.of(IDENTIFIER_1_BRIEF_DTO, IDENTIFIER_2_BRIEF_DTO, IDENTIFIER_3_BRIEF_DTO, IDENTIFIER_4_BRIEF_DTO)) + .tables(List.of(TABLE_1_BRIEF_DTO, TABLE_2_BRIEF_DTO, TABLE_3_BRIEF_DTO, TABLE_4_BRIEF_DTO)) + .views(List.of(VIEW_1_BRIEF_DTO, VIEW_2_BRIEF_DTO, VIEW_3_BRIEF_DTO)) .build(); public final static PrivilegedDatabaseDto DATABASE_1_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder() .id(DATABASE_1_ID) - .created(Instant.now().minus(1, HOURS)) .isPublic(DATABASE_1_PUBLIC) .name(DATABASE_1_NAME) .container(CONTAINER_1_PRIVILEGED_DTO) @@ -7083,9 +7161,7 @@ public abstract class BaseTest { .identifiers(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO)) .tables(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO)) .views(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)) - .created(DATABASE_1_CREATED) - .creator(DATABASE_1_CREATOR_DTO) - .owner(DATABASE_1_OWNER_DTO) + .owner(USER_1_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_1_USER_1_READ_ACCESS = DatabaseAccess.builder() @@ -7100,7 +7176,7 @@ public abstract class BaseTest { .type(AccessTypeDto.READ) .hdbid(DATABASE_1_ID) .huserid(USER_1_ID) - .user(USER_1_DTO) + .user(USER_1_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_1_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() @@ -7131,7 +7207,7 @@ public abstract class BaseTest { .type(AccessTypeDto.READ) .hdbid(DATABASE_1_ID) .huserid(USER_2_ID) - .user(USER_2_DTO) + .user(USER_2_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_1_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder() @@ -7146,7 +7222,7 @@ public abstract class BaseTest { .type(AccessTypeDto.WRITE_OWN) .hdbid(DATABASE_1_ID) .huserid(USER_2_ID) - .user(USER_2_DTO) + .user(USER_2_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_1_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder() @@ -7161,7 +7237,7 @@ public abstract class BaseTest { .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_1_ID) .huserid(USER_2_ID) - .user(USER_2_DTO) + .user(USER_2_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_1_USER_3_READ_ACCESS = DatabaseAccess.builder() @@ -7192,7 +7268,7 @@ public abstract class BaseTest { .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_1_ID) .huserid(USER_3_ID) - .user(USER_3_DTO) + .user(USER_3_BRIEF_DTO) .build(); public final static Database DATABASE_2 = Database.builder() @@ -7200,6 +7276,7 @@ public abstract class BaseTest { .created(DATABASE_2_CREATED) .lastModified(Instant.now()) .isPublic(DATABASE_2_PUBLIC) + .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC) .name(DATABASE_2_NAME) .description(DATABASE_2_DESCRIPTION) .cid(CONTAINER_1_ID) @@ -7208,8 +7285,6 @@ public abstract class BaseTest { .exchangeName(DATABASE_2_EXCHANGE) .created(DATABASE_2_CREATED) .lastModified(DATABASE_2_LAST_MODIFIED) - .createdBy(DATABASE_2_CREATOR) - .creator(USER_2) .ownedBy(DATABASE_2_OWNER) .owner(USER_2) .contactPerson(USER_2_ID) @@ -7222,7 +7297,6 @@ public abstract class BaseTest { public final static PrivilegedDatabaseDto DATABASE_2_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder() .id(DATABASE_2_ID) - .created(Instant.now().minus(1, HOURS)) .isPublic(DATABASE_2_PUBLIC) .name(DATABASE_2_NAME) .container(CONTAINER_1_PRIVILEGED_DTO) @@ -7231,23 +7305,21 @@ public abstract class BaseTest { .identifiers(List.of(IDENTIFIER_5_DTO)) .tables(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO)) .views(List.of(VIEW_4_DTO)) - .created(DATABASE_2_CREATED) - .creator(USER_2_DTO) - .owner(USER_2_DTO) + .owner(USER_2_BRIEF_DTO) .build(); public final static DatabaseDto DATABASE_2_DTO = DatabaseDto.builder() .id(DATABASE_2_ID) - .created(DATABASE_2_CREATED) .isPublic(DATABASE_2_PUBLIC) .name(DATABASE_2_NAME) - .container(CONTAINER_1_DTO) + .container(CONTAINER_1_BRIEF_DTO) .internalName(DATABASE_2_INTERNALNAME) .exchangeName(DATABASE_2_EXCHANGE) - .identifiers(List.of(IDENTIFIER_5_DTO)) - .tables(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO)) - .views(List.of(VIEW_4_DTO)) + .identifiers(List.of(IDENTIFIER_5_BRIEF_DTO)) + .tables(List.of(TABLE_5_BRIEF_DTO, TABLE_6_BRIEF_DTO, TABLE_7_BRIEF_DTO)) + .views(List.of(VIEW_4_BRIEF_DTO)) .identifiers(new LinkedList<>()) + .owner(USER_2_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_2_USER_1_READ_ACCESS = DatabaseAccess.builder() @@ -7302,7 +7374,7 @@ public abstract class BaseTest { .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_2_ID) .huserid(USER_2_ID) - .user(USER_2_DTO) + .user(USER_2_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_2_USER_3_READ_ACCESS = DatabaseAccess.builder() @@ -7317,7 +7389,7 @@ public abstract class BaseTest { .type(AccessTypeDto.READ) .hdbid(DATABASE_2_ID) .huserid(USER_3_ID) - .user(USER_3_DTO) + .user(USER_3_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_2_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() @@ -7341,6 +7413,7 @@ public abstract class BaseTest { .created(Instant.now().minus(1, HOURS)) .lastModified(Instant.now()) .isPublic(DATABASE_3_PUBLIC) + .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC) .name(DATABASE_3_NAME) .description(DATABASE_3_DESCRIPTION) .cid(CONTAINER_1_ID) @@ -7349,8 +7422,6 @@ public abstract class BaseTest { .exchangeName(DATABASE_3_EXCHANGE) .created(DATABASE_3_CREATED) .lastModified(DATABASE_3_LAST_MODIFIED) - .createdBy(DATABASE_3_CREATOR_ID) - .creator(USER_3) .ownedBy(DATABASE_3_OWNER) .owner(USER_3) .contactPerson(USER_3_ID) @@ -7373,7 +7444,7 @@ public abstract class BaseTest { .type(AccessTypeDto.READ) .hdbid(DATABASE_3_ID) .huserid(USER_1_ID) - .user(USER_1_DTO) + .user(USER_1_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_3_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() @@ -7388,7 +7459,7 @@ public abstract class BaseTest { .type(AccessTypeDto.WRITE_OWN) .hdbid(DATABASE_3_ID) .huserid(USER_1_ID) - .user(USER_1_DTO) + .user(USER_1_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_3_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder() @@ -7435,7 +7506,7 @@ public abstract class BaseTest { .type(AccessTypeDto.READ) .hdbid(DATABASE_3_ID) .huserid(USER_3_ID) - .user(USER_3_DTO) + .user(USER_3_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_3_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder() @@ -7450,7 +7521,7 @@ public abstract class BaseTest { .type(AccessTypeDto.WRITE_OWN) .hdbid(DATABASE_3_ID) .huserid(USER_3_ID) - .user(USER_3_DTO) + .user(USER_3_BRIEF_DTO) .build(); public final static DatabaseAccess DATABASE_3_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder() @@ -7465,12 +7536,11 @@ public abstract class BaseTest { .type(AccessTypeDto.WRITE_ALL) .hdbid(DATABASE_3_ID) .huserid(USER_3_ID) - .user(USER_3_DTO) + .user(USER_3_BRIEF_DTO) .build(); public final static PrivilegedDatabaseDto DATABASE_3_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder() .id(DATABASE_3_ID) - .created(Instant.now().minus(1, HOURS)) .isPublic(DATABASE_3_PUBLIC) .name(DATABASE_3_NAME) .container(CONTAINER_1_PRIVILEGED_DTO) @@ -7479,9 +7549,7 @@ public abstract class BaseTest { .identifiers(List.of(IDENTIFIER_6_DTO)) .tables(List.of(TABLE_8_DTO)) .views(List.of(VIEW_5_DTO)) - .created(DATABASE_3_CREATED) - .creator(DATABASE_3_CREATOR_DTO) - .owner(DATABASE_3_OWNER_DTO) + .owner(USER_3_BRIEF_DTO) .build(); public final static Identifier IDENTIFIER_7 = Identifier.builder() @@ -7498,8 +7566,8 @@ public abstract class BaseTest { .resultNumber(IDENTIFIER_7_RESULT_NUMBER) .publisher(IDENTIFIER_7_PUBLISHER) .type(IDENTIFIER_7_TYPE) - .createdBy(USER_4_ID) - .creator(USER_4) + .owner(USER_4) + .ownedBy(USER_4_ID) .licenses(new LinkedList<>()) .creators(new LinkedList<>(List.of(IDENTIFIER_7_CREATOR_1))) .relatedIdentifiers(new LinkedList<>()) @@ -7512,6 +7580,7 @@ public abstract class BaseTest { .created(Instant.now().minus(4, HOURS)) .lastModified(Instant.now()) .isPublic(DATABASE_4_PUBLIC) + .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC) .name(DATABASE_4_NAME) .description(DATABASE_4_DESCRIPTION) .cid(CONTAINER_4_ID) @@ -7520,8 +7589,6 @@ public abstract class BaseTest { .exchangeName(DATABASE_4_EXCHANGE) .created(DATABASE_4_CREATED) .lastModified(DATABASE_4_LAST_MODIFIED) - .createdBy(DATABASE_4_CREATOR) - .creator(USER_4) .ownedBy(DATABASE_4_OWNER) .owner(USER_4) .contactPerson(USER_4_ID) diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index e081ac7bb356a4097aab28b71e44ac86d03e01e0..287670f8ddac63952943a27dcdddbe08e78289bc 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -18,7 +18,7 @@ jwt = "~=1.3" testcontainers-opensearch = "*" pytest = "*" rdflib = "*" -dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.6.0.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 9ccdcd7ec5ff19ad05b520e1a9665847497e0dc7..a9fc61d4e84d9456bf374cb703af1906dc6485b8 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5f8f989adc3210e3d07474d3a6c1d5a8bc7352195b75ef07feaf135d9388c60c" + "sha256": "ed3c0ae802499c4020eea0c4d2e62f57a0a642cc0ebe9698f228cd8fd8f42ccb" }, "pipfile-spec": 6, "requires": { @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7", - "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361", - "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c", - "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6", - "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550", - "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", - "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b", - "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5", - "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530", - "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180", - "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", - "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066", - "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", - "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0", - "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409", - "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", - "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", - "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60", - "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a", - "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b", - "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe", - "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502", - "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697", - "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", - "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", - "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771", - "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b", - "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a", - "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", - "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", - "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1", - "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", - "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5", - "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", - "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", - "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f", - "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", - "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", - "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", - "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130", - "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba", - "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", - "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d", - "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87", - "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", - "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", - "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39", - "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", - "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa", - "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3", - "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", - "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", - "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", - "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", - "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a", - "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0", - "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", - "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269", - "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0", - "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", - "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e", - "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", - "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7", - "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82", - "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043", - "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7", - "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0", - "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313", - "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", - "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e", - "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", - "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", - "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", - "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", - "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf", - "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b" + "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", + "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", + "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", + "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", + "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", + "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", + "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", + "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", + "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", + "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", + "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", + "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", + "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", + "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", + "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", + "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", + "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", + "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", + "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", + "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", + "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", + "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", + "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", + "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", + "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", + "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", + "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", + "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", + "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", + "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", + "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", + "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", + "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", + "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", + "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", + "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", + "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", + "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", + "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", + "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", + "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", + "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", + "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", + "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", + "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", + "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", + "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", + "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", + "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", + "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", + "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", + "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", + "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", + "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", + "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", + "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", + "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", + "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", + "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", + "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", + "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", + "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", + "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", + "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", + "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", + "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", + "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", + "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", + "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", + "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", + "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", + "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", + "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", + "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", + "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", + "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" ], "markers": "python_version >= '3.9'", - "version": "==3.11.9" + "version": "==3.11.10" }, "aiosignal": { "hashes": [ @@ -375,9 +375,9 @@ }, "dbrepo": { "hashes": [ - "sha256:292c2631816ca3dbdbd243e4c006c4bd39d512f5ae7e4b10070102c85ec58a10" + "sha256:7164b09a9f578998b3adc1d51d16e4d77404c84ed9a6194ea4b6f07a6b69c27b" ], - "path": "./lib/dbrepo-1.5.2.tar.gz" + "path": "./lib/dbrepo-1.6.0.tar.gz" }, "docker": { "hashes": [ @@ -860,64 +860,64 @@ }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" + "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", + "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", + "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", + "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", + "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", + "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", + "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", + "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", + "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", + "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", + "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", + "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", + "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", + "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", + "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", + "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", + "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", + "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", + "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", + "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", + "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", + "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", + "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", + "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", + "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", + "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", + "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", + "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", + "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", + "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", + "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", + "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", + "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", + "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", + "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", + "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", + "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", + "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", + "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", + "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", + "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", + "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", + "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", + "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", + "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", + "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", + "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", + "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", + "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", + "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", + "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", + "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", + "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", + "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", + "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" ], "markers": "python_version == '3.11'", - "version": "==2.1.3" + "version": "==2.2.0" }, "opensearch-py": { "hashes": [ @@ -1361,120 +1361,120 @@ }, "rpds-py": { "hashes": [ - "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0", - "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3", - "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9", - "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4", - "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571", - "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0", - "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669", - "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979", - "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141", - "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2", - "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5", - "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a", - "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2", - "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3", - "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b", - "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260", - "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2", - "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e", - "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42", - "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3", - "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795", - "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba", - "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d", - "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71", - "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70", - "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d", - "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0", - "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab", - "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5", - "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939", - "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd", - "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e", - "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3", - "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb", - "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4", - "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb", - "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16", - "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0", - "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50", - "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c", - "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9", - "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f", - "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a", - "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7", - "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1", - "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe", - "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d", - "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496", - "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef", - "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a", - "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d", - "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba", - "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31", - "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7", - "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef", - "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14", - "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3", - "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114", - "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9", - "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e", - "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24", - "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156", - "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a", - "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48", - "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b", - "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578", - "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f", - "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a", - "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49", - "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9", - "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411", - "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161", - "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05", - "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e", - "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f", - "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0", - "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501", - "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec", - "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357", - "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296", - "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f", - "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2", - "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8", - "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561", - "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b", - "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32", - "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312", - "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0", - "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2", - "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e", - "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639", - "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9", - "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695", - "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3", - "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa", - "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21", - "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28", - "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543", - "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac", - "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523", - "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934", - "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72", - "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167" + "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", + "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", + "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", + "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", + "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", + "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543", + "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", + "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", + "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", + "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", + "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", + "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", + "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", + "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", + "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99", + "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", + "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", + "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", + "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", + "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", + "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f", + "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3", + "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca", + "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d", + "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e", + "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", + "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea", + "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", + "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", + "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", + "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", + "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723", + "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e", + "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", + "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6", + "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", + "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091", + "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", + "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", + "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", + "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728", + "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", + "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", + "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", + "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7", + "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", + "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", + "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", + "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", + "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", + "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055", + "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d", + "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", + "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", + "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", + "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", + "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", + "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", + "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", + "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", + "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11", + "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", + "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", + "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", + "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b", + "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", + "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c", + "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9", + "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", + "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", + "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", + "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", + "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", + "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c", + "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", + "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", + "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", + "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", + "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", + "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", + "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", + "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", + "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", + "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", + "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", + "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", + "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", + "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3", + "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", + "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520", + "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831", + "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", + "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", + "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", + "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", + "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", + "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", + "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", + "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", + "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", + "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d", + "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", + "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e" ], "markers": "python_version >= '3.9'", - "version": "==0.22.1" + "version": "==0.22.3" }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "sqlalchemy": { "hashes": [ @@ -1893,72 +1893,72 @@ }, "coverage": { "hashes": [ - "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", - "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", - "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", - "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", - "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", - "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", - "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", - "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", - "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", - "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", - "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", - "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", - "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", - "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", - "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", - "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", - "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", - "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", - "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", - "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", - "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", - "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", - "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", - "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", - "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", - "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", - "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", - "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", - "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", - "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", - "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", - "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", - "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", - "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", - "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", - "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", - "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", - "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", - "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", - "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", - "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", - "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", - "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", - "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", - "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", - "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", - "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", - "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", - "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", - "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", - "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", - "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", - "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", - "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", - "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", - "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", - "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", - "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", - "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", - "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", - "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", - "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.8" + "version": "==7.6.9" }, "idna": { "hashes": [ diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock index c08493b2f96cd43463da5e7886036514911b5ad1..9f92191fbaffa2a291ee912f33ad482124a68fa2 100644 --- a/dbrepo-search-service/init/Pipfile.lock +++ b/dbrepo-search-service/init/Pipfile.lock @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7", - "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361", - "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c", - "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6", - "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550", - "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", - "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b", - "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5", - "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530", - "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180", - "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", - "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066", - "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", - "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0", - "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409", - "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", - "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", - "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60", - "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a", - "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b", - "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe", - "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502", - "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697", - "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", - "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", - "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771", - "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b", - "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a", - "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", - "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", - "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1", - "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", - "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5", - "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", - "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", - "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f", - "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", - "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", - "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", - "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130", - "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba", - "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", - "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d", - "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87", - "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", - "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", - "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39", - "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", - "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa", - "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3", - "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", - "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", - "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", - "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", - "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a", - "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0", - "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", - "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269", - "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0", - "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", - "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e", - "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", - "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7", - "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82", - "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043", - "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7", - "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0", - "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313", - "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", - "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e", - "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", - "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", - "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", - "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", - "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf", - "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b" + "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", + "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", + "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", + "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", + "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", + "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", + "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", + "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", + "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", + "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", + "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", + "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", + "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", + "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", + "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", + "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", + "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", + "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", + "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", + "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", + "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", + "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", + "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", + "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", + "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", + "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", + "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", + "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", + "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", + "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", + "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", + "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", + "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", + "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", + "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", + "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", + "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", + "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", + "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", + "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", + "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", + "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", + "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", + "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", + "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", + "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", + "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", + "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", + "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", + "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", + "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", + "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", + "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", + "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", + "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", + "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", + "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", + "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", + "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", + "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", + "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", + "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", + "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", + "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", + "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", + "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", + "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", + "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", + "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", + "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", + "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", + "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", + "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", + "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", + "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", + "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" ], "markers": "python_version >= '3.9'", - "version": "==3.11.9" + "version": "==3.11.10" }, "aiosignal": { "hashes": [ @@ -593,64 +593,64 @@ }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" + "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", + "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", + "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", + "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", + "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", + "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", + "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", + "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", + "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", + "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", + "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", + "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", + "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", + "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", + "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", + "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", + "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", + "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", + "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", + "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", + "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", + "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", + "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", + "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", + "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", + "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", + "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", + "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", + "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", + "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", + "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", + "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", + "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", + "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", + "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", + "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", + "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", + "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", + "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", + "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", + "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", + "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", + "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", + "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", + "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", + "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", + "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", + "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", + "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", + "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", + "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", + "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", + "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", + "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", + "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" ], "markers": "python_version == '3.11'", - "version": "==2.1.3" + "version": "==2.2.0" }, "opensearch-py": { "hashes": [ @@ -995,11 +995,11 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "testcontainers-core": { "hashes": [ @@ -1227,72 +1227,72 @@ "develop": { "coverage": { "hashes": [ - "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", - "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", - "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", - "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", - "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", - "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", - "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", - "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", - "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", - "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", - "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", - "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", - "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", - "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", - "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", - "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", - "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", - "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", - "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", - "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", - "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", - "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", - "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", - "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", - "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", - "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", - "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", - "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", - "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", - "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", - "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", - "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", - "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", - "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", - "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", - "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", - "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", - "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", - "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", - "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", - "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", - "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", - "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", - "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", - "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", - "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", - "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", - "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", - "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", - "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", - "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", - "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", - "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", - "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", - "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", - "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", - "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", - "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", - "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", - "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", - "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", - "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.8" + "version": "==7.6.9" }, "iniconfig": { "hashes": [ diff --git a/dbrepo-search-service/init/database.json b/dbrepo-search-service/init/database.json index 1e6bdd0c4c4d3f2302bafc4c7a79bed2ec84224d..fb175700c614599daab44fa0fb77e51a05151b62 100644 --- a/dbrepo-search-service/init/database.json +++ b/dbrepo-search-service/init/database.json @@ -18,20 +18,16 @@ }, "user": { "properties": { - "attributes": { - "properties": { - "theme": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 256 - } - } + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 } } }, - "id": { + "qualified_name": { "type": "text", "fields": { "keyword": { @@ -40,7 +36,7 @@ } } }, - "qualified_name": { + "name": { "type": "text", "fields": { "keyword": { @@ -49,7 +45,7 @@ } } }, - "username": { + "orcid": { "type": "text", "fields": { "keyword": { @@ -57,16 +53,8 @@ "ignore_above": 256 } } - } - } - } - } - }, - "contact": { - "properties": { - "attributes": { - "properties": { - "theme": { + }, + "username": { "type": "text", "fields": { "keyword": { @@ -76,7 +64,11 @@ } } } - }, + } + } + }, + "contact": { + "properties": { "id": { "type": "text", "fields": { @@ -95,6 +87,24 @@ } } }, + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "orcid": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, "username": { "type": "text", "fields": { @@ -236,20 +246,16 @@ }, "creator": { "properties": { - "attributes": { - "properties": { - "theme": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 256 - } - } + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 } } }, - "id": { + "qualified_name": { "type": "text", "fields": { "keyword": { @@ -258,7 +264,16 @@ } } }, - "qualified_name": { + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "orcid": { "type": "text", "fields": { "keyword": { @@ -315,6 +330,24 @@ } } }, + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "orcid": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, "username": { "type": "text", "fields": { @@ -400,9 +433,6 @@ "id": { "type": "long" }, - "last_modified": { - "type": "date" - }, "licenses": { "properties": { "description": { @@ -530,6 +560,9 @@ "is_public": { "type": "boolean" }, + "is_schema_public": { + "type": "boolean" + }, "name": { "type": "text", "fields": { @@ -541,19 +574,6 @@ }, "owner": { "properties": { - "attributes": { - "properties": { - "theme": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 256 - } - } - } - } - }, "id": { "type": "text", "fields": { @@ -713,31 +733,18 @@ "created": { "type": "date" }, - "created_by": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 256 - } - } - }, "creator": { "properties": { - "attributes": { - "properties": { - "theme": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 256 - } - } + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 } } }, - "id": { + "qualified_name": { "type": "text", "fields": { "keyword": { @@ -746,7 +753,16 @@ } } }, - "qualified_name": { + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "orcid": { "type": "text", "fields": { "keyword": { @@ -796,6 +812,9 @@ "is_public": { "type": "boolean" }, + "is_schema_public": { + "type": "boolean" + }, "is_versioned": { "type": "boolean" }, @@ -813,20 +832,16 @@ }, "owner": { "properties": { - "attributes": { - "properties": { - "theme": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 256 - } - } + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 } } }, - "id": { + "qualified_name": { "type": "text", "fields": { "keyword": { @@ -835,7 +850,16 @@ } } }, - "qualified_name": { + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "orcid": { "type": "text", "fields": { "keyword": { @@ -928,20 +952,16 @@ }, "creator": { "properties": { - "attributes": { - "properties": { - "theme": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 256 - } - } + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 } } }, - "id": { + "qualified_name": { "type": "text", "fields": { "keyword": { @@ -950,7 +970,16 @@ } } }, - "qualified_name": { + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "orcid": { "type": "text", "fields": { "keyword": { @@ -1001,6 +1030,24 @@ } } }, + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "orcid": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, "username": { "type": "text", "fields": { @@ -1086,9 +1133,6 @@ "id": { "type": "long" }, - "last_modified": { - "type": "date" - }, "licenses": { "properties": { "description": { @@ -1210,8 +1254,8 @@ "is_public": { "type": "boolean" }, - "last_modified": { - "type": "date" + "is_schema_public": { + "type": "boolean" }, "name": { "type": "text", diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..db73c1e06cf41cf64b5e409a536527ecebe1694f Binary files /dev/null and b/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz b/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..db73c1e06cf41cf64b5e409a536527ecebe1694f Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz differ diff --git a/dbrepo-search-service/test.sh b/dbrepo-search-service/test.sh new file mode 100644 index 0000000000000000000000000000000000000000..40328cd5dd490542e351668c7e59b33d0bba4965 --- /dev/null +++ b/dbrepo-search-service/test.sh @@ -0,0 +1,7 @@ +#!/bin/bash +PIPENV_PIPFILE=./dbrepo-search-service/Pipfile +source ./dbrepo-search-service/venv/bin/activate +pip install pipenv +pipenv install gunicorn && pipenv install --dev --system --deploy +cd ./dbrepo-search-service/ && coverage run -m pytest test/test_app.py test/test_jwt.py test/test_opensearch_client.py test/test_keycloak_client.py --junitxml=report.xml && coverage html && coverage report > ./coverage.txt +cat ./coverage.txt | grep -o 'TOTAL[^%]*%' \ No newline at end of file diff --git a/dbrepo-search-service/test/test_app.py b/dbrepo-search-service/test/test_app.py index 1b1af020987175fcd8894e61fd2e85519f42c998..8621f6a0a42f744b2dba09dbc3ef4c0f3afe73cc 100644 --- a/dbrepo-search-service/test/test_app.py +++ b/dbrepo-search-service/test/test_app.py @@ -1,35 +1,26 @@ import json import time import unittest -import datetime import jwt -from dbrepo.api.dto import Database, User, UserAttributes, Container, Image, Table, Constraints, Column, ColumnType, \ - Concept, Unit +from dbrepo.api.dto import Database, User, Container, Image, Table, Constraints, Column, ColumnType, Concept, Unit, \ + UserBrief from app import app req = Database(id=1, name="Test", internal_name="test_tuw1", - creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - contact=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - created=datetime.datetime(2024, 3, 25, 16, tzinfo=datetime.timezone.utc), + owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), + contact=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), exchange_name="dbrepo", is_public=True, + is_schema_public=True, container=Container(id=1, name="MariaDB", internal_name="mariadb", host="data-db", port="3306", - created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc), sidecar_host="data-db-sidecar", sidecar_port=3305, image=Image(id=1, @@ -41,29 +32,19 @@ req = Database(id=1, jdbc_method="mariadb", default_port=3306)), tables=[Table(id=1, database_id=1, name="Data", internal_name="data", - creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc), + owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), constraints=Constraints(uniques=[], foreign_keys=[], checks=[], primary_key=[]), is_versioned=False, - created_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", queue_name="dbrepo", routing_key="dbrepo.1.1", is_public=True, + is_schema_public=True, columns=[Column(id=1, database_id=1, table_id=1, name="ID", internal_name="id", column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False, size=20, d=0, - concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906", - created=datetime.datetime(2024, 3, 1, 10, - tzinfo=datetime.timezone.utc)), + concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906"), unit=Unit(id=1, - uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius", - created=datetime.datetime(2024, 3, 1, 10, - tzinfo=datetime.timezone.utc)), + uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius"), val_min=0, val_max=10)] )]) diff --git a/dbrepo-search-service/test/test_opensearch_client.py b/dbrepo-search-service/test/test_opensearch_client.py index 581e5f8c5d94435c4344b4e8478ec09b116fd735..dc17c01d3ba8d8de82ce6ec339a463c45584caa4 100644 --- a/dbrepo-search-service/test/test_opensearch_client.py +++ b/dbrepo-search-service/test/test_opensearch_client.py @@ -2,35 +2,26 @@ import datetime import unittest import opensearchpy -from dbrepo.api.dto import Database, User, UserAttributes, Container, Image, Table, Column, ColumnType, Constraints, \ - PrimaryKey, TableMinimal, ColumnMinimal, Concept, Unit +from dbrepo.api.dto import Database, Container, Image, Table, Column, ColumnType, Constraints, PrimaryKey, \ + TableMinimal, ColumnMinimal, Concept, Unit, UserBrief from opensearchpy import NotFoundError from app import app - from init.clients.opensearch_client import OpenSearchClient req = Database(id=1, name="Test", internal_name="test_tuw1", - creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - contact=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - created=datetime.datetime(2024, 3, 25, 16, tzinfo=datetime.timezone.utc), + owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), + contact=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), exchange_name="dbrepo", is_public=True, + is_schema_public=True, container=Container(id=1, name="MariaDB", internal_name="mariadb", host="data-db", port="3306", - created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc), sidecar_host="data-db-sidecar", sidecar_port=3305, image=Image(id=1, @@ -41,30 +32,23 @@ req = Database(id=1, driver_class="org.mariadb.jdbc.Driver", jdbc_method="mariadb", default_port=3306)), - tables=[Table(id=1, database_id=1, name="Data", internal_name="data", - creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc), + tables=[Table(id=1, + database_id=1, + name="Data", + internal_name="data", + owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), constraints=Constraints(uniques=[], foreign_keys=[], checks=[], primary_key=[]), is_versioned=False, - created_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", queue_name="dbrepo", routing_key="dbrepo.1.1", is_public=True, + is_schema_public=True, columns=[Column(id=1, database_id=1, table_id=1, name="ID", internal_name="id", column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False, size=20, d=0, - concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906", - created=datetime.datetime(2024, 3, 1, 10, - tzinfo=datetime.timezone.utc)), + concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906"), unit=Unit(id=1, - uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius", - created=datetime.datetime(2024, 3, 1, 10, - tzinfo=datetime.timezone.utc)), + uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius"), val_min=0, val_max=10)] )]) @@ -84,6 +68,7 @@ class OpenSearchClientTest(unittest.TestCase): queue_name="dbrepo", routing_key="dbrepo.test_tuw1.test_table", is_public=True, + is_schema_public=True, database_id=req.id, constraints=Constraints(uniques=[], foreign_keys=[], checks=[], primary_key=[PrimaryKey(id=1, @@ -92,14 +77,7 @@ class OpenSearchClientTest(unittest.TestCase): column=ColumnMinimal(id=1, table_id=1, database_id=req.id))]), is_versioned=True, - created_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", - username="foo", - attributes=UserAttributes(theme="dark")), - created=datetime.datetime(2024, 4, 25, 17, 44, tzinfo=datetime.timezone.utc), + owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"), columns=[Column(id=1, name="ID", internal_name="id", @@ -112,16 +90,10 @@ class OpenSearchClientTest(unittest.TestCase): self.assertEqual(1, database.id) self.assertEqual("Test", database.name) self.assertEqual("test_tuw1", database.internal_name) - self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.creator.id) - self.assertEqual("foo", database.creator.username) - self.assertEqual("dark", database.creator.attributes.theme) self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id) self.assertEqual("foo", database.owner.username) - self.assertEqual("dark", database.owner.attributes.theme) self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id) self.assertEqual("foo", database.contact.username) - self.assertEqual("dark", database.contact.attributes.theme) - self.assertEqual(datetime.datetime(2024, 3, 25, 16, tzinfo=datetime.timezone.utc), database.created) self.assertEqual("dbrepo", database.exchange_name) self.assertEqual(True, database.is_public) self.assertEqual(1, database.container.id) @@ -137,15 +109,8 @@ class OpenSearchClientTest(unittest.TestCase): self.assertEqual(True, database.tables[0].is_public) self.assertEqual(1, database.tables[0].database_id) self.assertEqual(True, database.tables[0].is_versioned) - self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].created_by) - self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].creator.id) - self.assertEqual("foo", database.tables[0].creator.username) - self.assertEqual("dark", database.tables[0].creator.attributes.theme) self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].owner.id) self.assertEqual("foo", database.tables[0].owner.username) - self.assertEqual("dark", database.tables[0].owner.attributes.theme) - self.assertEqual(datetime.datetime(2024, 4, 25, 17, 44, tzinfo=datetime.timezone.utc), - database.tables[0].created) self.assertEqual(1, len(database.tables[0].columns)) self.assertEqual(1, database.tables[0].columns[0].id) self.assertEqual("ID", database.tables[0].columns[0].name) @@ -163,16 +128,10 @@ class OpenSearchClientTest(unittest.TestCase): self.assertEqual(1, database.id) self.assertEqual("Test", database.name) self.assertEqual("test_tuw1", database.internal_name) - self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.creator.id) - self.assertEqual("foo", database.creator.username) - self.assertEqual("dark", database.creator.attributes.theme) self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id) self.assertEqual("foo", database.owner.username) - self.assertEqual("dark", database.owner.attributes.theme) self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id) self.assertEqual("foo", database.contact.username) - self.assertEqual("dark", database.contact.attributes.theme) - self.assertEqual(datetime.datetime(2024, 3, 25, 16, 0, tzinfo=datetime.timezone.utc), database.created) self.assertEqual("dbrepo", database.exchange_name) self.assertEqual(True, database.is_public) self.assertEqual(1, database.container.id) diff --git a/dbrepo-ui/components/TimeDrift.vue b/dbrepo-ui/components/TimeDrift.vue index 362fa28aaf445bc93c2f2b91e6cf6ffcd4676645..2f2555f9f84f107dff1ffd12ad75533d388c1f62 100644 --- a/dbrepo-ui/components/TimeDrift.vue +++ b/dbrepo-ui/components/TimeDrift.vue @@ -4,7 +4,6 @@ v-if="timestamp && offSeconds > 3" class="banner" border="start" - tile type="warning"> {{ $t('error.data.drift') + ' ' + offSeconds + 's' }} </v-alert> diff --git a/dbrepo-ui/components/database/DatabaseCreate.vue b/dbrepo-ui/components/database/DatabaseCreate.vue index 5da87cebbda9731ae842636654a40ce6fdea14a8..cd854897905dff7165fdadb10ff44b46d41c6479 100644 --- a/dbrepo-ui/components/database/DatabaseCreate.vue +++ b/dbrepo-ui/components/database/DatabaseCreate.vue @@ -17,7 +17,7 @@ <v-row dense> <v-col> <v-text-field - v-model="createDatabaseDto.name" + v-model="payload.name" name="database" :variant="inputVariant" :label="$t('pages.database.subpages.create.name.label')" @@ -45,10 +45,6 @@ :rules="[v => !!v || $t('validation.required')]" return-object required> - <template - v-slot:selection> - <span>{{ engine.name }}</span> - </template> <template v-if="engine" v-slot:details> @@ -57,6 +53,42 @@ </v-select> </v-col> </v-row> + <v-row> + <v-col + md="6"> + <v-select + v-model="payload.is_public" + name="public" + :label="$t('pages.database.subpages.create.data.label')" + :hint="$t('pages.database.subpages.create.data.hint')" + persistent-hint + :variant="inputVariant" + :items="visibilityOptions" + item-title="name" + item-value="value" + :rules="[v => !!v || $t('validation.required')]" + return-object + required> + </v-select> + </v-col> + <v-col + md="6"> + <v-select + v-model="payload.is_schema_public" + name="schema-public" + :label="$t('pages.database.subpages.create.schema.label')" + :hint="$t('pages.database.subpages.create.schema.hint')" + persistent-hint + :variant="inputVariant" + :items="visibilityOptions" + item-title="name" + item-value="value" + :rules="[v => !!v || $t('validation.required')]" + return-object + required> + </v-select> + </v-col> + </v-row> </v-card-text> <v-card-actions> <v-spacer /> @@ -91,9 +123,20 @@ export default { loadingContainers: false, engine: null, engines: [], - createDatabaseDto: { + visibilityOptions: [ + { + name: this.$t('toolbars.database.public'), + value: true + }, + { + name: this.$t('toolbars.database.private'), + value: false + } + ], + payload: { name: null, - is_public: true + is_public: true, + is_schema_public: true, } } }, @@ -137,17 +180,14 @@ export default { .catch(({code}) => { this.loadingContainers = false const toast = useToastInstance() - if (typeof code !== 'string') { - return - } toast.error(this.$t(code)) }) }, create () { - const payload = { container_id: this.engine.id, name: this.createDatabaseDto.name, is_public: true } - const databaseService = useDatabaseService() this.loading = true - databaseService.create(payload) + this.payload.container_id = this.engine.id + const databaseService = useDatabaseService() + databaseService.create(this.payload) .then(async (database) => { await this.$router.push(`/database/${database.id}/info`) this.loading = false diff --git a/dbrepo-ui/components/database/DatabaseToolbar.vue b/dbrepo-ui/components/database/DatabaseToolbar.vue index 5f3c8c83989bd20fa67f6f327fdc9676767acbb4..65363c3467067aa4dd3eca9e2d5595a913723684 100644 --- a/dbrepo-ui/components/database/DatabaseToolbar.vue +++ b/dbrepo-ui/components/database/DatabaseToolbar.vue @@ -118,6 +118,12 @@ export default { roles () { return this.userStore.getRoles }, + isContrastTheme () { + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') + }, + isDarkTheme () { + return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark') + }, colorVariant () { return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary') }, diff --git a/dbrepo-ui/components/dialogs/Semantics.vue b/dbrepo-ui/components/dialogs/Semantics.vue index 8d3c573f7b205368fd354372a9e166f2ee81a14f..12fffce66cd5b4647be1ae5b56c5e10be5facac4 100644 --- a/dbrepo-ui/components/dialogs/Semantics.vue +++ b/dbrepo-ui/components/dialogs/Semantics.vue @@ -234,7 +234,7 @@ export default { } this.loadingSave = true const tableService = useTableService() - tableService.update(this.database.id, this.tableId, this.column.id, payload) + tableService.updateSemantics(this.database.id, this.tableId, this.column.id, payload) .then(() => { this.recommendation = null this.$refs.form.reset() diff --git a/dbrepo-ui/components/dialogs/UpdateTable.vue b/dbrepo-ui/components/dialogs/UpdateTable.vue new file mode 100644 index 0000000000000000000000000000000000000000..6e4e07182c12c480b1f4c5d4da3756d3e111164a --- /dev/null +++ b/dbrepo-ui/components/dialogs/UpdateTable.vue @@ -0,0 +1,167 @@ +<template> + <div> + <v-form + ref="form" + v-model="valid" + autocomplete="off" + @submit.prevent="submit"> + <v-card + :title="$t('pages.view.visibility.title')"> + <v-card-text> + <v-row> + <v-col> + <v-textarea + v-model="modify.description" + rows="2" + :rules="[ + v => (!!v || v.length <= 180) || ($t('validation.max-length') + 180), + ]" + clearable + counter="180" + persistent-counter + persistent-hint + :variant="inputVariant" + :hint="$t('pages.table.subpages.import.description.hint')" + :label="$t('pages.table.subpages.import.description.label')"/> + </v-col> + </v-row> + <v-row + dense> + <v-col + md="6"> + <v-select + v-model="modify.is_public" + :items="visibilities" + persistent-hint + :variant="inputVariant" + required + :rules="[ + v => v !== null || $t('validation.required') + ]" + :label="$t('pages.database.subpages.create.data.label')" + :hint="$t('pages.database.subpages.create.data.hint')" /> + </v-col> + <v-col + md="6"> + <v-select + v-model="modify.is_schema_public" + :items="visibilities" + persistent-hint + :variant="inputVariant" + required + :rules="[ + v => v !== null || $t('validation.required') + ]" + :label="$t('pages.database.subpages.create.schema.label')" + :hint="$t('pages.database.subpages.create.schema.hint')" /> + </v-col> + </v-row> + </v-card-text> + <v-card-actions> + <v-spacer /> + <v-btn + :variant="buttonVariant" + :text="$t('navigation.cancel')" + @click="cancel" /> + <v-btn + id="database" + variant="flat" + :disabled="!valid || !isChange" + :color="buttonColor" + :loading="loading" + type="submit" + :text="$t('navigation.modify')" + @click="update" /> + </v-card-actions> + </v-card> + </v-form> + </div> +</template> + +<script> +import { useCacheStore } from '@/stores/cache' + +export default { + props: { + table: { + type: Object, + default () { + return { + is_public: true, + is_schema_public: true, + description: null + } + } + }, + }, + data () { + return { + valid: false, + loading: false, + visibilities: [ + { title: this.$t('toolbars.database.public'), value: true }, + { title: this.$t('toolbars.database.private'), value: false }, + ], + modify: { + description: this.table.description, + is_public: this.table.is_public, + is_schema_public: this.table.is_schema_public + }, + cacheStore: useCacheStore() + } + }, + computed: { + database () { + return this.cacheStore.getDatabase + }, + inputVariant () { + const runtimeConfig = useRuntimeConfig() + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal + }, + buttonVariant () { + const runtimeConfig = useRuntimeConfig() + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal + }, + isChange () { + if (this.table.description !== this.modify.description) { + return true + } + if (this.table.is_public !== this.modify.is_public) { + return true + } + return this.table.is_schema_public !== this.modify.is_schema_public + }, + buttonColor () { + return !this.isChange ? null : 'warning' + } + }, + methods: { + submit () { + this.$refs.form.validate() + }, + cancel () { + this.$emit('close', { success: false }) + }, + update () { + this.loading = true + const tableService = useTableService() + tableService.update(this.$route.params.database_id, this.$route.params.table_id, this.modify) + .then(() => { + this.loading = false + const toast = useToastInstance() + toast.success(this.$t('success.table.updated')) + this.$emit('close', { success: true }) + this.cacheStore.reloadTable() + }) + .catch(({code}) => { + this.loading = false + const toast = useToastInstance() + toast.error(this.$t(code)) + }) + .finally(() => { + this.loading = false + }) + } + } +} +</script> diff --git a/dbrepo-ui/components/dialogs/ViewVisibility.vue b/dbrepo-ui/components/dialogs/ViewVisibility.vue new file mode 100644 index 0000000000000000000000000000000000000000..226772edd922a9d71e40a312d461c666c50e8893 --- /dev/null +++ b/dbrepo-ui/components/dialogs/ViewVisibility.vue @@ -0,0 +1,146 @@ +<template> + <div> + <v-form + ref="form" + v-model="valid" + autocomplete="off" + @submit.prevent="submit"> + <v-card + :title="$t('pages.view.visibility.title')"> + <v-card-text> + <v-row + dense> + <v-col + md="6"> + <v-select + v-model="modify.is_public" + :items="visibilities" + persistent-hint + :variant="inputVariant" + required + :rules="[ + v => v !== null || $t('validation.required') + ]" + :label="$t('pages.database.subpages.create.data.label')" + :hint="$t('pages.database.subpages.create.data.hint')" /> + </v-col> + <v-col + md="6"> + <v-select + v-model="modify.is_schema_public" + :items="visibilities" + persistent-hint + :variant="inputVariant" + required + :rules="[ + v => v !== null || $t('validation.required') + ]" + :label="$t('pages.database.subpages.create.schema.label')" + :hint="$t('pages.database.subpages.create.schema.hint')" /> + </v-col> + </v-row> + </v-card-text> + <v-card-actions> + <v-spacer /> + <v-btn + :variant="buttonVariant" + :text="$t('navigation.cancel')" + @click="cancel" /> + <v-btn + id="database" + variant="flat" + :disabled="!valid || !isChange" + :color="buttonColor" + type="submit" + :text="$t('navigation.modify')" + @click="updateVisibility" /> + </v-card-actions> + </v-card> + </v-form> + </div> +</template> + +<script> +import { useCacheStore } from '@/stores/cache' + +export default { + props: { + view: { + type: Object, + default () { + return { + is_public: true, + is_schema_public: true + } + } + }, + }, + data () { + return { + valid: false, + loading: false, + loadingUsers: false, + users: [], + error: false, + visibilities: [ + { title: this.$t('toolbars.database.public'), value: true }, + { title: this.$t('toolbars.database.private'), value: false }, + ], + modify: { + is_public: this.view.is_public, + is_schema_public: this.view.is_schema_public + }, + cacheStore: useCacheStore() + } + }, + computed: { + database () { + return this.cacheStore.getDatabase + }, + inputVariant () { + const runtimeConfig = useRuntimeConfig() + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal + }, + buttonVariant () { + const runtimeConfig = useRuntimeConfig() + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal + }, + isChange () { + if (this.view.is_public !== this.modify.is_public) { + return true + } + return this.view.is_schema_public !== this.modify.is_schema_public + }, + buttonColor () { + return !this.isChange ? null : 'warning' + } + }, + methods: { + submit () { + this.$refs.form.validate() + }, + cancel () { + this.$emit('close', { success: false }) + }, + updateVisibility () { + this.loading = true + const viewService = useViewService() + viewService.update(this.$route.params.database_id, this.$route.params.view_id, this.modify) + .then(() => { + this.loading = false + const toast = useToastInstance() + toast.success(this.$t('success.view.modified')) + this.$emit('close', { success: true }) + }) + .catch(({code, message}) => { + this.loading = false + const toast = useToastInstance() + toast.error(message) + }) + .finally(() => { + this.loading = false + }) + } + } +} +</script> diff --git a/dbrepo-ui/components/identifier/Persist.vue b/dbrepo-ui/components/identifier/Persist.vue index 1795d058660ff08288b9054435e44362d84cf0e7..5c6d7c62892c7427086b45f6916327d542289dc8 100644 --- a/dbrepo-ui/components/identifier/Persist.vue +++ b/dbrepo-ui/components/identifier/Persist.vue @@ -1176,6 +1176,7 @@ export default { this.addDescription() this.fetchLicenses() this.fetchIdentifier() + this.$refs.form.validate() }, methods: { cancel () { diff --git a/dbrepo-ui/components/subset/Builder.vue b/dbrepo-ui/components/subset/Builder.vue index 3a3cd3a142dce81172d23d1ee979515514c0326a..2a14b8f474a8f7a3cc0e38302e3ebad0e0df5a7d 100644 --- a/dbrepo-ui/components/subset/Builder.vue +++ b/dbrepo-ui/components/subset/Builder.vue @@ -61,20 +61,11 @@ :hint="$t('pages.view.subpages.create.name.hint')" /> </v-col> </v-row> - <v-row - v-if="isView && !view.is_public" - dense> - <v-col> - <v-alert - :text="$t('pages.view.subpages.create.visibility.warn')" - border="start" - color="warning" /> - </v-col> - </v-row> <v-row v-if="isView" dense> - <v-col lg="8"> + <v-col + md="4"> <v-select v-model="view.is_public" :items="visibilities" @@ -85,8 +76,23 @@ :rules="[ v => !!v || $t('validation.required') ]" - :label="$t('pages.view.subpages.create.visibility.label')" - :hint="$t('pages.view.subpages.create.visibility.hint')" /> + :label="$t('pages.database.subpages.create.data.label')" + :hint="$t('pages.database.subpages.create.data.hint')" /> + </v-col> + <v-col + md="4"> + <v-select + v-model="view.is_schema_public" + :items="visibilities" + persistent-hint + :variant="inputVariant" + required + clearable + :rules="[ + v => !!v || $t('validation.required') + ]" + :label="$t('pages.database.subpages.create.schema.label')" + :hint="$t('pages.database.subpages.create.schema.hint')" /> </v-col> </v-row> <v-window @@ -121,6 +127,7 @@ :label="$t('pages.view.subpages.create.columns.label')" :hint="$t('pages.view.subpages.create.columns.hint')" :rules="[v => !!v || $t('validation.required')]" + :loading="loadingColumns" return-object multiple @update:model-value="buildQuery"> @@ -322,6 +329,7 @@ export default { return { table: null, views: [], + columns: [], timestamp: null, executeDifferentTimestamp: false, visibilities: [ @@ -338,6 +346,7 @@ export default { }, view: { is_public: true, + is_schema_public: true, name: null, query: null }, @@ -345,6 +354,7 @@ export default { clauses: [], tabs: 0, loadingQuery: false, + loadingColumns: false, cacheStore: useCacheStore(), userStore: useUserStore() } @@ -359,12 +369,6 @@ export default { } return this.database.container.image.operators }, - columns () { - if (!this.table) { - return [] - } - return this.table.columns - }, tables () { if (!this.database) { return [] @@ -462,12 +466,30 @@ export default { }, table () { this.select = [] + if (!this.table) { + return + } + this.fetchTableColumns(this.table.id) } }, mounted () { this.selectTable() }, methods: { + fetchTableColumns (tableId) { + this.loadingColumns = true + const tableService = useTableService() + tableService.findOne(this.$route.params.database_id, tableId) + .then((table) => { + this.columns = table.columns + this.loadingColumns = false + }) + .catch(({code}) => { + const toast = useToastInstance() + toast.error(this.$t(code)) + this.loadingColumns = false + }) + }, validViewName (name) { if (!name) { return false diff --git a/dbrepo-ui/components/table/TableImport.vue b/dbrepo-ui/components/table/TableImport.vue index 14d4dae70a45f07fe716335edaff597ed2bbc79a..c0e4d6f9348d1cebe920fcd1e55f64e504cada16 100644 --- a/dbrepo-ui/components/table/TableImport.vue +++ b/dbrepo-ui/components/table/TableImport.vue @@ -98,13 +98,13 @@ v-if="$route.query.location" dense> <v-col> - <p> - {{ $t('pages.table.subpages.import.storage.text') }} - </p> <v-chip - prepend-icon="mdi-cloud-upload" + prepend-icon="mdi-database-check-outline" + size="large" + variant="flat" + color="tertiary" label> - {{ $route.query.location }} + {{ $t('pages.table.subpages.import.storage.text') }} </v-chip> </v-col> </v-row> diff --git a/dbrepo-ui/components/table/TableList.vue b/dbrepo-ui/components/table/TableList.vue index 2fc2c7d791b5ce5f84614bc9e2266d99c4c49e9b..8bb77b2b5a8971e3a0d8dbe557e9d5d849f492c1 100644 --- a/dbrepo-ui/components/table/TableList.vue +++ b/dbrepo-ui/components/table/TableList.vue @@ -19,6 +19,21 @@ :subtitle="table.description ? table.description : ''" :to="`/database/${$route.params.database_id}/table/${table.id}/info`"> <template v-slot:append> + <v-chip + v-if="table && table.is_public" + size="small" + class="ml-2" + color="success" + :text="$t('toolbars.database.public')" + variant="outlined" /> + <v-chip + v-if="table && !table.is_public" + size="small" + class="ml-2" + :color="colorVariant" + variant="outlined" + :text="$t('toolbars.database.private')" + flat /> <v-tooltip v-if="hasPublishedIdentifier(table)" :text="$t('pages.identifier.pid.title')" @@ -91,14 +106,18 @@ export default { return [] } return this.database.tables + }, + isContrastTheme () { + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') + }, + isDarkTheme () { + return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark') + }, + colorVariant () { + return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary') } }, methods: { - pick (item, mode) { - this.column = item - this.mode = mode - this.dialogSemantic = true - }, closed (data) { console.debug('closed dialog', data) this.dialogSemantic = false diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue index cc3a5e687d8dd9f895e91bc5acd746aeecffd130..e9cb03c6173f334866a95e18bec220c64258fbe9 100644 --- a/dbrepo-ui/components/table/TableSchema.vue +++ b/dbrepo-ui/components/table/TableSchema.vue @@ -228,7 +228,9 @@ export default { data () { return { valid: false, + columnTypes: [], loadColumn: false, + loadingColumnTypes: false, tableColumns: [], cacheStore: useCacheStore() } @@ -237,22 +239,6 @@ export default { database () { return this.cacheStore.getDatabase }, - columnTypes () { - if (!this.database) { - return [] - } - const types = this.database.container.image.data_types - if (this.columns.filter(c => c.type === 'serial').length > 0) { - return types.filter(t => t.value !== 'serial') - } - return types - }, - dateFormats () { - if (!this.database || !('container' in this.database) || !('image' in this.database.container) || !('date_formats' in this.database.container.image)) { - return [] - } - return this.database.container.image.date_formats - }, inputVariant () { const runtimeConfig = useRuntimeConfig() return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal @@ -272,7 +258,32 @@ export default { } } }, + mounted () { + this.fetchColumnTypes() + }, methods: { + fetchColumnTypes () { + if (!this.database) { + return + } + this.loadingColumnTypes = true + const imageService = useImageService() + imageService.findById(this.database.container.id) + .then((image) => { + const types = image.data_types + if (this.columns.filter(c => c.type === 'serial').length > 0) { + this.columnTypes = types.filter(t => t.value !== 'serial') + } else { + this.columnTypes = types + } + this.loadingColumnTypes = false + }) + .catch(({code}) => { + this.loadingColumnTypes = false + const toast = useToastInstance() + toast.error(this.$t(code)) + }) + }, shift (column) { if (!this.columns || this.columns.length === 0) { return false diff --git a/dbrepo-ui/components/table/TableToolbar.vue b/dbrepo-ui/components/table/TableToolbar.vue index 1c222cc7c61bd4229c3a8b8e3dd7560a1228eea5..b7d358d2492bd01aa8eddc479405c660784f66c6 100644 --- a/dbrepo-ui/components/table/TableToolbar.vue +++ b/dbrepo-ui/components/table/TableToolbar.vue @@ -6,7 +6,8 @@ size="small" icon="mdi-arrow-left" :to="`/database/${$route.params.database_id}/table`" /> - <v-toolbar-title> + <v-toolbar-title + v-if="table"> <v-skeleton-loader v-if="!table && $vuetify.display.lgAndUp" type="subtitle" @@ -15,6 +16,21 @@ v-if="table && $vuetify.display.lgAndUp"> {{ table.name }} </span> + <v-chip + v-if="table && table.is_public" + size="small" + class="ml-2" + color="success" + :text="$t('toolbars.database.public')" + variant="outlined" /> + <v-chip + v-if="table && !table.is_public" + size="small" + class="ml-2" + :color="colorVariant" + variant="outlined" + :text="$t('toolbars.database.private')" + flat /> </v-toolbar-title> <v-spacer /> <v-btn @@ -41,6 +57,14 @@ :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-view.xl') + ' ' : '') + $t('toolbars.database.create-view.permanent')" class="mr-2" :to="`/database/${$route.params.database_id}/view/create?tid=${$route.params.table_id}`" /> + <v-btn + v-if="canUpdateTable" + class="mr-2" + variant="flat" + :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-table-edit' : null" + color="warning" + :text="($vuetify.display.lgAndUp ? $t('toolbars.database.update-table.xl') + ' ' : '') + $t('toolbars.database.update-table.permanent')" + @click="updateTableDialog = true" /> <v-btn v-if="canDropTable" :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-delete' : null" @@ -63,10 +87,11 @@ :text="$t('navigation.info')" :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/info`" /> <v-tab - v-if="canViewTableData" + v-if="canViewData" :text="$t('navigation.data')" :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/data`" /> <v-tab + v-if="canViewSchema" :text="$t('navigation.schema')" :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/schema`" /> </v-tabs> @@ -75,7 +100,15 @@ <v-dialog v-model="dropTableDialog" max-width="640"> - <DropTable @close="closed" /> + <DropTable + @close="closeDelete" /> + </v-dialog> + <v-dialog + v-model="updateTableDialog" + max-width="640"> + <UpdateTable + :table="table" + @close="closeUpdate" /> </v-dialog> </div> </template> @@ -83,13 +116,15 @@ <script> import EditTuple from '@/components/dialogs/EditTuple.vue' import DropTable from '@/components/dialogs/DropTable.vue' +import UpdateTable from '@/components/dialogs/UpdateTable.vue' import { useCacheStore } from '@/stores/cache' import { useUserStore } from '@/stores/user' export default { components: { EditTuple, - DropTable + DropTable, + UpdateTable }, data () { return { @@ -98,6 +133,7 @@ export default { error: false, edit: false, dropTableDialog: false, + updateTableDialog: false, cacheStore: useCacheStore(), userStore: useUserStore() } @@ -112,12 +148,24 @@ export default { access () { return this.userStore.getAccess }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, user () { return this.userStore.getUser }, roles () { return this.userStore.getRoles }, + canUpdateTable () { + if (!this.roles || !this.user || !this.table) { + return false + } + return this.roles.includes('update-table') && this.table.owner.id === this.user.id + }, canExecuteQuery () { if (!this.roles || !this.table || !this.user) { return false @@ -142,18 +190,29 @@ export default { const databaseService = useDatabaseService() return databaseService.isOwner(this.database, this.user) && this.roles.includes('create-database-view') }, - canViewTableData () { - /* view when database is public or when private: 1) view-table-data role present 2) access is at least read */ - if (!this.database) { + canViewData () { + if (!this.table) { return false } - if (this.database.is_public) { + if (this.table.is_public) { return true } - if (!this.roles || !this.table || !this.user || !this.roles.includes('view-table-data') || !this.access) { + if (!this.user) { return false } - return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all' + return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id + }, + canViewSchema () { + if (!this.table) { + return false + } + if (this.table.is_schema_public) { + return true + } + if (!this.user) { + return false + } + return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id }, canImportCsv () { if (!this.roles || !this.table || !this.user) { @@ -170,16 +229,27 @@ export default { buttonVariant () { const runtimeConfig = useRuntimeConfig() return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal - } + }, + isContrastTheme () { + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') + }, + isDarkTheme () { + return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark') + }, + colorVariant () { + return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary') + }, }, methods: { - closed (event) { - const { success } = event + closeDelete ({success}) { this.dropTableDialog = false if (success) { this.cacheStore.reloadDatabase() this.$router.push(`/database/${this.$route.params.database_id}/table`) } + }, + closeUpdate () { + this.updateTableDialog = false } } } diff --git a/dbrepo-ui/components/user/UserBadge.vue b/dbrepo-ui/components/user/UserBadge.vue index 71da03d9290ba16928411adda02f3f9eb99aec16..f7bd18c60fcd64ff65538ed075d483c7a1e61b9e 100644 --- a/dbrepo-ui/components/user/UserBadge.vue +++ b/dbrepo-ui/components/user/UserBadge.vue @@ -33,7 +33,6 @@ export default { computed: { hasOrcid () { return !(!this.user || !this.user.attributes || !this.user.attributes.orcid); - }, orcid () { if (!this.hasOrcid) { @@ -46,7 +45,7 @@ export default { return userService.userToFullName(this.user) }, isSelf () { - if (!this.otherUser) { + if (!this.otherUser || !this.user) { return false } return this.user.id === this.otherUser.id diff --git a/dbrepo-ui/components/view/ViewList.vue b/dbrepo-ui/components/view/ViewList.vue index ea2dc0946cb3088e9042045a197e7aa35bc8da76..6fe84519032aee28de5b02b62289195328cbaa1a 100644 --- a/dbrepo-ui/components/view/ViewList.vue +++ b/dbrepo-ui/components/view/ViewList.vue @@ -14,6 +14,21 @@ :class="clazz(view)" :to="`/database/${$route.params.database_id}/view/${view.id}/info`"> <template v-slot:append> + <v-chip + v-if="view && view.is_public" + size="small" + class="ml-2" + color="success" + :text="$t('toolbars.database.public')" + variant="outlined" /> + <v-chip + v-if="view && !view.is_public" + size="small" + class="ml-2" + :color="colorVariant" + variant="outlined" + :text="$t('toolbars.database.private')" + flat /> <v-tooltip v-if="hasPublishedIdentifier(view)" :text="$t('pages.identifier.pid.title')" @@ -60,6 +75,15 @@ export default { return [] } return this.database.views + }, + isContrastTheme () { + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') + }, + isDarkTheme () { + return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark') + }, + colorVariant () { + return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary') } }, methods: { diff --git a/dbrepo-ui/components/view/ViewToolbar.vue b/dbrepo-ui/components/view/ViewToolbar.vue index c43b730397a977559f85b55f92e62b486b15aa6f..e3ba6807bc979638a4152d1e33cc291a0478333f 100644 --- a/dbrepo-ui/components/view/ViewToolbar.vue +++ b/dbrepo-ui/components/view/ViewToolbar.vue @@ -6,8 +6,27 @@ icon="mdi-arrow-left" :to="`/database/${$route.params.database_id}/view`" /> <v-toolbar-title - v-if="view" - :text="title" /> + v-if="cachedView"> + <span + v-if="$vuetify.display.lgAndUp"> + {{ title }} + </span> + <v-chip + v-if="cachedView.is_public" + size="small" + class="ml-2" + color="success" + :text="$t('toolbars.database.public')" + variant="outlined" /> + <v-chip + v-if="!cachedView.is_public" + size="small" + class="ml-2" + :color="colorVariant" + variant="outlined" + :text="$t('toolbars.database.private')" + flat /> + </v-toolbar-title> <v-spacer /> <v-btn v-if="canDeleteView" @@ -18,6 +37,14 @@ color="error" :text="$t('navigation.delete')" @click="deleteView" /> + <v-btn + v-if="canUpdateVisibility" + class="mr-2" + variant="flat" + :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-eye' : null" + color="warning" + :text="$t('navigation.visibility')" + @click="updateViewDialog = true" /> <v-btn v-if="canCreatePid" class="mr-2" @@ -26,6 +53,14 @@ color="primary" :text="($vuetify.display.lgAndUp ? $t('toolbars.view.pid.xl') + ' ' : '') + $t('toolbars.view.pid.permanent')" :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/persist`" /> + <v-dialog + v-model="updateViewDialog" + persistent + max-width="640"> + <ViewVisibility + :view="cachedView" + @close="close" /> + </v-dialog> <template v-slot:extension> <v-tabs v-model="tab" @@ -34,8 +69,13 @@ :text="$t('navigation.info')" :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/info`" /> <v-tab + v-if="canViewData" :text="$t('navigation.data')" :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/data`" /> + <v-tab + v-if="canViewSchema" + :text="$t('navigation.schema')" + :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/schema`" /> </v-tabs> </template> </v-toolbar> @@ -44,15 +84,20 @@ <script> import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' +import CreateOntology from "@/components/dialogs/CreateOntology.vue" +import ViewVisibility from "@/components/dialogs/ViewVisibility.vue" export default { components: { + ViewVisibility, + CreateOntology }, data () { return { tab: null, loading: false, loadingDelete: false, + updateViewDialog: false, userStore: useUserStore(), cacheStore: useCacheStore() } @@ -68,20 +113,59 @@ export default { const runtimeConfig = useRuntimeConfig() return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal }, - view () { + cachedView () { if (!this.database) { return null } return this.database.views.filter(v => v.id === Number(this.$route.params.view_id))[0] }, + canViewData () { + if (!this.cachedView) { + return false + } + if (this.cachedView.is_public) { + return true + } + if (!this.user) { + return false + } + return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id + }, + canViewSchema () { + if (!this.cachedView) { + return false + } + if (this.cachedView.is_schema_public) { + return true + } + if (!this.user) { + return false + } + return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id + }, canDeleteView () { - if (!this.roles || !this.user || !this.view || !this.view.creator) { + if (!this.roles || !this.user || !this.cachedView) { return false } - return this.roles.includes('delete-database-view') && this.view.creator.id === this.user.id + return this.roles.includes('delete-database-view') && this.cachedView.owned_by === this.user.id + }, + canUpdateVisibility () { + if (!this.roles || !this.user || !this.cachedView) { + return false + } + return this.roles.includes('modify-view-visibility') && this.cachedView.owned_by === this.user.id + }, + isContrastTheme () { + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') + }, + isDarkTheme () { + return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark') + }, + colorVariant () { + return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary') }, canCreatePid () { - if (!this.roles || !this.user || !this.view) { + if (!this.roles || !this.user || !this.cachedView) { return false } const userService = useUserService() @@ -90,6 +174,12 @@ export default { access () { return this.userStore.getAccess }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, user () { return this.userStore.getUser }, @@ -97,10 +187,10 @@ export default { return this.userStore.getRoles }, identifiers () { - if (!this.view) { + if (!this.cachedView) { return [] } - return this.view.identifiers.filter(s => s.view_id === Number(this.$route.params.view_id)) + return this.cachedView.identifiers.filter(s => s.view_id === Number(this.$route.params.view_id)) }, identifier () { /* mount pid */ @@ -115,10 +205,10 @@ export default { return this.identifiers[0] }, title () { - if (!this.view) { + if (!this.cachedView) { return null } - return this.view.name + return this.cachedView.name } }, methods: { @@ -142,6 +232,12 @@ export default { .finally(() => { this.loadingDelete = false }) + }, + close ({success}) { + this.updateViewDialog = false + if (success) { + this.cacheStore.reloadDatabase() + } } } } diff --git a/dbrepo-ui/composables/image-service.ts b/dbrepo-ui/composables/image-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..9af0304a1620bfda6aa801da61a7de9cb3cb647d --- /dev/null +++ b/dbrepo-ui/composables/image-service.ts @@ -0,0 +1,21 @@ +import {axiosErrorToApiError} from '@/utils' + +export const useImageService = (): any => { + async function findById(id: number): Promise<ImageDto> { + const axios = useAxiosInstance(); + console.debug('find image by id', id); + return new Promise<ImageDto>((resolve, reject) => { + axios.get<ImageDto>(`/api/image/${id}`) + .then((response) => { + console.info('Found image') + resolve(response.data) + }) + .catch((error) => { + console.error('Failed to find image', error) + reject(axiosErrorToApiError(error)) + }) + }) + } + + return {findById} +} diff --git a/dbrepo-ui/composables/table-service.ts b/dbrepo-ui/composables/table-service.ts index 3d87e68d4febed8b825a56b1aada946bd6b0f4d5..35c53edd03077e931b105afba02db404422b13ce 100644 --- a/dbrepo-ui/composables/table-service.ts +++ b/dbrepo-ui/composables/table-service.ts @@ -35,7 +35,7 @@ export const useTableService = (): any => { }) } - async function update(databaseId: number, tableId: number, columnId: number, data: ColumnSemanticsUpdateDto): Promise<ColumnDto> { + async function updateSemantics(databaseId: number, tableId: number, columnId: number, data: ColumnSemanticsUpdateDto): Promise<ColumnDto> { const axios = useAxiosInstance() console.debug('update column with id', columnId, 'table with id', tableId, 'in database with id', databaseId); return new Promise<ColumnDto>((resolve, reject) => { @@ -51,6 +51,22 @@ export const useTableService = (): any => { }) } + async function update(databaseId: number, tableId: number, data: TableUpdateDto): Promise<TableDto> { + const axios = useAxiosInstance() + console.debug('update table with id', tableId, 'in database with id', databaseId); + return new Promise<TableDto>((resolve, reject) => { + axios.put<TableDto>(`/api/database/${databaseId}/table/${tableId}`, data) + .then((response) => { + console.info('Updated table with id', tableId, 'in database with id', databaseId); + resolve(response.data) + }) + .catch((error) => { + console.error('Failed to update table', error) + reject(axiosErrorToApiError(error)) + }) + }) + } + async function importCsv(databaseId: number, tableId: number, data: ImportCsv): Promise<ImportDto> { const axios = useAxiosInstance() console.debug('import csv to table with id', tableId, 'in database with id', databaseId); diff --git a/dbrepo-ui/composables/view-service.ts b/dbrepo-ui/composables/view-service.ts index 5b3a25a149813ddf30f622fcb3d51fccb31f6730..9c9a6792d37dfb7bccd68f58f9640b1de4fddc11 100644 --- a/dbrepo-ui/composables/view-service.ts +++ b/dbrepo-ui/composables/view-service.ts @@ -18,6 +18,22 @@ export const useViewService = (): any => { }) } + async function findOne(databaseId: number, viewId: number): Promise<ViewDto> { + const axios = useAxiosInstance() + console.debug('get view with id', viewId, 'in database with id', databaseId) + return new Promise<ViewDto>((resolve, reject) => { + axios.get<ViewDto>(`/api/database/${databaseId}/view/${viewId}`) + .then((response) => { + console.info('Deleted view with id', viewId, 'in database with id', databaseId) + resolve(response.data) + }) + .catch((error) => { + console.error('Failed to delete view', error) + reject(axiosErrorToApiError(error)) + }) + }) + } + async function create(databaseId: number, payload: ViewCreateDto): Promise<ViewDto> { const axios = useAxiosInstance() console.debug('create view in database with id', databaseId) @@ -34,11 +50,27 @@ export const useViewService = (): any => { }) } + async function update(databaseId: number, viewId: number, payload: ViewUpdateDto): Promise<ViewDto> { + const axios = useAxiosInstance() + console.debug('update view with id', viewId) + return new Promise<ViewDto>((resolve, reject) => { + axios.put<ViewDto>(`/api/database/${databaseId}/view/${viewId}`, payload) + .then((response) => { + console.info('Update view with id', viewId) + resolve(response.data) + }) + .catch((error) => { + console.error('Failed to update view', error) + reject(axiosErrorToApiError(error)) + }) + }) + } + async function reExecuteData(databaseId: number, viewId: number, page: number | null, size: number | null): Promise<QueryResultDto> { const axios = useAxiosInstance() console.debug('re-execute view with id', viewId, 'in database with id', databaseId) return new Promise<QueryResultDto>((resolve, reject) => { - axios.get<QueryResultDto>(`/api/database/${databaseId}/view/${viewId}/data`, { params: {page, size} }) + axios.get<QueryResultDto>(`/api/database/${databaseId}/view/${viewId}/data`, {params: {page, size}}) .then((response) => { console.info('Re-executed view with id', viewId, 'in database with id', databaseId) resolve(response.data) @@ -89,5 +121,5 @@ export const useViewService = (): any => { }) } - return {remove, create, reExecuteData, reExecuteCount, exportData} + return {remove, findOne, create, update, reExecuteData, reExecuteCount, exportData} } diff --git a/dbrepo-ui/dto/index.ts b/dbrepo-ui/dto/index.ts index ba4c41304209a08200b99de17077eed49d63e357..b84c6c897d9b397c63eb3a4361135ea2714f7e39 100644 --- a/dbrepo-ui/dto/index.ts +++ b/dbrepo-ui/dto/index.ts @@ -93,10 +93,17 @@ interface TableBriefDto { id: number; name: string; description: string; - owner: UserBriefDto; - columns: ColumnBriefDto[]; internal_name: string; is_versioned: boolean; + is_public: boolean; + is_schema_public: boolean; + owned_by: string; +} + +interface TableUpdateDto { + description: string; + is_public: boolean; + is_schema_public: boolean; } interface ColumnBriefDto { @@ -378,6 +385,7 @@ interface DatabaseModifyAccessDto { interface DatabaseModifyVisibilityDto { is_public: boolean; + is_schema_public: boolean; } interface DatabaseTransferDto { @@ -394,6 +402,10 @@ interface ViewCreateDto { is_public: boolean; } +interface ViewUpdateDto { + is_public: boolean; +} + interface QueryDto { id: number; creator: UserDto; @@ -500,6 +512,20 @@ interface ImageBriefDto { jdbc_method: string; } +interface ImageDto { + id: number; + registry: string; + name: string; + version: string; + driver_class: string; + dialect: string; + jdbc_method: string; + default: boolean; + default_port: number; + data_types: DataTypeDto[]; + operators: OperatorDto[]; +} + interface UserUpdateDto { firstname: string; lastname: string; diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index 8b6807bdbf24edd94b08087ef538d499e47784eb..185576248c411e6e0ff3cc5db2866d602f0bd96a 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -35,7 +35,9 @@ "loading": "Loading", "view": "View", "modify": "Modify", - "help": "Help" + "help": "Help", + "visibility": "Visibility", + "update": "Update" }, "pages": { "identifier": { @@ -279,25 +281,32 @@ "title": "ID" }, "broker": { - "title": "Live Data" + "title": "Advanced Data Import Details" }, "connection": { - "title": "Connection Details", + "title": "Connection(s)", "secure": "encrypted", "permissions": { "write": "You can write to this table", "read": "You can read all contents of this table" } }, + "visibility": { + "title": "Visibility", + "open": "Open", + "data": "Data is public", + "schema": "Schema is public", + "closed": "Closed" + }, "description": { "title": "Description", "empty": "(no description)" }, "exchange": { - "title": "Exchange" + "title": "Exchange Name" }, "queue": { - "title": "Queue" + "title": "Queue Name" }, "routing-key": { "title": "Routing Key" @@ -591,7 +600,11 @@ "title": "Internal Name" }, "visibility": { - "title": "Visibility" + "title": "Visibility", + "open": "Open", + "data": "Data is public", + "schema": "Schema is public", + "closed": "Closed" }, "size": { "title": "Size" @@ -640,6 +653,14 @@ "label": "Engine", "hint": "Required" }, + "data": { + "label": "Data Visibility", + "hint": "Required" + }, + "schema": { + "label": "Schema Visibility", + "hint": "Required" + }, "submit": { "text": "Create" }, @@ -696,10 +717,16 @@ }, "visibility": { "title": "Visibility", - "subtitle": "Private databases hide the data while metadata is still visible. Public databases are fully transparent", - "visibility": { - "label": "Database Visibility", - "hint": "Required" + "subtitle": "", + "data": { + "label": "Data Visibility", + "hint": "Required", + "help": "Public = visible to anyone, Private = visible only to designated users" + }, + "schema": { + "label": "Schema Visibility", + "hint": "Required", + "help": "Public = visible to anyone, Private = visible only to designated users" }, "submit": { "text": "Modify" @@ -877,8 +904,8 @@ "query": { "title": "Statement" }, - "creator": { - "title": "Creator" + "owner": { + "title": "Owner" }, "creation": { "title": "Creation" @@ -900,11 +927,6 @@ "columns": { "label": "Data Columns", "hint": "Required" - }, - "visibility": { - "label": "Data Visibility", - "warn": "Only people with at least read access can view the data", - "hint": "Required. When private, the view metadata will still be public but the data will only be visible to people with at least read access to this database" } } } @@ -1257,7 +1279,8 @@ }, "table": { "created": "Successfully created table", - "semantics": "Successfully assigned semantic instance" + "semantics": "Successfully assigned semantic instance", + "updated": "Successfully updated table" }, "schema": { "tables": "Successfully refreshed database tables metadata.", @@ -1287,7 +1310,8 @@ }, "view": { "create": "Successfully created view", - "delete": "Successfully deleted view" + "delete": "Successfully deleted view", + "modified": "Successfully modified view visibility" }, "subset": { "create": "Successfully created subset" @@ -1326,7 +1350,7 @@ }, "import-csv": { "permanent": "Import", - "xl": "CSV" + "xl": "Dataset" }, "dashboard": { "permanent": "Visualize", @@ -1340,6 +1364,10 @@ "permanent": "View", "xl": "Create" }, + "update-table": { + "permanent": "Table", + "xl": "Update" + }, "create-table": { "permanent": "Table", "xl": "Create" diff --git a/dbrepo-ui/pages/database/[database_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/info.vue index d012f7ef3418b0235d04f46cf49ec138ed9634a2..5b739987fdcaa422d31e0fc2545bcdeacbdf38ad 100644 --- a/dbrepo-ui/pages/database/[database_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/info.vue @@ -60,9 +60,7 @@ <v-list-item :title="$t('pages.database.visibility.title')" density="compact"> - <div> - {{ database.is_public ? 'Public' : 'Private' }} - </div> + {{ databaseVisibility }} </v-list-item> <v-list-item :title="$t('pages.database.size.title')" @@ -80,13 +78,6 @@ :other-user="user" /> </div> </v-list-item> - <v-list-item - :title="$t('pages.database.created.title')" - density="compact"> - <div> - {{ createdUTC }} - </div> - </v-list-item> <v-list-item v-if="access && access.type" :title="$t('pages.database.subpages.access.title')" @@ -290,12 +281,6 @@ export default { pid () { return this.$route.query.pid }, - createdUTC () { - if (!this.database) { - return - } - return formatTimestampUTCLabel(this.database.created) - }, internal_name () { if (!this.database) { return @@ -370,6 +355,18 @@ export default { this.database.tables.forEach((t) => { sum += t.data_length }) return sizeToHumanLabel(sum) }, + databaseVisibility () { + if (!this.database) { + return null + } + if (this.database.is_public && this.database.is_schema_public) { + return this.$t('pages.database.visibility.open') + } + if (!this.database.is_public && !this.database.is_schema_public) { + return this.$t('pages.database.visibility.closed') + } + return this.database.is_public ? this.$t('pages.database.visibility.data') : this.$t('pages.database.visibility.schema') + }, previewImage () { if (!this.database) { return null diff --git a/dbrepo-ui/pages/database/[database_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/settings.vue index 65dd3b03bfc3ec57447ebbea6dcd24635f303693..b3d5b634613c358b01bc13d53f270fe7ef7e4d2a 100644 --- a/dbrepo-ui/pages/database/[database_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/settings.vue @@ -138,10 +138,50 @@ v-model="modifyVisibility.is_public" :items="visibility" :variant="inputVariant" - :label="$t('pages.database.subpages.settings.visibility.visibility.label')" - :hint="$t('pages.database.subpages.settings.visibility.visibility.hint')" + :label="$t('pages.database.subpages.settings.visibility.data.label')" + :hint="$t('pages.database.subpages.settings.visibility.data.hint')" persistent-hint - name="visibility" /> + name="visibility"> + <template + v-slot:append> + <v-tooltip + location="bottom"> + <template + v-slot:activator="{ props }"> + <v-icon + v-bind="props" + icon="mdi-help-circle-outline" /> + </template> + {{ $t('pages.database.subpages.settings.visibility.data.help') }} + </v-tooltip> + </template> + </v-select> + </v-col> + </v-row> + <v-row> + <v-col md="8"> + <v-select + v-model="modifyVisibility.is_schema_public" + :items="visibility" + :variant="inputVariant" + :label="$t('pages.database.subpages.settings.visibility.schema.label')" + :hint="$t('pages.database.subpages.settings.visibility.schema.hint')" + persistent-hint + name="schema-visibility"> + <template + v-slot:append> + <v-tooltip + location="bottom"> + <template + v-slot:activator="{ props }"> + <v-icon + v-bind="props" + icon="mdi-help-circle-outline" /> + </template> + {{ $t('pages.database.subpages.settings.visibility.schema.help') }} + </v-tooltip> + </template> + </v-select> </v-col> </v-row> <v-row> @@ -253,7 +293,8 @@ export default { editAccessDialog: false, editVisibilityDialog: false, modifyVisibility: { - is_public: null + is_public: null, + is_schema_public: null }, modifyOwner: { id: null @@ -349,7 +390,7 @@ export default { if (!this.modifyVisibility || !this.database) { return false } - return this.modifyVisibility.is_public === this.database.is_public + return this.modifyVisibility.is_public === this.database.is_public && this.modifyVisibility.is_schema_public === this.database.is_schema_public }, canModifyVisibility () { if (!this.isOwner) { @@ -434,6 +475,7 @@ export default { return } this.modifyVisibility.is_public = this.database.is_public + this.modifyVisibility.is_schema_public = this.database.is_schema_public this.modifyOwner.id = this.database.owner.id }, methods: { diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue index 1be05e4bf1e08a26d44ff833588b1a3cca9e85ac..08049eabe672ab1f9f4601a61ad9db7268ddc67e 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue @@ -1,8 +1,8 @@ <template> - <div> + <div + v-if="canViewTableData"> <TableToolbar /> <v-toolbar - v-if="canViewTableData" :color="versionColor" :title="title" flat> @@ -142,6 +142,7 @@ export default { loadingData: false, loadingCount: false, loadingDelete: false, + loadingTable: false, addTupleDialog: false, editTupleDialog: false, total: 0, @@ -153,6 +154,7 @@ export default { dateMenu: false, timeMenu: false, selection: [], + columns: [], pickVersionDialog: null, version: null, lastReload: new Date(), @@ -212,14 +214,20 @@ export default { access () { return this.userStore.getAccess }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, title () { return (this.version ? this.$t('toolbars.database.history') : this.$t('toolbars.database.current')) + ' ' + this.versionFormatted }, blobColumns () { - if (!this.table || !this.table.columns) { + if (!this.columns) { return [] } - return this.table.columns.filter(c => this.isFileField(c)).map(c => 'item.' + c.internal_name) + return this.columns.filter(c => this.isFileField(c)).map(c => 'item.' + c.internal_name) }, versionColor () { return this.version ? 'primary' : 'secondary' @@ -247,16 +255,16 @@ export default { }, canViewTableData () { /* view when database is public or when private: 1) view-table-data role present 2) access is at least read */ - if (!this.database) { + if (!this.table) { return false } - if (this.database.is_public) { + if (this.table.is_public) { return true } - if (!this.roles || !this.roles.includes('view-table-data') || !this.access) { + if (!this.roles || !this.roles.includes('view-table-data')) { return false } - return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all' + return this.hasReadAccess }, canAddTuple () { if (!this.roles) { @@ -284,21 +292,15 @@ export default { version () { this.loadCount() this.reload() - }, - table (newTable, oldTable) { - if (newTable !== oldTable && oldTable === null) { - this.loadProperties() - } } }, mounted () { - this.loadProperties() this.loadCount() }, methods: { addTuple () { this.tuple = {} - this.table.columns.forEach((c) => { + this.columns.forEach((c) => { this.tuple[c.internal_name] = null }) this.addTupleDialog = true @@ -313,14 +315,14 @@ export default { for (const select of this.selection) { /* remove in container */ const constraints = {} - this.table.columns + this.columns .filter(c => c.is_primary_key) .forEach((c) => { constraints[c.internal_name] = select[c.internal_name] }) if (Object.keys(constraints).length === 0) { console.warn(`Table with id ${this.$route.params.table_id} does not have primary key(s): attempt to delete by values`) - this.table.columns + this.columns .forEach((c) => { constraints[c.internal_name] = select[c.internal_name] }) @@ -402,27 +404,6 @@ export default { } this.pickVersionDialog = false }, - loadProperties () { - if (!this.table || this.headers.length > 0) { - return - } - try { - this.headers = [] - this.table.columns.map((c) => { - return { - value: c.internal_name, - title: c.internal_name, - sortable: false - } - }).forEach(header => this.headers.push(header)) - this.dateColumns = this.table.columns.filter(c => (c.column_type === 'date' || c.column_type === 'timestamp')) - console.debug('date columns are', this.dateColumns) - } catch ({code}) { - const toast = useToastInstance() - toast.error(this.$t(code)) - } - this.loading = false - }, reload () { this.lastReload = new Date() this.loadData({ page: this.options.page, itemsPerPage: this.options.itemsPerPage, sortBy: null}) @@ -450,7 +431,6 @@ export default { .then((data) => { this.rows = data.result.map((row) => { for (const col in row) { - const column = this.table.columns.filter(c => c.internal_name === col)[0] const columnDefinition = this.dateColumns.filter(c => c.internal_name === col) if (columnDefinition.length > 0) { if (columnDefinition[0].column_type === 'date') { @@ -462,6 +442,13 @@ export default { } return row }) + this.headers = data.headers.map(h => { + return { + value: Object.keys(h)[0], + title: Object.keys(h)[0], + sortable: false + } + }) this.loadingData = false }) .catch(({code, message}) => { diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue index e109a7db3e2bb35926c5a8f87d700185286d4d53..5baedc281c94951ae7072f287657c9ec4c5c3425 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue @@ -22,42 +22,45 @@ :title="$t('pages.table.title')"> <v-card-text> <v-skeleton-loader - v-if="!table" + v-if="!cachedTable" type="list-item-three-line" width="50%" /> <v-list - v-if="table" + v-if="cachedTable" dense> <v-list-item :title="$t('pages.table.id.title')"> - {{ table.id }} + {{ cachedTable.id }} </v-list-item> <v-list-item :title="$t('pages.table.name.title')"> - {{ table.internal_name }} + {{ cachedTable.internal_name }} </v-list-item> <v-list-item + :title="$t('pages.table.visibility.title')"> + {{ databaseVisibility }} + </v-list-item> + <v-list-item + v-if="table" :title="$t('pages.table.size.title')"> {{ sizeToHumanLabel(table.data_length) }} </v-list-item> <v-list-item + v-if="table" :title="$t('pages.table.result-rows.title')"> {{ table.num_rows }} </v-list-item> <v-list-item :title="$t('pages.table.description.title')"> - {{ hasDescription ? table.description : $t('pages.table.description.empty') }} + {{ hasDescription ? cachedTable.description : $t('pages.table.description.empty') }} </v-list-item> <v-list-item :title="$t('pages.table.owner.title')"> <UserBadge - :user="table.creator" + v-if="table" + :user="table.owner" :other-user="user" /> </v-list-item> - <v-list-item - :title="$t('pages.table.creation.title')"> - {{ createdUTC }} - </v-list-item> <v-list-item v-if="accessDescription" :title="$t('pages.database.subpages.access.title')"> @@ -73,13 +76,31 @@ </v-badge> <span v-else> - {{ accessDescription}} + {{ accessDescription }} </span> </span> </v-list-item> </v-list> </v-card-text> </v-card> + <v-divider /> + <v-card + :title="$t('pages.database.title')" + variant="flat"> + <v-card-text> + <v-list dense> + <v-list-item + v-if="database" + :title="$t('pages.database.name.title')"> + <NuxtLink + class="text-primary" + :to="`/database/${$route.params.database_id}`"> + {{ database.internal_name }} + </NuxtLink> + </v-list-item> + </v-list> + </v-card-text> + </v-card> <v-divider v-if="canWrite && canWriteQueues" /> <v-card @@ -125,29 +146,6 @@ </v-list> </v-card-text> </v-card> - <v-divider /> - <v-card - :title="$t('pages.database.title')" - variant="flat"> - <v-card-text> - <v-list dense> - <v-list-item - v-if="database" - :title="$t('pages.database.visibility.title')"> - {{ database.is_public ? $t('toolbars.database.public') : $t('toolbars.database.private') }} - </v-list-item> - <v-list-item - v-if="database" - :title="$t('pages.database.name.title')"> - <NuxtLink - class="text-primary" - :to="`/database/${database.id}`"> - {{ database.internal_name }} - </NuxtLink> - </v-list-item> - </v-list> - </v-card-text> - </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> </template> @@ -182,6 +180,7 @@ export default { return { selection: [], consumers: [], + table: null, items: [ { title: this.$t('navigation.databases'), @@ -207,9 +206,7 @@ export default { ], headers: [], dateColumns: [], - loadingConsumers: false, - loadingExchange: false, - loadingQueue: false, + loading: false, exchange: null, queue: null, userStore: useUserStore(), @@ -226,7 +223,7 @@ export default { database () { return this.cacheStore.getDatabase }, - table () { + cachedTable () { return this.cacheStore.getTable }, roles () { @@ -245,19 +242,13 @@ export default { if (!this.table || !this.user || !this.access) { return false } - return (this.access.type === 'write_own' && this.table.owner.id === this.user.id) || this.access.type === 'write_all' - }, - createdUTC () { - if (this.table.created === undefined || this.table.created === null) { - return null - } - return formatTimestampUTCLabel(this.table.created) + return (this.access.type === 'write_own' && this.cachedTable.owned_by === this.user.id) || this.access.type === 'write_all' }, access () { return this.userStore.getAccess }, hasDescription () { - return this.table && this.table.description + return this.table && this.cachedTable.description }, canWriteQueues () { if (!this.roles) { @@ -278,7 +269,7 @@ export default { if (!this.user) { return this.identifiers.filter(i => i.status === 'published') } - return this.identifiers.filter(i => i.status === 'published' || i.creator.id === this.user.id) + return this.identifiers.filter(i => i.status === 'published' || i.owned_by === this.user.id) }, identifier () { if (this.pid) { @@ -321,6 +312,40 @@ export default { } else if (this.canRead) { return this.$t('pages.table.connection.permissions.read') } + }, + databaseVisibility () { + if (!this.database) { + return null + } + if (this.database.is_public && this.cachedTable.is_schema_public) { + return this.$t('pages.table.visibility.open') + } + if (!this.database.is_public && !this.cachedTable.is_schema_public) { + return this.$t('pages.table.visibility.closed') + } + return this.database.is_public ? this.$t('pages.database.visibility.data') : this.$t('pages.database.visibility.schema') + } + }, + mounted () { + this.fetchTable() + }, + methods: { + fetchTable () { + this.loading = true + const tableService = useTableService() + tableService.findOne(this.$route.params.database_id, this.$route.params.table_id) + .then((table) => { + this.loading = false + this.table = table + }) + .catch(({code}) => { + this.loading = false + const toast = useToastInstance() + toast.error(this.$t(code)) + }) + .finally(() => { + this.loading = false + }) } } } diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue index 65b6034348399844ddc8f195da9f9cc828056efa..5364b6c8997e4e336852f02747f2b7bfc6b08ee7 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue @@ -1,5 +1,6 @@ <template> - <div> + <div + v-if="canViewSchema"> <TableToolbar :selection="selection" /> <v-toolbar @@ -184,9 +185,27 @@ export default { access () { return this.userStore.getAccess }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, roles () { return this.userStore.getRoles }, + canViewSchema () { + if (!this.table) { + return false + } + if (this.table.is_schema_public) { + return true + } + if (!this.user) { + return false + } + return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id + }, primaryKeysColumns () { return this.table.constraints.primary_key.map(pk => pk.column.internal_name).join(', ') }, diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue index d77ea941349d44e419c055466055fe7c16a704ad..29773c24d98801f1c710a87e2cf513a842f562eb 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue @@ -47,7 +47,8 @@ :disabled="step > 4" @submit.prevent="submit"> <v-container> - <v-row dense> + <v-row + dense> <v-col md="4"> <v-text-field v-model="tableCreate.name" @@ -80,7 +81,8 @@ :label="$t('pages.table.subpages.import.generated.label')"/> </v-col> </v-row> - <v-row dense> + <v-row + dense> <v-col md="8"> <v-textarea v-model="tableCreate.description" @@ -97,6 +99,41 @@ :label="$t('pages.table.subpages.import.description.label')"/> </v-col> </v-row> + <v-row + dense> + <v-col + md="4"> + <v-select + v-model="tableCreate.is_public" + name="public" + :label="$t('pages.database.subpages.create.data.label')" + :hint="$t('pages.database.subpages.create.data.hint')" + persistent-hint + :variant="inputVariant" + :items="visibilityOptions" + item-title="name" + item-value="value" + :rules="[v => v !== null || $t('validation.required')]" + required> + </v-select> + </v-col> + <v-col + md="4"> + <v-select + v-model="tableCreate.is_schema_public" + name="schema-public" + :label="$t('pages.database.subpages.create.schema.label')" + :hint="$t('pages.database.subpages.create.schema.hint')" + persistent-hint + :variant="inputVariant" + :items="visibilityOptions" + item-title="name" + item-value="value" + :rules="[v => v !== null || $t('validation.required')]" + required> + </v-select> + </v-col> + </v-row> </v-container> </v-form> </v-stepper-window> @@ -198,6 +235,16 @@ export default { loadingImport: false, fileModel: null, rowCount: null, + visibilityOptions: [ + { + name: this.$t('toolbars.database.public'), + value: true + }, + { + name: this.$t('toolbars.database.private'), + value: false + } + ], file: { filename: null, path: null @@ -237,6 +284,8 @@ export default { tables: [], tableCreate: { name: null, + is_public: true, + is_schema_public: true, description: '', columns: [] }, @@ -254,6 +303,13 @@ export default { cacheStore: useCacheStore() } }, + mounted () { + if (!this.database) { + return + } + this.tableCreate.is_public = this.database.is_public + this.tableCreate.is_schema_public = this.database.is_schema_public + }, computed: { user() { return this.userStore.getUser diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue index 57f943f22b36ee21f858f15120d5ca812b8b8bfc..458294d1c710c35b6ed2e6e8638ce8710996d890 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue @@ -273,10 +273,7 @@ export default { .catch(({code, message}) => { this.loading = false const toast = useToastInstance() - if (typeof code !== 'string') { - return - } - toast.error(message) + toast.error(this.$t(`${code}: ${message}`)) }) .finally(() => { this.loading = false diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue index bc460da08bc4fe45d180fb81367e88f6eebf6b1f..11e91baabccca6b90241b56c75e396c380acba38 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue @@ -1,7 +1,8 @@ <template> - <div> + <div + v-if="canViewData"> <ViewToolbar - v-if="view" /> + v-if="cachedView" /> <v-toolbar color="secondary" :title="$t('toolbars.database.current')" @@ -69,14 +70,18 @@ export default { disabled: true } ], - cacheStore: useCacheStore() + cacheStore: useCacheStore(), + userStore: useUserStore() } }, computed: { + user () { + return this.userStore.getUser + }, database () { return this.cacheStore.getDatabase }, - view () { + cachedView () { if (!this.database) { return null } @@ -85,20 +90,41 @@ export default { access () { return this.userStore.getAccess }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, canDownload () { if (!this.view) { return false } - if (this.view.is_public) { + if (this.cachedView.is_public) { return true } if (!this.access) { return false } return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all' - } + }, + canViewData () { + if (!this.cachedView) { + return false + } + if (this.cachedView.is_public) { + return true + } + if (!this.user) { + return false + } + return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id + }, }, mounted () { + if (!this.canViewData) { + return + } this.reload() }, methods: { diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue index 064fa5f3f20f0c9e1be84fc010e215745834d278..364516f45f29209c56748add8bff0da310de7d75 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue @@ -4,7 +4,7 @@ <v-window v-model="tab"> <v-window-item - v-if="view"> + v-if="cachedView"> <v-card variant="flat"> <Summary v-if="hasIdentifier" @@ -23,30 +23,35 @@ variant="flat"> <v-card-text> <v-list - v-if="view" + v-if="cachedView" dense> <v-list-item :title="$t('pages.view.name.title')"> - {{ view.internal_name }} + {{ cachedView.internal_name }} </v-list-item> <v-list-item :title="$t('pages.view.query.title')"> - <pre>{{ view.query }}</pre> + <pre>{{ cachedView.query }}</pre> </v-list-item> <v-list-item - :title="$t('pages.view.creator.title')"> + :title="$t('pages.view.owner.title')"> <UserBadge - :user="view.creator" + v-if="view" + :user="view.owner" :other-user="user" /> + <v-skeleton-loader + v-else + type="subtitle" + width="200" /> </v-list-item> <v-list-item - v-if="view.created" + v-if="cachedView.created" :title="$t('pages.view.creation.title')"> - {{ formatUTC(view.created) }} + {{ formatUTC(cachedView.created) }} </v-list-item> <v-list-item :title="$t('pages.view.visibility.title')"> - {{ view.is_public ? $t('toolbars.database.public') : $t('toolbars.database.private') }} + {{ viewVisibility }} </v-list-item> </v-list> </v-card-text> @@ -107,6 +112,8 @@ export default { data () { return { tab: 0, + loadingView: false, + view: null, items: [ { title: this.$t('navigation.databases'), @@ -145,7 +152,7 @@ export default { database () { return this.cacheStore.getDatabase }, - view () { + cachedView () { if (!this.database) { return null } @@ -196,11 +203,43 @@ export default { } const userService = useUserService() return userService.userToFullName(this.view.creator) + }, + viewVisibility () { + if (!this.cachedView) { + return null + } + if (this.cachedView.is_public && this.cachedView.is_schema_public) { + return this.$t('pages.database.visibility.open') + } + if (!this.cachedView.is_public && !this.cachedView.is_schema_public) { + return this.$t('pages.database.visibility.closed') + } + return this.cachedView.is_public ? this.$t('pages.database.visibility.data') : this.$t('pages.database.visibility.schema') } }, + mounted () { + this.fetchView() + }, methods: { formatUTC (timestamp) { return formatTimestampUTCLabel(timestamp) + }, + fetchView () { + this.loadingView = true + const viewService = useViewService() + viewService.findOne(this.$route.params.database_id, this.$route.params.view_id) + .then((view) => { + this.view = view + this.loadingView = false + }) + .catch(({code}) => { + this.loadingView = false + const toast = useToastInstance() + toast.error(this.$t(code)) + }) + .finally(() => { + this.loadingView = false + }) } } } @@ -222,16 +261,4 @@ pre { #back-btn::before { opacity: 0; } -.skeleton-large > div { - width: 400px !important; -} -.skeleton-medium > div { - width: 200px !important; -} -.skeleton-small > div { - width: 100px !important; -} -.skeleton-xsmall > div { - width: 50px !important; -} </style> diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue new file mode 100644 index 0000000000000000000000000000000000000000..b3352010b26653c7b3cb766734b6eb0a2e64dc44 --- /dev/null +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue @@ -0,0 +1,202 @@ +<template> + <div + v-if="canViewSchema"> + <ViewToolbar /> + <v-toolbar + color="secondary" + :title="$t('pages.table.subpages.schema.title')" + variant="flat" /> + <v-card + variant="flat" + rounded="0" + tile> + <v-data-table + v-if="view" + class="full-width" + disable-sort + :loading="loading" + hide-default-footer + :items-per-page="-1" + :headers="headers" + :items="view.columns"> + <template v-slot:item.is_null_allowed="{ item }"> + <span + v-if="item.is_null_allowed"> + {{ $t('pages.table.subpages.schema.bullet') }} + </span> + {{ item.is_null_allowed }} + </template> + <template v-slot:item.extra="{ item }"> + <pre>{{ extra(item) }}</pre> + </template> + <template v-slot:item.column_concept="{ item }"> + <a + v-if="hasConcept(item)" + :href="item.concept.uri"> + {{ item.concept.name ? item.concept.name : item.concept.uri }} + </a> + </template> + <template v-slot:item.column_unit="{ item }"> + <a + v-if="hasUnit(item)" + :href="item.unit.uri"> + {{ item.unit.name ? item.unit.name : item.unit.uri }} + </a> + </template> + </v-data-table> + </v-card> + <v-breadcrumbs + :items="items" + class="pa-0 mt-2" /> + </div> +</template> + +<script> +import TableToolbar from '@/components/table/TableToolbar.vue' +import { useUserStore } from '@/stores/user' +import { useCacheStore } from '@/stores/cache' + +export default { + components: { + TableToolbar + }, + data () { + return { + loading: false, + view: null, + items: [ + { + title: this.$t('navigation.databases'), + to: '/database' + }, + { + title: `${this.$route.params.database_id}`, + to: `/database/${this.$route.params.database_id}/info` + }, + { + title: this.$t('navigation.views'), + to: `/database/${this.$route.params.database_id}/view` + }, + { + title: `${this.$route.params.view_id}`, + to: `/database/${this.$route.params.database_id}/view/${this.$route.params.view_id}` + }, + { + title: this.$t('navigation.schema'), + to: `/database/${this.$route.params.database_id}/view/${this.$route.params.view_id}/schema`, + disabled: true + } + ], + headers: [ + { value: 'internal_name', title: this.$t('pages.table.subpages.schema.internal-name.title') }, + { value: 'column_type', title: this.$t('pages.table.subpages.schema.column-type.title') }, + { value: 'extra', title: this.$t('pages.table.subpages.schema.extra.title') }, + { value: 'column_concept', title: this.$t('pages.table.subpages.schema.concept.title') }, + { value: 'column_unit', title: this.$t('pages.table.subpages.schema.unit.title') }, + { value: 'is_null_allowed', title: this.$t('pages.table.subpages.schema.nullable.title') }, + { value: 'description', title: this.$t('pages.table.subpages.schema.description.title') }, + ], + userStore: useUserStore(), + cacheStore: useCacheStore() + } + }, + mounted () { + this.fetchView() + }, + computed: { + user () { + return this.userStore.getUser + }, + database () { + return this.cacheStore.getDatabase + }, + access () { + return this.userStore.getAccess + }, + hasReadAccess () { + if (!this.access) { + return false + } + return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own' + }, + cachedView () { + if (!this.database) { + return null + } + return this.database.views.filter(v => v.id === Number(this.$route.params.view_id))[0] + }, + canViewSchema () { + if (!this.cachedView) { + return false + } + if (this.cachedView.is_schema_public) { + return true + } + if (!this.user) { + return false + } + return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id + }, + roles () { + return this.userStore.getRoles + }, + inputVariant () { + const runtimeConfig = useRuntimeConfig() + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal + }, + buttonVariant () { + const runtimeConfig = useRuntimeConfig() + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal + } + }, + methods: { + extra (column) { + if (column.column_type === 'float') { + return `precision=${column.size}` + } else if (['decimal', 'double'].includes(column.column_type)) { + let extra = '' + if (column.size !== null) { + extra += `size=${column.size}` + } + if (column.d !== null) { + if (extra.length > 0) { + extra += ', ' + } + extra += `d=${column.d}` + } + return extra + } else if (column.column_type === 'enum') { + return `(${column.enums.join(', ')})` + } else if (column.column_type === 'set') { + return `(${column.sets.join(', ')})` + } else if (['int', 'char', 'varchar', 'binary', 'varbinary', 'tinyint', 'size="small"int', 'mediumint', 'bigint'].includes(column.column_type)) { + return column.size !== null ? `size=${column.size}` : '' + } + return null + }, + hasUnit (item) { + return item.unit && 'uri' in item.unit + }, + hasConcept (item) { + return item.concept && 'uri' in item.concept + }, + fetchView () { + this.loading = true + const viewService = useViewService() + viewService.findOne(this.$route.params.database_id, this.$route.params.view_id) + .then((view) => { + this.view = view + this.loading = false + }) + .catch(({code}) => { + this.loading = false + const toast = useToastInstance() + toast.error(this.$t(code)) + }) + .finally(() => { + this.loading = false + }) + } + } +} +</script> diff --git a/dbrepo-ui/pages/signup.vue b/dbrepo-ui/pages/signup.vue index 54c00602256c7815d8aff0b255214e66836bc727..2548a6dfa9b749853ca24b6784235fc14fcb1b78 100644 --- a/dbrepo-ui/pages/signup.vue +++ b/dbrepo-ui/pages/signup.vue @@ -130,9 +130,6 @@ export default { .catch(({code}) => { this.loading = false const toast = useToastInstance() - if (typeof code !== 'string') { - return - } toast.error(this.$t(code)) }) .finally(() => { diff --git a/docker-compose.yml b/docker-compose.yml index 30f42b197e1d5d29ce4af625b1ce381532ef7b9e..6e2957b195f292ab2c2ad68f523c7ab19041ade0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -109,6 +109,26 @@ services: logging: driver: json-file + dbrepo-auth-service-init: + init: true + restart: "no" + image: dbrepo-auth-service-init:latest + build: + context: ./dbrepo-auth-service/init + network: host + environment: + AUTH_SERVICE_ADMIN: ${AUTH_SERVICE_ADMIN:-admin} + AUTH_SERVICE_ADMIN_PASSWORD: ${AUTH_SERVICE_ADMIN_PASSWORD:-admin} + AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} + SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" + depends_on: + dbrepo-auth-service: + condition: service_healthy + dbrepo-metadata-db: + condition: service_healthy + logging: + driver: json-file + dbrepo-metadata-service: restart: "no" container_name: dbrepo-metadata-service diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index abb0c1821abb5ac68d0a92bc6eb7913cf0b5a409..19585b20f9d8e41ccd9b2e9a08b41c699fe40663 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -7,8 +7,8 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.5.2" -appVersion: "1.5.2" +version: "1.6.0" +appVersion: "1.6.0" keywords: - dbrepo maintainers: diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index 759e67bf4362bb0b53b49d3d24e24db396e37ad9..f8c6b12d75a6390324de7bd994e69a6b890825e7 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -11,7 +11,7 @@ sample [ for your deployment and update the variables, especially `hostname`. ```bash -helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.5.2" +helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.6.0" ``` ## Prerequisites @@ -28,7 +28,7 @@ helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" To install the chart with the release name `my-release`: ```bash -helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.5.2" +helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.6.0" ``` The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 1a122d2fe3c43f8455ca95565de0ef51946fc0fe..b4f253a1821ffd9bba732890e33930ad40e8bf26 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -369,7 +369,7 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.6.0 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param analyseservice.podSecurityContext.enabled Enable pods' Security Context @@ -430,7 +430,7 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.0 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context @@ -527,7 +527,7 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.0 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context @@ -613,7 +613,7 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.6.0 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param searchservice.podSecurityContext.enabled Enable pods' Security Context @@ -660,7 +660,7 @@ searchservice: init: image: ## @skip searchservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.6.0 ## @param searchservice.init.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param searchservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -721,7 +721,7 @@ storageservice: init: image: ## @skip storageservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.0 ## @param storageservice.init.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param storageservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -827,7 +827,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.0 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param ui.podSecurityContext.enabled Enable pods' Security Context diff --git a/install.sh b/install.sh index 12a20e9868dce4d841b4110d29ab84253e2321c1..1e7520e29bf7ed3ef1a5310a8c7027a47b1ec249 100644 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/bin/bash # preset -VERSION="1.5.2" +VERSION="1.6.0" MIN_CPU=8 MIN_RAM=4 MIN_MAP_COUNT=262144 diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py index b80daff7d0a7a1d2d92fcdd60e90fe3fa9b5d2da..6cc706d46cbe44d9b3835c8158bef9f2a29944cc 100644 --- a/lib/python/dbrepo/RestClient.py +++ b/lib/python/dbrepo/RestClient.py @@ -28,7 +28,7 @@ class RestClient: :param username: The REST API username. Optional. :param password: The REST API password. Optional. :param secure: When set to false, the requests library will not verify the authenticity of your TLS/SSL - certificates (i.e. when using self-signed certificates). Default: true. + certificates (i.e. when using self-signed certificates). Default: `True`. """ endpoint: str = None username: str = None @@ -79,22 +79,6 @@ class RestClient: return requests.request(method=method, url=url, auth=auth, verify=self.secure, json=payload, headers=headers, params=params, stream=stream) - def upload(self, file_path: str) -> str: - """ - Uploads a file located at file_path to the Upload Service. - - :param file_path: The location of the file on the local filesystem. - - :returns: Filename on the S3 backend of the Upload Service, if successful. - """ - my_client = TusClient(url=f'{self.endpoint}/api/upload/files/') - uploader = my_client.uploader(file_path=file_path) - uploader.upload() - filename = uploader.url[uploader.url.rfind('/') + 1:uploader.url.rfind('+')] - if filename is None or len(filename) == 0: - raise UploadError(f'Failed to upload the file to {self.endpoint}') - return filename - def get_jwt_auth(self, username: str = None, password: str = None) -> JwtAuth: """ Obtains a JWT auth object from the auth service containing e.g. the access token and refresh token. @@ -147,7 +131,7 @@ class RestClient: :raises ResponseCodeError: If something went wrong with the authentication. """ url = f'{self.endpoint}/api/user/token' - response = self._wrapper(method="put", url=url, payload={"refresh_token": refresh_token}) + response = requests.put(url=url, json=dict({"refresh_token": refresh_token})) if response.status_code == 202: body = response.json() return JwtAuth.model_validate(body) @@ -431,14 +415,15 @@ class RestClient: raise ResponseCodeError(f'Failed to find database: response code: {response.status_code} is not ' f'200 (OK): {response.text}') - def create_database(self, name: str, container_id: int, is_public: bool) -> Database: + def create_database(self, name: str, container_id: int, is_public: bool = True, + is_schema_public: bool = True) -> Database: """ Create a databases in a container with given container id. :param name: The name of the database. :param container_id: The container id. - :param is_public: The visibility of the database. If set to true everything will be visible, otherwise only - the metadata (schema, identifiers) will be visible to the public. + :param is_public: The visibility of the data. If set to true the data will be publicly visible. Optional. Default: `True`. + :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible. Optional. Default: `True`. :returns: The database, if successful. @@ -452,7 +437,8 @@ class RestClient: """ url = f'/api/database' response = self._wrapper(method="post", url=url, force_auth=True, - payload=CreateDatabase(name=name, container_id=container_id, is_public=is_public)) + payload=CreateDatabase(name=name, container_id=container_id, is_public=is_public, + is_schema_public=is_schema_public)) if response.status_code == 201: body = response.json() return Database.model_validate(body) @@ -487,7 +473,7 @@ class RestClient: :param privileged_username: The container privileged user username. :param privileged_password: The container privileged user password. :param port: The container port bound to the host. Optional. - :param ui_host: The container hostname displayed in the user interface. Optional. Default: value of `host` + :param ui_host: The container hostname displayed in the user interface. Optional. Default: value of `host`. :param ui_port: The container port displayed in the user interface. Optional. Default: `default_port` of image. :returns: The container, if successful. @@ -519,13 +505,13 @@ class RestClient: raise ResponseCodeError(f'Failed to create container: response code: {response.status_code} is not ' f'201 (CREATED): {response.text}') - def update_database_visibility(self, database_id: int, is_public: bool) -> Database: + def update_database_visibility(self, database_id: int, is_public: bool, is_schema_public: bool) -> Database: """ Updates the database visibility of a database with given database id. :param database_id: The database id. - :param is_public: The visibility of the database. If set to true everything will be visible, otherwise only - the metadata (schema, identifiers) will be visible to the public. + :param is_public: The visibility of the data. If set to true the data will be publicly visible. + :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible. :returns: The database, if successful. @@ -537,7 +523,8 @@ class RestClient: :raises ResponseCodeError: If something went wrong with the update. """ url = f'/api/database/{database_id}' - response = self._wrapper(method="put", url=url, force_auth=True, payload=ModifyVisibility(is_public=is_public)) + response = self._wrapper(method="put", url=url, force_auth=True, + payload=ModifyVisibility(is_public=is_public, is_schema_public=is_schema_public)) if response.status_code == 202: body = response.json() return Database.model_validate(body) @@ -629,13 +616,16 @@ class RestClient: raise ResponseCodeError( f'Failed to update database schema: response code: {response.status_code} is not 200 (OK)') - def create_table(self, database_id: int, name: str, columns: List[CreateTableColumn], - constraints: CreateTableConstraints, description: str = None) -> Table: + def create_table(self, database_id: int, name: str, is_public: bool, is_schema_public: bool, + columns: List[CreateTableColumn], constraints: CreateTableConstraints, + description: str = None) -> Table: """ Updates the database owner of a database with given database id. :param database_id: The database id. :param name: The name of the created table. + :param is_public: The visibility of the data. If set to true the data will be publicly visible. + :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible. :param constraints: The constraints of the created table. :param columns: The columns of the created table. :param description: The description of the created table. Optional. @@ -652,8 +642,8 @@ class RestClient: """ url = f'/api/database/{database_id}/table' response = self._wrapper(method="post", url=url, force_auth=True, - payload=CreateTable(name=name, description=description, - columns=columns, constraints=constraints)) + payload=CreateTable(name=name, is_public=is_public, is_schema_public=is_schema_public, + description=description, columns=columns, constraints=constraints)) if response.status_code == 201: body = response.json() return Table.model_validate(body) @@ -882,15 +872,41 @@ class RestClient: raise ResponseCodeError(f'Failed to find view: response code: {response.status_code} is not ' f'200 (OK): {response.text}') - def create_view(self, database_id: int, name: str, query: str, is_public: bool) -> View: + def update_view(self, database_id: int, view_id: int, is_public: bool) -> View: + """ + Get a view of a database with given database id and view id. + + :param database_id: The database id. + :param view_id: The view id. + :param is_public: If set to `True`, the view is publicly visible. + + :returns: The view, if successful. + + :raises ForbiddenError: If something went wrong with the authorization. + :raises NotExistsError: If the container does not exist. + :raises ResponseCodeError: If something went wrong with the retrieval. + """ + url = f'/api/database/{database_id}/view/{view_id}' + response = self._wrapper(method="put", url=url, payload=UpdateView(is_public=is_public)) + if response.status_code == 202: + body = response.json() + return View.model_validate(body) + if response.status_code == 403: + raise ForbiddenError(f'Failed to update view: not allowed') + if response.status_code == 404: + raise NotExistsError(f'Failed to update view: not found') + raise ResponseCodeError(f'Failed to update view: response code: {response.status_code} is not ' + f'202 (ACCEPTED): {response.text}') + + def create_view(self, database_id: int, name: str, query: str, is_public: bool, is_schema_public: bool) -> View: """ Create a view in a database with given database id. :param database_id: The database id. :param name: The name of the created view. :param query: The query of the created view. - :param is_public: The visibility of the view. If set to true everything will be visible, otherwise only - the metadata (schema, identifiers) will be visible to the public. + :param is_public: The visibility of the data. If set to true the data will be publicly visible. Optional. Default: `True`. + :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible. Optional. Default: `True`. :returns: The created view, if successful. @@ -904,7 +920,8 @@ class RestClient: """ url = f'/api/database/{database_id}/view' response = self._wrapper(method="post", url=url, force_auth=True, - payload=CreateView(name=name, query=query, is_public=is_public)) + payload=CreateView(name=name, query=query, is_public=is_public, + is_schema_public=is_schema_public)) if response.status_code == 201: body = response.json() return View.model_validate(body) @@ -1197,7 +1214,7 @@ class RestClient: :param file_path: The path of the file that is imported on the storage service. :param separator: The csv column separator. :param upload: If set to true, the file from file_path will be uploaded, otherwise no upload will be performed \ - and the file_path will be treated as S3 filename and analysed instead. Optional. Default: true. + and the file_path will be treated as S3 filename and analysed instead. Optional. Default: `True`. :returns: The determined ranking of the primary key candidates, if successful. @@ -1326,8 +1343,8 @@ class RestClient: :param database_id: The database id. :param table_id: The table id. - :param page: The result pagination number. Optional. Default: 0. - :param size: The result pagination size. Optional. Default: 10. + :param page: The result pagination number. Optional. Default: `0`. + :param size: The result pagination size. Optional. Default: `10`. :param timestamp: The query execution time. Optional. :returns: The result of the view query, if successful. @@ -1559,10 +1576,10 @@ class RestClient: :param database_id: The database id. :param query: The query statement. - :param page: The result pagination number. Optional. Default: 0. - :param size: The result pagination size. Optional. Default: 10. + :param page: The result pagination number. Optional. Default: `0`. + :param size: The result pagination size. Optional. Default: `10`. :param timestamp: The timestamp at which the data validity is set. Optional. Default: <current timestamp>. - :param df: If true, the result is returned as Pandas DataFrame. Optional. Default: False. + :param df: If true, the result is returned as Pandas DataFrame. Optional. Default: `False`. :returns: The result set, if successful. @@ -1612,10 +1629,10 @@ class RestClient: :param database_id: The database id. :param subset_id: The subset id. - :param page: The result pagination number. Optional. Default: 0. - :param size: The result pagination size. Optional. Default: 10. - :param size: The result pagination size. Optional. Default: 10. - :param df: If true, the result is returned as Pandas DataFrame. Optional. Default: False. + :param page: The result pagination number. Optional. Default: `0`. + :param size: The result pagination size. Optional. Default: `10`. + :param size: The result pagination size. Optional. Default: `10`. + :param df: If true, the result is returned as Pandas DataFrame. Optional.Optional. Default: `False`. :returns: The result set, if successful. @@ -1653,8 +1670,8 @@ class RestClient: :param database_id: The database id. :param subset_id: The subset id. - :param page: The result pagination number. Optional. Default: 0. - :param size: The result pagination size. Optional. Default: 10. + :param page: The result pagination number. Optional. Default: `0`. + :param size: The result pagination size. Optional. Default: `10`. :returns: The result set, if successful. diff --git a/lib/python/dbrepo/api/dto.py b/lib/python/dbrepo/api/dto.py index 4de986e87080d207dbd68f8293f31be4004753d6..79c4279ed0124c251b6ce0442799100c5d5401a9 100644 --- a/lib/python/dbrepo/api/dto.py +++ b/lib/python/dbrepo/api/dto.py @@ -4,7 +4,7 @@ from dataclasses import field from enum import Enum import datetime from typing import List, Optional, Any, Annotated -from pydantic import BaseModel, ConfigDict, PlainSerializer, Field +from pydantic import BaseModel, PlainSerializer, Field Timestamp = Annotated[ datetime.datetime, PlainSerializer(lambda v: v.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z', return_type=str) @@ -17,7 +17,7 @@ class JwtAuth(BaseModel): id_token: str expires_in: int refresh_expires_in: int - not_before_policy: int = Field(alias='not-before-policy') + not_before_policy: int scope: str session_state: str token_type: str @@ -46,6 +46,11 @@ class CreateDatabase(BaseModel): name: str container_id: int is_public: bool + is_schema_public: bool + + +class UpdateView(BaseModel): + is_public: bool class CreateContainer(BaseModel): @@ -91,7 +96,6 @@ class Container(BaseModel): host: str port: int image: Image - created: Timestamp ui_host: Optional[str] = None ui_port: Optional[int] = None @@ -100,7 +104,6 @@ class ContainerBrief(BaseModel): id: int name: str image: ImageBrief - created: Timestamp internal_name: str running: Optional[bool] = None hash: Optional[str] = None @@ -123,7 +126,9 @@ class TableBrief(BaseModel): description: Optional[str] internal_name: str is_versioned: bool - owner: UserBrief + is_public: bool + is_schema_public: bool + owned_by: str class UserAttributes(BaseModel): @@ -392,8 +397,7 @@ class Language(str, Enum): class DatabaseAccess(BaseModel): type: AccessType - user: User - created: Timestamp + user: UserBrief class CreateAccess(BaseModel): @@ -486,6 +490,7 @@ class UpdateColumn(BaseModel): class ModifyVisibility(BaseModel): is_public: bool + is_schema_public: bool class ModifyOwner(BaseModel): @@ -494,6 +499,8 @@ class ModifyOwner(BaseModel): class CreateTable(BaseModel): name: str + is_public: bool + is_schema_public: bool constraints: CreateTableConstraints columns: List[CreateTableColumn] = field(default_factory=list) description: Optional[str] = None @@ -590,10 +597,8 @@ class Identifier(BaseModel): id: int database_id: int type: IdentifierType - creator: UserBrief + owner: UserBrief status: IdentifierStatusType - created: Timestamp - last_modified: Timestamp publication_year: int publisher: str creators: List[IdentifierCreator] @@ -622,12 +627,10 @@ class View(BaseModel): name: str query: str query_hash: str - created: Timestamp - creator: User + owner: UserBrief internal_name: str is_public: bool initial_view: bool - last_modified: Timestamp columns: List[ViewColumn] identifiers: List[Identifier] = field(default_factory=list) @@ -636,6 +639,7 @@ class CreateView(BaseModel): name: str query: str is_public: bool + is_schema_public: bool class Result(BaseModel): @@ -648,21 +652,18 @@ class ViewBrief(BaseModel): id: int database_id: int name: str - identifier: List[Identifier] - query: str - query_hash: str - created: Timestamp - creator: User internal_name: str is_public: bool + is_schema_public: bool initial_view: bool - last_modified: Timestamp + query: str + query_hash: str + owned_by: str class Concept(BaseModel): id: int uri: str - created: Timestamp name: Optional[str] = None description: Optional[str] = None @@ -698,7 +699,6 @@ class TableStatistics(BaseModel): class Unit(BaseModel): id: int uri: str - created: Timestamp name: Optional[str] = None description: Optional[str] = None @@ -851,17 +851,15 @@ class IdentifierType(str, Enum): class Query(BaseModel): id: int - creator: User + owner: UserBrief execution: Timestamp query: str type: QueryType - created: Timestamp database_id: int query_hash: str is_persisted: bool result_hash: str query_normalized: str - last_modified: Timestamp result_number: Optional[int] = None identifiers: List[Identifier] = field(default_factory=list) @@ -874,8 +872,8 @@ class DataType(BaseModel): display_name: str value: str documentation: str - is_quoted: bool - is_buildable: bool + is_quoted: bool + is_buildable: bool size_min: Optional[int] = None size_max: Optional[int] = None size_default: Optional[int] = None @@ -884,8 +882,8 @@ class DataType(BaseModel): d_max: Optional[int] = None d_default: Optional[int] = None d_required: Optional[bool] = None - data_hint: Optional[str] = None - type_hint: Optional[str] = None + data_hint: Optional[str] = None + type_hint: Optional[str] = None class Column(BaseModel): @@ -940,17 +938,15 @@ class Table(BaseModel): id: int database_id: int name: str - creator: User - owner: User - created: Timestamp + owner: UserBrief columns: List[Column] constraints: Constraints internal_name: str is_versioned: bool - created_by: str queue_name: str routing_key: str is_public: bool + is_schema_public: bool identifiers: Optional[List[Identifier]] = field(default_factory=list) description: Optional[str] = None queue_type: Optional[str] = None @@ -974,10 +970,8 @@ class ColumnMinimal(BaseModel): class Database(BaseModel): id: int name: str - creator: User - owner: User - contact: User - created: Timestamp + owner: UserBrief + contact: UserBrief exchange_name: str internal_name: str is_public: bool @@ -1001,7 +995,6 @@ class DatabaseBrief(BaseModel): identifiers: Optional[List[Identifier]] = field(default_factory=list) contact: UserBrief owner: UserBrief - created: Timestamp class Unique(BaseModel): diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index e032c5edfe1310d307060efe6d178b4d4b29561c..d6c33c6d01e4a937d0f1fe36af12300ad7d441bc 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.5.2" +version = "1.6.0" description = "DBRepo Python Library" keywords = [ "DBRepo", diff --git a/lib/python/setup.py b/lib/python/setup.py index 50be6c428aa5d487060590272518f7a9f30177a8..fadd15e30eab6719c88027e3d107f137d5c32bd9 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -2,7 +2,7 @@ from distutils.core import setup setup(name="dbrepo", - version="1.5.2", + version="1.6.0", description="A library for communicating with DBRepo", url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/", author="Martin Weise", diff --git a/lib/python/tests/test_unit_container.py b/lib/python/tests/test_unit_container.py index 0e1d93faa0e9b1c598afcede5ad71c7e08ef9767..b7a35e6a4a714f38d3cb06841541b182a0c769e2 100644 --- a/lib/python/tests/test_unit_container.py +++ b/lib/python/tests/test_unit_container.py @@ -25,7 +25,6 @@ class ContainerUnitTest(unittest.TestCase): name="MariaDB 10.11.3", internal_name="mariadb_10_11_3", running=True, - created=datetime.datetime(2024, 3, 26, 10, 11, 0, 0, datetime.timezone.utc), image=ImageBrief(id=1, name="mariadb", version="10.11.3", @@ -58,7 +57,6 @@ class ContainerUnitTest(unittest.TestCase): port=12345, sidecar_host="data-db-sidecar", sidecar_port=3305, - created=datetime.datetime(2024, 3, 26, 10, 11, 0, 0, datetime.timezone.utc), image=Image(id=1, registry="docker.io", name="mariadb", diff --git a/lib/python/tests/test_unit_database.py b/lib/python/tests/test_unit_database.py index f72c80c93c0497eb0d2d6f68e2ab8029cccb2aec..c1f3014436320547849fa227c674926266a7d7fd 100644 --- a/lib/python/tests/test_unit_database.py +++ b/lib/python/tests/test_unit_database.py @@ -1,13 +1,11 @@ import unittest import requests_mock -import datetime from pydantic_core import ValidationError from dbrepo.RestClient import RestClient -from dbrepo.api.dto import Database, User, Container, Image, UserAttributes, DatabaseAccess, AccessType, DatabaseBrief, \ - UserBrief, DataType +from dbrepo.api.dto import Database, Container, Image, DatabaseAccess, AccessType, DatabaseBrief, UserBrief, DataType from dbrepo.api.exceptions import ResponseCodeError, NotExistsError, ForbiddenError, MalformedError, AuthenticationError @@ -28,7 +26,6 @@ class DatabaseUnitTest(unittest.TestCase): name='test', owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), internal_name='test_abcd', is_public=True) ] @@ -43,13 +40,8 @@ class DatabaseUnitTest(unittest.TestCase): exp = Database( id=1, name='test', - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), + contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), exchange_name='dbrepo', internal_name='test_abcd', is_public=True, @@ -61,7 +53,6 @@ class DatabaseUnitTest(unittest.TestCase): port=3306, sidecar_host='data-db-sidecar', sidecar_port=3305, - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), image=Image( id=1, registry='docker.io', @@ -115,13 +106,8 @@ class DatabaseUnitTest(unittest.TestCase): exp = Database( id=1, name='test', - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), + contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), exchange_name='dbrepo', internal_name='test_abcd', is_public=True, @@ -133,7 +119,6 @@ class DatabaseUnitTest(unittest.TestCase): port=3306, sidecar_host='data-db-sidecar', sidecar_port=3305, - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), image=Image( id=1, registry='docker.io', @@ -190,13 +175,8 @@ class DatabaseUnitTest(unittest.TestCase): exp = Database( id=1, name='test', - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), + contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), exchange_name='dbrepo', internal_name='test_abcd', is_public=True, @@ -208,7 +188,6 @@ class DatabaseUnitTest(unittest.TestCase): port=3306, sidecar_host='data-db-sidecar', sidecar_port=3305, - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), image=Image( id=1, registry='docker.io', @@ -226,7 +205,7 @@ class DatabaseUnitTest(unittest.TestCase): mock.put('/api/database/1', json=exp.model_dump(), status_code=202) # test client = RestClient(username="a", password="b") - response = client.update_database_visibility(database_id=1, is_public=True) + response = client.update_database_visibility(database_id=1, is_public=True, is_schema_public=True) self.assertEqual(response.is_public, True) def test_update_database_visibility_not_allowed_fails(self): @@ -236,7 +215,7 @@ class DatabaseUnitTest(unittest.TestCase): # test try: client = RestClient(username="a", password="b") - response = client.update_database_visibility(database_id=1, is_public=True) + response = client.update_database_visibility(database_id=1, is_public=True, is_schema_public=True) except ForbiddenError: pass @@ -247,7 +226,7 @@ class DatabaseUnitTest(unittest.TestCase): # test try: client = RestClient(username="a", password="b") - response = client.update_database_visibility(database_id=1, is_public=True) + response = client.update_database_visibility(database_id=1, is_public=True, is_schema_public=True) except NotExistsError: pass @@ -257,7 +236,7 @@ class DatabaseUnitTest(unittest.TestCase): mock.put('/api/database/1', status_code=404) # test try: - response = RestClient().update_database_visibility(database_id=1, is_public=True) + response = RestClient().update_database_visibility(database_id=1, is_public=True, is_schema_public=True) except AuthenticationError: pass @@ -265,13 +244,8 @@ class DatabaseUnitTest(unittest.TestCase): exp = Database( id=1, name='test', - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - owner=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other', - attributes=UserAttributes(theme='light')), - contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), + owner=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other'), + contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), exchange_name='dbrepo', internal_name='test_abcd', is_public=True, @@ -283,7 +257,6 @@ class DatabaseUnitTest(unittest.TestCase): port=3306, sidecar_host='data-db-sidecar', sidecar_port=3305, - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), image=Image( id=1, registry='docker.io', @@ -341,9 +314,7 @@ class DatabaseUnitTest(unittest.TestCase): def test_get_database_access_succeeds(self): exp = DatabaseAccess(type=AccessType.READ, - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - user=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other', - attributes=UserAttributes(theme='light'))) + user=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other')) with requests_mock.Mocker() as mock: # mock mock.get('/api/database/1/access', json=exp.model_dump()) @@ -373,9 +344,7 @@ class DatabaseUnitTest(unittest.TestCase): def test_create_database_access_succeeds(self): exp = DatabaseAccess(type=AccessType.READ, - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - user=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other', - attributes=UserAttributes(theme='light'))) + user=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other')) with requests_mock.Mocker() as mock: # mock mock.post('/api/database/1/access/abdbf897-e599-4e5a-a3f0-7529884ea011', json=exp.model_dump(), @@ -435,9 +404,7 @@ class DatabaseUnitTest(unittest.TestCase): def test_update_database_access_succeeds(self): exp = DatabaseAccess(type=AccessType.READ, - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - user=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other', - attributes=UserAttributes(theme='light'))) + user=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other')) with requests_mock.Mocker() as mock: # mock mock.put('/api/database/1/access/abdbf897-e599-4e5a-a3f0-7529884ea011', json=exp.model_dump(), diff --git a/lib/python/tests/test_unit_identifier.py b/lib/python/tests/test_unit_identifier.py index 2832f0e799afa66558f7aaf83f38252b81f484e3..45b0a919e74d79d2420669a7036fcc87ae02b92a 100644 --- a/lib/python/tests/test_unit_identifier.py +++ b/lib/python/tests/test_unit_identifier.py @@ -21,8 +21,6 @@ class IdentifierUnitTest(unittest.TestCase): view_id=32, publication_year=2024, publisher='TU Wien', - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), type=IdentifierType.VIEW, language=Language.EN, descriptions=[IdentifierDescription(id=2, description='Test Description')], @@ -33,7 +31,7 @@ class IdentifierUnitTest(unittest.TestCase): type=RelatedIdentifierType.DOI)], creators=[IdentifierCreator(id=5, creator_name='Carberry, Josiah')], status=IdentifierStatusType.PUBLISHED, - creator=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise')) + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise')) # mock mock.post('/api/identifier', json=exp.model_dump(), status_code=201) # test @@ -121,8 +119,6 @@ class IdentifierUnitTest(unittest.TestCase): view_id=32, publication_year=2024, publisher='TU Wien', - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), type=IdentifierType.VIEW, language=Language.EN, descriptions=[IdentifierDescription(id=2, description='Test Description')], @@ -133,7 +129,7 @@ class IdentifierUnitTest(unittest.TestCase): type=RelatedIdentifierType.DOI)], creators=[IdentifierCreator(id=5, creator_name='Carberry, Josiah')], status=IdentifierStatusType.PUBLISHED, - creator=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'))] + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'))] # mock mock.get('/api/identifiers', json=[exp[0].model_dump()], headers={"Accept": "application/json"}) # test diff --git a/lib/python/tests/test_unit_jwt.py b/lib/python/tests/test_unit_jwt.py new file mode 100644 index 0000000000000000000000000000000000000000..4a0748fe38d4799ff9e1bf3eda8d41ba6f48e39f --- /dev/null +++ b/lib/python/tests/test_unit_jwt.py @@ -0,0 +1,65 @@ +import json +from unittest import TestCase, main + +import requests_mock + +from dbrepo.RestClient import RestClient +from dbrepo.api.dto import JwtAuth + + +class DatabaseUnitTest(TestCase): + + def test_get_jwt_auth_succeeds(self): + exp = JwtAuth(access_token='eyABC', + refresh_token='ey123', + id_token='eyXYZ', + expires_in=3600, + refresh_expires_in=36000, + not_before_policy=0, + scope='openid', + session_state='4604e4b1-2163-42c3-806d-3be2e426c3a5', + token_type='Bearer') + with requests_mock.Mocker() as mock: + # mock + mock.post('/api/user/token', json=exp.model_dump(), status_code=202) + # test + response = RestClient().get_jwt_auth(username='foo', password='bar') + self.assertEqual(exp, response) + + def test_get_jwt_auth_empty_succeeds(self): + exp = JwtAuth(access_token='eyABC', + refresh_token='ey123', + id_token='eyXYZ', + expires_in=3600, + refresh_expires_in=36000, + not_before_policy=0, + scope='openid', + session_state='4604e4b1-2163-42c3-806d-3be2e426c3a5', + token_type='Bearer') + with requests_mock.Mocker() as mock: + # mock + mock.post('/api/user/token', json=exp.model_dump(), status_code=202) + # test + response = RestClient().get_jwt_auth() + self.assertEqual(exp, response) + + def test_refresh_jwt_auth_succeeds(self): + exp = JwtAuth(access_token='eyABC', + refresh_token='ey123', + id_token='eyXYZ', + expires_in=3600, + refresh_expires_in=36000, + not_before_policy=0, + scope='openid', + session_state='4604e4b1-2163-42c3-806d-3be2e426c3a5', + token_type='Bearer') + with requests_mock.Mocker() as mock: + # mock + mock.put('/api/user/token', json=exp.model_dump(), status_code=202) + # test + response = RestClient().refresh_jwt_auth(refresh_token='ey123') + self.assertEqual(exp, response) + + +if __name__ == "__main__": + main() diff --git a/lib/python/tests/test_unit_query.py b/lib/python/tests/test_unit_query.py index e1b326fa576b86519e6c059abd73f66dacbda2e5..bc1f7e481457629779f341de44b4673a007c7346 100644 --- a/lib/python/tests/test_unit_query.py +++ b/lib/python/tests/test_unit_query.py @@ -6,7 +6,7 @@ import datetime from dbrepo.RestClient import RestClient from pandas import DataFrame -from dbrepo.api.dto import Result, Query, User, UserAttributes, QueryType +from dbrepo.api.dto import Result, Query, User, UserAttributes, QueryType, UserBrief from dbrepo.api.exceptions import MalformedError, NotExistsError, ForbiddenError, QueryStoreError, \ MetadataConsistencyError, AuthenticationError @@ -79,11 +79,8 @@ class QueryUnitTest(unittest.TestCase): def test_find_query_succeeds(self): with requests_mock.Mocker() as mock: exp = Query(id=6, - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), execution=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), query='SELECT id, username FROM some_table WHERE id IN (1,2)', query_normalized='SELECT id, username FROM some_table WHERE id IN (1,2)', type=QueryType.QUERY, @@ -131,11 +128,8 @@ class QueryUnitTest(unittest.TestCase): def test_get_queries_succeeds(self): with requests_mock.Mocker() as mock: exp = [Query(id=6, - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), execution=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), query='SELECT id, username FROM some_table WHERE id IN (1,2)', query_normalized='SELECT id, username FROM some_table WHERE id IN (1,2)', type=QueryType.QUERY, diff --git a/lib/python/tests/test_unit_table.py b/lib/python/tests/test_unit_table.py index 0be3a4a9fbaa47c129e7a937230d348e37a8eb17..f149b607818458ac82f15e9eeb8ea9ff1541c62b 100644 --- a/lib/python/tests/test_unit_table.py +++ b/lib/python/tests/test_unit_table.py @@ -1,5 +1,4 @@ import unittest -from json import dumps import requests_mock import datetime @@ -7,9 +6,9 @@ import datetime from dbrepo.RestClient import RestClient from pandas import DataFrame -from dbrepo.api.dto import Table, CreateTableConstraints, UserAttributes, User, Column, Constraints, ColumnType, Result, \ - Concept, Unit, TableStatistics, ColumnStatistic, PrimaryKey, TableMinimal, ColumnMinimal, TableBrief, UserBrief -from dbrepo.api.exceptions import MalformedError, ForbiddenError, NotExistsError, NameExistsError, QueryStoreError, \ +from dbrepo.api.dto import Table, CreateTableConstraints, Column, Constraints, ColumnType, Result, Concept, Unit, \ + TableStatistics, ColumnStatistic, PrimaryKey, TableMinimal, ColumnMinimal, TableBrief, UserBrief +from dbrepo.api.exceptions import MalformedError, ForbiddenError, NotExistsError, NameExistsError, \ AuthenticationError, ExternalSystemError @@ -21,16 +20,12 @@ class TableUnitTest(unittest.TestCase): description="Test Table", database_id=1, internal_name="test", - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), is_versioned=True, - created_by='8638c043-5145-4be8-a3e4-4b79991b0a16', queue_name='test', routing_key='dbrepo.test_database_1234.test', is_public=True, + is_schema_public=True, constraints=Constraints(uniques=[], foreign_keys=[], checks=[], @@ -54,6 +49,7 @@ class TableUnitTest(unittest.TestCase): # test client = RestClient(username="a", password="b") response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[], + is_public=True, is_schema_public=True, constraints=CreateTableConstraints()) self.assertEqual(exp, response) @@ -65,6 +61,7 @@ class TableUnitTest(unittest.TestCase): try: client = RestClient(username="a", password="b") response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[], + is_public=True, is_schema_public=True, constraints=CreateTableConstraints()) except MalformedError: pass @@ -77,6 +74,7 @@ class TableUnitTest(unittest.TestCase): try: client = RestClient(username="a", password="b") response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[], + is_public=True, is_schema_public=True, constraints=CreateTableConstraints()) except ForbiddenError: pass @@ -89,6 +87,7 @@ class TableUnitTest(unittest.TestCase): try: client = RestClient(username="a", password="b") response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[], + is_public=True, is_schema_public=True, constraints=CreateTableConstraints()) except NotExistsError: pass @@ -101,6 +100,7 @@ class TableUnitTest(unittest.TestCase): try: client = RestClient(username="a", password="b") response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[], + is_public=True, is_schema_public=True, constraints=CreateTableConstraints()) except NameExistsError: pass @@ -112,6 +112,7 @@ class TableUnitTest(unittest.TestCase): # test try: response = RestClient().create_table(database_id=1, name="Test", description="Test Table", columns=[], + is_public=True, is_schema_public=True, constraints=CreateTableConstraints()) except AuthenticationError: pass @@ -131,8 +132,9 @@ class TableUnitTest(unittest.TestCase): description="Test Table", database_id=1, internal_name="test", - owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), + is_public=True, + is_schema_public=True, + owned_by='8638c043-5145-4be8-a3e4-4b79991b0a16', is_versioned=True)] # mock mock.get('/api/database/1/table', json=[exp[0].model_dump()]) @@ -147,16 +149,12 @@ class TableUnitTest(unittest.TestCase): description="Test Table", database_id=1, internal_name="test", - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), is_versioned=True, - created_by='8638c043-5145-4be8-a3e4-4b79991b0a16', queue_name='test', routing_key='dbrepo.test_database_1234.test', is_public=True, + is_schema_public=True, constraints=Constraints(uniques=[], foreign_keys=[], checks=[], @@ -501,11 +499,9 @@ class TableUnitTest(unittest.TestCase): is_public=True, concept=Concept(id=2, uri="http://dbpedia.org/page/Category:Precipitation", - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), name="Precipitation"), unit=Unit(id=2, uri="http://www.wikidata.org/entity/Q119856947", - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), name="liters per square meter"), is_null_allowed=False) # mock diff --git a/lib/python/tests/test_unit_view.py b/lib/python/tests/test_unit_view.py index 19a88be85a10dceef0eb8129dd65be733e3025e3..1bb46bc37c5b619eae1eadcc0818688d71edc735 100644 --- a/lib/python/tests/test_unit_view.py +++ b/lib/python/tests/test_unit_view.py @@ -1,13 +1,10 @@ import unittest -from json import dumps import requests_mock -import datetime - -from dbrepo.RestClient import RestClient from pandas import DataFrame -from dbrepo.api.dto import UserAttributes, User, View, Result, ViewColumn, ColumnType +from dbrepo.RestClient import RestClient +from dbrepo.api.dto import View, Result, ViewColumn, ColumnType, UserBrief from dbrepo.api.exceptions import ForbiddenError, NotExistsError, MalformedError, AuthenticationError @@ -30,13 +27,11 @@ class ViewUnitTest(unittest.TestCase): initial_view=False, query="SELECT id FROM mytable WHERE deg > 0", query_hash="94c74728b11a690e51d64719868824735f0817b7", - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), is_public=True, + is_schema_public=True, columns=[ViewColumn(id=1, name="id", internal_name="id", database_id=1, auto_generated=False, column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False)], - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), identifiers=[])] # mock mock.get('/api/database/1/view', json=[exp[0].model_dump()]) @@ -63,13 +58,11 @@ class ViewUnitTest(unittest.TestCase): initial_view=False, query="SELECT id FROM mytable WHERE deg > 0", query_hash="94c74728b11a690e51d64719868824735f0817b7", - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), is_public=True, + is_schema_public=True, columns=[ViewColumn(id=1, name="id", internal_name="id", database_id=1, auto_generated=False, column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False)], - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), identifiers=[]) # mock mock.get('/api/database/1/view/3', json=exp.model_dump()) @@ -106,19 +99,17 @@ class ViewUnitTest(unittest.TestCase): initial_view=False, query="SELECT id FROM mytable WHERE deg > 0", query_hash="94c74728b11a690e51d64719868824735f0817b7", - creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise', - attributes=UserAttributes(theme='light')), + owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'), is_public=True, + is_schema_public=True, columns=[ViewColumn(id=1, name="id", internal_name="id", database_id=1, auto_generated=False, column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False)], - created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), - last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc), identifiers=[]) # mock mock.post('/api/database/1/view', json=exp.model_dump(), status_code=201) # test client = RestClient(username="a", password="b") - response = client.create_view(database_id=1, name="Data", is_public=True, + response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True, query="SELECT id FROM mytable WHERE deg > 0") self.assertEqual(exp, response) @@ -129,7 +120,7 @@ class ViewUnitTest(unittest.TestCase): # test try: client = RestClient(username="a", password="b") - response = client.create_view(database_id=1, name="Data", is_public=True, + response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True, query="SELECT id FROM mytable WHERE deg > 0") except MalformedError: pass @@ -141,7 +132,7 @@ class ViewUnitTest(unittest.TestCase): # test try: client = RestClient(username="a", password="b") - response = client.create_view(database_id=1, name="Data", is_public=True, + response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True, query="SELECT id FROM mytable WHERE deg > 0") except ForbiddenError: pass @@ -153,7 +144,7 @@ class ViewUnitTest(unittest.TestCase): # test try: client = RestClient(username="a", password="b") - response = client.create_view(database_id=1, name="Data", is_public=True, + response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True, query="SELECT id FROM mytable WHERE deg > 0") except NotExistsError: pass @@ -164,7 +155,7 @@ class ViewUnitTest(unittest.TestCase): mock.post('/api/database/1/view', status_code=404) # test try: - response = RestClient().create_view(database_id=1, name="Data", is_public=True, + response = RestClient().create_view(database_id=1, name="Data", is_public=True, is_schema_public=True, query="SELECT id FROM mytable WHERE deg > 0") except AuthenticationError: pass diff --git a/sonar-project.properties b/sonar-project.properties index 54228d8d4c7fd97d1c704f55cb9dc064d9bca2f8..fdbf030ef0e674288083ee1366822ea99d055e19 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,7 +2,7 @@ sonar.projectKey=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77 sonar.host.url=https://s39.datalab.tuwien.ac.at # project -sonar.projectVersion=1.5.2 +sonar.projectVersion=1.6.0 # general sonar.qualitygate.wait=true sonar.projectCreation.mainBranchName=master