diff --git a/Cargo.lock b/Cargo.lock index 1a54a7e..f194e4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -344,6 +344,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + [[package]] name = "arrayref" version = "0.3.7" @@ -376,7 +382,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] @@ -433,7 +439,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.29", + "syn 2.0.46", "which", ] @@ -702,7 +708,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] @@ -1084,6 +1090,28 @@ dependencies = [ "byteorder", ] +[[package]] +name = "gc-arena" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f826bd8b85ee02f83c629950df68cda12436f722b22503dc79acb01fd8e8e8e" +dependencies = [ + "gc-arena-derive", + "sptr", +] + +[[package]] +name = "gc-arena-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fd66e1f2e1a6970aa53341ca3346024d8af04eec8f3fed5d1f92b6935f90e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.46", + "synstructure", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1101,8 +1129,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1458,9 +1488,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" @@ -1566,6 +1596,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "oca-ast" +version = "0.3.7" +dependencies = [ + "env_logger", + "indexmap", + "log", + "recursion", + "said 0.3.0", + "serde", + "serde-wasm-bindgen", + "serde_json", + "strum", + "strum_macros", + "thiserror", + "wasm-bindgen", +] + [[package]] name = "oca-bundle" version = "0.3.3" @@ -1580,8 +1628,35 @@ dependencies = [ "isolang", "lazy_static", "linked-hash-map", - "oca-ast", + "oca-ast 0.3.3", + "paste", + "regex", + "said 0.3.0", + "serde", + "serde-value", + "serde_json", + "serde_yaml", + "thiserror", + "urn", + "wasm-bindgen", +] + +[[package]] +name = "oca-bundle" +version = "0.3.7" +dependencies = [ + "cascade", + "convert_case 0.6.0", + "dyn-clonable", + "erased-serde", + "getrandom", + "indexmap", + "isolang", + "lazy_static", + "linked-hash-map", + "oca-ast 0.3.7", "paste", + "piccolo", "regex", "said 0.3.0", "serde", @@ -1595,15 +1670,13 @@ dependencies = [ [[package]] name = "oca-dag" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385d9c84cd745731fd1906766c8e2ff616cc6c8e1b7e5babf11297ec87608da6" +version = "0.3.7" dependencies = [ "dyn-clonable", "indexmap", "isolang", - "oca-ast", - "oca-bundle", + "oca-ast 0.3.7", + "oca-bundle 0.3.7", "said 0.3.0", "serde", "serde_json", @@ -1612,18 +1685,18 @@ dependencies = [ [[package]] name = "oca-file" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bef20722a2f650577404962a27a488c965b74136bd10db7eb175b8159ad27ec" +version = "0.3.7" dependencies = [ "clap 4.3.5", + "convert_case 0.6.0", "env_logger", "indexmap", "log", - "oca-ast", + "oca-ast 0.3.7", "pest", "pest_derive", "pretty_assertions", + "recursion", "said 0.3.0", "serde", "serde_json", @@ -1640,7 +1713,7 @@ dependencies = [ "calamine", "clap 3.2.25", "isolang", - "oca-bundle", + "oca-bundle 0.3.3", "said 0.1.2", "semver", "serde", @@ -1662,6 +1735,7 @@ dependencies = [ "oca-parser-xls", "oca-rs", "rusqlite", + "said 0.3.0", "serde", "serde-value", "serde_json", @@ -1670,19 +1744,18 @@ dependencies = [ [[package]] name = "oca-rs" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6162767593039e6833019ee060ccf9c68b74c2acca47c8893ce20bb4c39ec381" +version = "0.3.7" dependencies = [ - "convert_case 0.6.0", "dyn-clonable", "isolang", - "oca-ast", - "oca-bundle", + "log", + "oca-ast 0.3.7", + "oca-bundle 0.3.7", "oca-dag", "oca-file", "regex", "rusqlite", + "said 0.3.0", "serde", "serde_json", "sled", @@ -1837,7 +1910,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] @@ -1869,6 +1942,20 @@ dependencies = [ "siphasher", ] +[[package]] +name = "piccolo" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba2e6f768e3311fabb1e7ab5ac159a41c7a33a2d584d0d739aeeeabd54c3321" +dependencies = [ + "anyhow", + "gc-arena", + "hashbrown 0.14.0", + "rand", + "rustc-hash", + "thiserror", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1912,14 +1999,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" dependencies = [ "unicode-ident", ] @@ -1936,9 +2023,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1973,6 +2060,12 @@ dependencies = [ "getrandom", ] +[[package]] +name = "recursion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f53e857b2b1b92a9265c645b3d5aa76d8435f81d06af5ca08f9027b1225351c2" + [[package]] name = "redox_syscall" version = "0.2.16" @@ -2136,7 +2229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6614340171cdb3eb6dca3a9ce208a7564b96b852ee1bd8537ee931e81b1df633" dependencies = [ "quote", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] @@ -2191,9 +2284,9 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.164" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" dependencies = [ "serde_derive", ] @@ -2208,6 +2301,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b713f70513ae1f8d92665bbbbda5c295c2cf1da5542881ae5eefe20c9af132" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_cbor" version = "0.11.2" @@ -2220,13 +2324,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] @@ -2375,6 +2479,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + [[package]] name = "strsim" version = "0.10.0" @@ -2419,15 +2529,27 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.46", + "unicode-xid", +] + [[package]] name = "termcolor" version = "1.2.0" @@ -2460,7 +2582,7 @@ checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] @@ -2543,7 +2665,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", ] [[package]] @@ -2638,6 +2760,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "unsafe-libyaml" version = "0.2.8" @@ -2693,9 +2821,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2703,24 +2831,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2728,22 +2856,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.46", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "which" diff --git a/Cargo.toml b/Cargo.toml index 32570a5..019ba88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ name = "oca-repository" version = "0.1.0" edition = "2021" license = "EUPL-1.2" +resolver = "2" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -22,9 +23,11 @@ dyn-clonable = "0.9.0" indexmap = { version = "1.9.3", features = ["serde"] } isolang = "2.3.0" oca-parser-xls = { version = "2.0.0-rc.2", optional = true } -oca-rs = "0.3.3" +oca-rs = { version = "0.3.7", path = "../oca-rs/oca" } rusqlite = "0.29.0" serde = { version = "1.0", features = ["derive"] } serde-value = "0.7.0" serde_json = "1.0" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } +said = { version = "0.3.0", features = ["macros"] } + diff --git a/README.md b/README.md index 3b9613e..9dcbc73 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,29 @@ docker run ## Development +With Docker and latest release + ``` git clone git@github.com:THCLab/oca-repository-rs.git docker-compose up ``` +Locally with local build: + +``` +cargo build +``` + +``` +./target/debug/oca-repository +``` + +This would start on default port `8000` insance of repository. +You can then use `curl` for playing with api or simply go to `https://repository.oca.argo.colossi.network/` +and switch servers to `localhost:8000` and use swagger. + + Add OCA Bundle: ``` curl -XPOST http://127.0.0.1:8000/oca-bundles \ diff --git a/openapi.yml b/openapi.yml index 084d1fa..4289f6c 100644 --- a/openapi.yml +++ b/openapi.yml @@ -23,9 +23,9 @@ paths: type: string example: | ADD ATTRIBUTE d=Text i=Text passed=Boolean - + ADD META en PROPS name="Entrance credential" description="Entrance credential" - + ADD CHARACTER_ENCODING ATTRS d=utf-8 i=utf-8 passed=utf-8 ADD CONFORMANCE ATTRS d=M i=M passed=M ADD LABEL en ATTRS d="Schema digest" i="Credential Issuee" passed="Passed" @@ -79,9 +79,18 @@ paths: description: OCA Bundle SAID schema: type: string + - name: w + in: query + description: With dependecies - dereference all nested SAID and provide in form of an array + schema: + type: boolean responses: '200': description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/BundleWithDeps' '404': description: Bundle not found @@ -180,3 +189,15 @@ components: namespaceToken: type: http scheme: bearer + schemas: + BundleWithDeps: + type: object + properties: + bundles: + type: object + description: Main oca bundle + dependencies: + type: array + items: + type: object + description: oca bundle diff --git a/src/routes/oca_bundles.rs b/src/routes/oca_bundles.rs index 2862dd8..6d4584e 100644 --- a/src/routes/oca_bundles.rs +++ b/src/routes/oca_bundles.rs @@ -2,6 +2,7 @@ use actix_web::{http::header::ContentType, web, HttpRequest, HttpResponse}; use oca_rs::EncodeBundle; use serde::{Deserialize, Serialize}; use std::{str::FromStr, sync::Mutex}; +use said::SelfAddressingIdentifier; pub async fn add_oca_file( oca_facade: web::Data>, @@ -106,32 +107,38 @@ pub async fn search( .body(serde_json::to_string(&result).unwrap()) } +#[derive(Deserialize)] +pub struct OCABundleQueryParams { + w: Option, // with_dependencies +} + pub async fn get_oca_bundle( oca_facade: web::Data>, req: HttpRequest, + query_params: web::Query ) -> HttpResponse { - let said = req.match_info().get("said").unwrap().to_string(); + let said_str = req.match_info().get("said").unwrap().to_string(); + let said = SelfAddressingIdentifier::from_str(&said_str).unwrap(); + + let with_dependencies = query_params.w.unwrap_or(false); let result = match oca_facade .lock() .unwrap_or_else(|e| e.into_inner()) - .get_oca_bundle(said) + .get_oca_bundle(said, with_dependencies) { - Ok(oca_bundle) => serde_json::from_str( - &String::from_utf8(oca_bundle.encode().unwrap()).unwrap(), - ) - .unwrap(), + Ok(oca_bundle) => serde_json::to_string_pretty(&oca_bundle).expect("Failed to serialize oca_bundle"), Err(errors) => { - serde_json::json!({ + serde_json::to_string(&serde_json::json!({ "success": false, "errors": errors, - }) + })).expect("Failed to serialize errors") } }; HttpResponse::Ok() .content_type(ContentType::json()) - .body(serde_json::to_string(&result).unwrap()) + .body(result) } #[derive(Deserialize)] @@ -152,7 +159,8 @@ pub async fn get_oca_file_history( oca_bundle: Option, } - let said = req.match_info().get("said").unwrap().to_string(); + let said_str = req.match_info().get("said").unwrap().to_string(); + let said = SelfAddressingIdentifier::from_str(&said_str).unwrap(); let result = match oca_facade .lock() @@ -196,12 +204,13 @@ pub async fn get_oca_file( oca_facade: web::Data>, req: HttpRequest, ) -> HttpResponse { - let said = req.match_info().get("said").unwrap().to_string(); + let said_str = req.match_info().get("said").unwrap().to_string(); + let said = SelfAddressingIdentifier::from_str(&said_str).unwrap(); match oca_facade .lock() .unwrap_or_else(|e| e.into_inner()) - .get_oca_bundle_ocafile(said) + .get_oca_bundle_ocafile(said, true) { Ok(ocafile) => HttpResponse::Ok() .content_type(ContentType::plaintext())