{"id":21283960,"url":"https://github.com/coronabytes/dotnet-arangodb","last_synced_at":"2025-05-16T15:08:11.090Z","repository":{"id":37012085,"uuid":"237536757","full_name":"coronabytes/dotnet-arangodb","owner":"coronabytes","description":".NET Driver for ArangoDB","archived":false,"fork":false,"pushed_at":"2024-11-30T09:36:55.000Z","size":993,"stargazers_count":67,"open_issues_count":3,"forks_count":18,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-13T00:04:11.281Z","etag":null,"topics":["arangodb","arangodb-client","csharp","database","driver","graph","linq","netcore"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coronabytes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-01-31T23:59:44.000Z","updated_at":"2024-12-14T15:36:01.000Z","dependencies_parsed_at":"2024-11-07T14:19:57.566Z","dependency_job_id":"650b98d9-3e76-491c-b518-588da1ac814c","html_url":"https://github.com/coronabytes/dotnet-arangodb","commit_stats":{"total_commits":284,"total_committers":12,"mean_commits":"23.666666666666668","dds":0.3063380281690141,"last_synced_commit":"98af3acea2638a1ea618bbf2bedb3ed2eadf17ba"},"previous_names":[],"tags_count":89,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coronabytes%2Fdotnet-arangodb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coronabytes%2Fdotnet-arangodb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coronabytes%2Fdotnet-arangodb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coronabytes%2Fdotnet-arangodb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coronabytes","download_url":"https://codeload.github.com/coronabytes/dotnet-arangodb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254331292,"owners_count":22053153,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arangodb","arangodb-client","csharp","database","driver","graph","linq","netcore"],"created_at":"2024-11-21T11:13:18.066Z","updated_at":"2025-05-16T15:08:06.080Z","avatar_url":"https://github.com/coronabytes.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build](https://github.com/coronabytes/dotnet-arangodb/actions/workflows/build.yml/badge.svg)](https://github.com/coronabytes/dotnet-arangodb/actions/workflows/build.yml)\n[![Nuget](https://img.shields.io/nuget/v/Core.Arango)](https://www.nuget.org/packages/Core.Arango)\n[![Nuget](https://img.shields.io/nuget/dt/Core.Arango)](https://www.nuget.org/packages/Core.Arango)\n\n```\ndotnet add package Core.Arango\n```\n\n# .NET driver for ArangoDB\n- .NET Standard 2.0, 2.1, .NET 8 and .NET 9 driver for ArangoDB 3.11+\n- LINQ support (WIP)\n- Newtonsoft.Json and System.Text.Json serialization support with PascalCase and camelCase options\n- Updates from anonymous types supported as (Id, Key, Revision, From, To) properties are translated to (_id, _key, _rev, _from, _to)\n  - This means these property names are reserved and cannot be used for something else (e.g. \"To\" property in email collection) \n\n# Extensions\nThis driver has various [extensions](https://github.com/coronabytes/dotnet-arangodb-extensions) available.\n\n| Extension   | Nuget        | Command |\n| :---        | :---         | :---    |\n| [Core.Arango.Migration](https://www.nuget.org/packages/Core.Arango.Migration) | ![Nuget](https://img.shields.io/nuget/v/Core.Arango.Migration) ![Nuget](https://img.shields.io/nuget/dt/Core.Arango.Migration) | dotnet add package Core.Arango.Migration  |\n| [Core.Arango.DataProtection](https://www.nuget.org/packages/Core.Arango.DataProtection) | ![Nuget](https://img.shields.io/nuget/v/Core.Arango.DataProtection) ![Nuget](https://img.shields.io/nuget/dt/Core.Arango.DataProtection) | dotnet add package Core.Arango.DataProtection |\n| [Core.Arango.DevExtreme](https://www.nuget.org/packages/Core.Arango.DevExtreme) | ![Nuget](https://img.shields.io/nuget/v/Core.Arango.DevExtreme) ![Nuget](https://img.shields.io/nuget/dt/Core.Arango.DevExtreme) | dotnet add package Core.Arango.DevExtreme |\n| [Core.Arango.Serilog](https://www.nuget.org/packages/Core.Arango.Serilog) | ![Nuget](https://img.shields.io/nuget/v/Core.Arango.Serilog) ![Nuget](https://img.shields.io/nuget/dt/Core.Arango.Serilog) | dotnet add package Core.Arango.Serilog |\n\n# Examples\n## Initialize context\n- Realm optionally prefixes all further database handles (e.g. \"myproject-database\")\n- Context is completely thread-safe and can be shared for your whole application\n  ```csharp\n  // from connection string\n  var arango = new ArangoContext(\"Server=http://localhost:8529;Realm=myproject;User=root;Password=;\");\n\n  // from connection string - NO_AUTH\n  var arango = new ArangoContext(\"Server=http://localhost:8529;\");\n\n  // from connection string with PascalCase serialization\n  var arango = new ArangoContext(\"Server=http://localhost:8529;Realm=myproject;User=root;Password=;\",\n  new ArangoConfiguration\n  {\n      Serializer = new ArangoJsonSerializer(new ArangoJsonDefaultPolicy())\n  });\n  ```\n\n- For AspNetCore DI extension is available:\n  ```csharp\n  public void ConfigureServices(IServiceCollection services)\n  {\n      // add with connection string\n      services.AddArango(Configuration.GetConnectionString(\"Arango\"));\n    \n      // or add with custom configuration\n      services.AddArango((sp, config) =\u003e\n      {\n          config.ConnectionString = Configuration.GetConnectionString(\"Arango\");\n          config.Serializer = new ArangoJsonSerializer(new ArangoJsonDefaultPolicy());\n        \n          var logger = sp.GetRequiredService\u003cILogger\u003cStartup\u003e\u003e();\n \n          config.QueryProfile = (query, bindVars, stats) =\u003e\n          {\n              var boundQuery = query;\n\n              // replace parameters with bound values\n              foreach (var p in bindVars.OrderByDescending(x =\u003e x.Key.Length))\n                  boundQuery = boundQuery.Replace(\"@\" + p.Key, JsonConvert.SerializeObject(p.Value));\n\n              logger.LogInformation(boundQuery);\n          }\n      });\n  }\n  ```\n\n  ```csharp\n  [ApiController]\n  [Route(\"api/demo\")]\n  public class DemoController : Controller \n  {\n      private readonly IArangoContext _arango;\n\n      public DemoController(IArangoContext arango)\n      {\n          _arango = arango;\n      }\n  }\n  ```\n\n### Serializer definition\nThe specific serializer can be configured on setting the Arango configuration when creating the context. \n\nSupported serializer:\n\n- **Microsoft System.Text.Json**\n  ```csharp\n  using Core.Arango.Serialization.Json;\n\n  // Specify with PascalCase\n  Serializer = new ArangoJsonSerializer(new ArangoJsonDefaultPolicy());\n\n  // Specify with camelCase\n  Serializer = new ArangoJsonSerializer(new ArangoJsonCamelCasePolicy());\n  ```\n\n- **Newtonsoft.Json**\n  ```csharp\n  using Core.Arango.Serialization.Newtonsoft;\n\n  // Specify with PascalCase\n  Serializer = new ArangoNewtonsoftSerializer(new ArangoNewtonsoftDefaultContractResolver()) \n\n  // Specify with CamelCase\n  Serializer = new ArangoNewtonsoftSerializer(new ArangoNewtonsoftCamelCaseContractResolver())\n  ```\n  \n### Serialize DateTime / DateTimeOffset to Unix Timestamp\n- **Microsoft System.Text.Json**\n  ```csharp\n  using Core.Arango.Serialization.Json;\n\n  // Model example: uses DateTimeOffset\n  private class DateTimeOffsetEntity\n  {\n      public DateTimeOffset A { get; set; }\n      public DateTimeOffset B { get; set; }\n\n  }\n\n  // Define serializer on Arango context\n  Serializer = new ArangoJsonSerializer(new ArangoJsonDefaultPolicy())\n  {\n      UseTimestamps = true // Serialize DateTime / DateTimeOffset to Unix Timestamp (in milliseconds)\n  };\n\n  // Use\n  await arango.Document.CreateAsync(\"database\", \"collection\", instanceOfDateTimeOffsetEntity); // Converts between Unix Timestamp in DB and C# data type\n  ```\n\n- **Newtonsoft.Json**\n  ```csharp\n  // not supported\n  ```\n  \n## Create database\n```csharp\nawait arango.Database.CreateAsync(\"database\");\n```\n\n## Create collection\n```csharp\nawait arango.Collection.CreateAsync(\"database\", \"collection\", ArangoCollectionType.Document);\n```\n\n### Collection with keys in ascending lexicographical sort order (ideal for log/audit collections)\n```csharp\nawait arango.Collection.CreateAsync(\"database\", new ArangoCollection\n{\n    Name = \"paddedcollection\",\n    Type = ArangoCollectionType.Document,\n    KeyOptions = new ArangoKeyOptions\n    {\n        Type = ArangoKeyType.Padded,\n        AllowUserKeys = false\n    }\n});\n```\n\n## Create document\n```csharp\nawait arango.Document.CreateAsync(\"database\", \"collection\", new\n{\n    Key = Guid.NewGuid(),\n    SomeValue = 1\n});\n```\n\n## Get documents\nRetrieve documents from a single collection based on a LinQ statement. See LinQ help for more information.\n```csharp\nvar list1 = await Arango.Query\u003cEntity\u003e(\"database\").Where(p =\u003e p.Id == \"myid\").ToListAsync();\n```\n\nGet (many) documents by providing a list of keys or objects with \"Key\" and optional \"Revision\" property\n```csharp\nvar list1 = await Arango.Document.GetManyAsync\u003cEntity\u003e(\"database\", \"collection\", new List\u003cstring\u003e {\n  \"1\", \"2\"\n});\n\nvar list2 = await Arango.Document.GetManyAsync\u003cEntity\u003e(\"database\", \"collection\", new List\u003cobject\u003e\n{\n  new\n  {\n    Key = \"1\"\n  },\n  new\n  {\n    Key = \"2\"\n  }\n});\n```\n\n## Update document\n```csharp\nawait arango.Document.UpdateAsync(\"database\", \"collection\", new\n{\n    Key = Guid.Parse(\"some-guid\"),\n    SomeValue = 2\n});\n```\n\n### Ignore specific properties\n```csharp\n// depending on serializer\nusing System.Text.Json.Serialization;\n// or\nusing Newtonsoft.Json;\n\nclass ComplexEntity\n{\n    public string Key { get; set; }\n    public string Name { get; set; }\n    \n    // Will never be read or written from or to arangodb\n    [JsonIgnore]\n    public object Data { get; set; }\n    \n    // Newtonsoft only\n    // Will only be read from query, on write will be ignored\n    [ArangoIgnore]\n    public object CalculatedProperty { get; set; }\n}\n\nawait arango.Document.UpdateAsync(\"database\", \"collection\", new ComplexEntity {\n    Key = \"123\",\n    Name = \"SomeName\"\n});\n```\n\n## Custom Query\n### Bindable parameters\n```csharp\nvar col = \"collection\";\nvar list = new List\u003cint\u003e {1, 2, 3};\n\n// System.Text.Json\nvar result = await arango.Query.ExecuteAsync\u003cJsonObject\u003e(\"database\",\n  $\"FOR c IN {col:@} FILTER c.SomeValue IN {list} RETURN c\");\n\n// Newtonsoft.Json\nvar result = await arango.Query.ExecuteAsync\u003cJObject\u003e(\"database\",\n  $\"FOR c IN {col:@} FILTER c.SomeValue IN {list} RETURN c\");\n```\n\nResults in AQL injection save syntax:\n```js\n'FOR c IN @@C1 FILTER c.SomeValue IN @P2 RETURN c'\n\n{\n  \"@C1\": \"collection\",\n  \"P2\": [1, 2, 3]\n}\n```\nfor collections parameters, formats `'@'`, `'C'` and `'c'` are supported. They all mean the same format.\n\n### Split queries into parts\n```csharp\nvar collectionName = \"collection\";\nvar list = new List\u003cint\u003e {1, 2, 3};\n\nFormattableString forPart = $\"FOR c IN {collectionName:@}\";\nFormattableString filterPart = $\"FILTER c.SomeValue IN {list}\";\nFormattableString returnPart = $\"RETURN c\";\n\n// System.Text.Json\nvar result = await arango.Query.ExecuteAsync\u003cJsonObject\u003e(\"database\",\n  $\"{forPart} {filterPart} {returnPart}\");\n\n// Newtonsoft.Json\nvar result = await arango.Query.ExecuteAsync\u003cJObject\u003e(\"database\",\n  $\"{forPart} {filterPart} {returnPart}\");\n```\n\n**Note**  \nIf using multiple `FormattableString` variables, every single injected string variable needs to be of type `FormattableString` or Arango will return an error stating:  \n```exception\nAQL: syntax error, unexpected bind parameter near @P3\n```\n\n### Inject data into Arango return\n```csharp\npublic class MyClass2\n{\n    public MyClass Data { get; set; }\n    public double CustomData { get; set; }\n}\n\nvar collectionName = \"collection\";\nvar list = new List\u003cint\u003e {1, 2, 3};\nvar pointA = \"[48.157741, 11.503159]\";\nvar pointB = \"[48.155739, 11.491601]\";\n\nFormattableString forPart = $\"FOR c IN {collectionName:@}\";\nFormattableString filterPart = $\"FILTER c.SomeValue IN {list}\";\nFormattableString letDistance = $\"LET distance = GEO_DISTANCE({pointA}, {pointB})\";\nFormattableString returnPart = $\"RETURN {{Data: c, Distance: distance}}\";\n\nvar result = await arango.Query.ExecuteAsync\u003cMyClass2\u003e(\"database\",\n  $\"{forPart} {filterPart} {letDistance} {returnPart}\");\n```\n\n## Query with async enumerator\n```csharp\n// insert 100.000 entities \nawait Arango.Document.CreateManyAsync(\"database\", \"collection\", Enumerable.Range(1, 100000).Select(x =\u003e new Entity { Value = x }));\n\n// iterate in batches over 100.000 entity ids\nawait foreach (var x in Arango.Query.ExecuteStreamAsync\u003cstring\u003e(\"database\", $\"FOR c IN collection RETURN c._id\"))\n{\n    Process(x)\n}\n```\n\n## Linq\nLINQ support has been adapted from https://github.com/ra0o0f/arangoclient.net. Internalized re-motion relinq since their nuget is quite outdated\n\nWork in progress as some things are deprecated or need to be modernized\n  - Basic queries generally work\n  - Some more complex queries (chaining multiple operators, complex subqueries, etc.) are not supported yet\n  - All these issues are solvable and pull requests are accepted\n  - NOTE : Some queries will blow up at run time and you will get an exception, but some queries will actually generate valid AQL with the wrong semantics.\n  - Combining multiple result operators is not recommended with the current implementation (e.g. `.Intersect(list).Count()` will generate valid AQL but will apply the operators in the wrong order)\n  - The following operators are not yet supported:\n    - `.Average`\n    - `.Cast`\n    - `.Distinct`\n    - `.GroupJoin`\n    - `.Intersect`\n    - `.Join`\n    - `.Last`\n    - `.Reverse`\n- All other operators should be supported. If you find any queries that fail or generate incorrect AQL, open an issue so we can at least document it. A PR with a (failing) unit test would be even better!\n- There is also development done on a driver without relinq and aggregate support\n- Configurable property / collection / group naming for camelCase support\n\n### Simple query\n```csharp\nvar list1 = await Arango.Query\u003cProject\u003e(\"database\").Where(p =\u003e p.Id == \"myid\").ToListAsync();\n```\n\n### AQL debug\n```csharp\nvar q = Arango.Query\u003cProject\u003e(\"database\").Where(p =\u003e p.Id == \"myid\");\n\n// Execute\nawait q.ToListAsync();\n\n// Debug\nvar (aql, bindVars) = q.ToAql();\n```\n\n### DOCUMENT() lookup\n```csharp\nvar q = Arango.Query\u003cProject\u003e(\"test\")\n.Where(x =\u003e x.Name == \"Project A\")\n.Select(x =\u003e new\n{\n    x.Key,\n    x.Name,\n    ClientName = Aql.Document\u003cClient\u003e(\"Client\", x.ClientKey).Name\n});\n\n// Execute\nawait q.ToListAsync();\n\n// Debug\nvar (aql, bindVars) = q.ToAql();\n```\n\n### Let clauses for subqueries\nNote: database/transaction is only specified on the root expression, not on the inner one\n```csharp\nvar q = from p in Arango.Query\u003cProject\u003e(\"test\")\nlet clients = (from c in Arango.Query\u003cClient\u003e() select c.Key)\nselect new {p.Name, Clients = Aql.As\u003cstring[]\u003e(clients) };\n\nawait q.ToListAsync();\n```\n\n### Update\n```csharp\nvar q = Arango.Query\u003cProject\u003e(\"test\")\n  .Where(x =\u003e x.Name == \"Project A\")\n  .Update(x =\u003e new\n  {\n    Name = Aql.Concat(x.Name, \"2\")\n  }, x =\u003e x.Key);\n\t\t\nawait q.ToListAsync();\n```\n\n### Partial Update\n- Note: To push an object to inner collection.\n\n```csharp\nvar q = Arango.Query\u003cProject\u003e(\"test\")\n  .PartialUpdate(p=\u003ep.hobbies, x =\u003e new\n  {\n    \"val1\"=1,\"val2\"=2\n  }, x =\u003e x.Key);\n\t\t\nawait q.ToListAsync();\n```\n\nwill be converted to:\n```sql\nFOR doc IN Project\nUPDATE doc WITH {\n  hobbies: PUSH(doc.hobbies, {\"val1\": 1, \"val2\":2})\n} IN users\n```\n\n### Remove\n```csharp\nawait Arango.Query\u003cProject\u003e(\"test\")\n.Where(x =\u003e x.Name == \"Project A\")\n.Remove().In\u003cProject\u003e().Select(x =\u003e x.Key).ToListAsync();\n```\n\n### OPTIONS\n\"Option\" is the query option that exists in ArangoDb.\nSome operations like  FOR / Graph Traversal / SEARCH / COLLECT / INSERT / UPDATE / REPLACE / UPSERT / REMOVE would support \"Options\".\n\n```csharp\nawait Arango.Query\u003cProject\u003e(\"test\")\n.Where(x =\u003e x.Name == \"Project A\")\n.Options(() =\u003e new { indexHint = \"byName\" }).ToListAsync();\n```\n\n## Create index\n```csharp\nawait arango.Index.CreateAsync(\"database\", \"collection\", new ArangoIndex\n{\n    Fields = new List\u003cstring\u003e {\"SomeValue\"},\n    Type = ArangoIndexType.Hash\n});\n```\n\n## Create analyzer\n```csharp\nawait arango.Analyzer.CreateAsync(\"database\", new ArangoAnalyzer\n{\n    Name = \"text_de_nostem\",\n    Type = \"text\",\n    Properties = new ArangoAnalyzerProperties\n    {\n        Locale = \"de.utf-8\",\n        Case = ArangoAnalyzerCase.Lower,\n        Accent = false,\n        Stopwords = new List\u003cstring\u003e(),\n        Stemming = false\n    },\n    Features = new List\u003cstring\u003e { \"position\", \"norm\", \"frequency\" }\n});\n```\n\n## Create view\n```csharp\nawait arango.View.CreateAsync(\"database\", new ArangoView\n{\n    Name = \"SomeView\",\n    Links = new Dictionary\u003cstring, ArangoLinkProperty\u003e\n    {\n        [\"collection\"] = new ArangoLinkProperty\n        {\n            Fields = new Dictionary\u003cstring, ArangoLinkProperty\u003e\n            {\n                [\"SomeProperty\"] = new ArangoLinkProperty\n                {\n                    Analyzers = new List\u003cstring\u003e\n                    {\n                        \"text_en\"\n                    }\n                }\n            }\n        }\n    },\n    PrimarySort = new List\u003cArangoSort\u003e\n    {\n        new ArangoSort\n        {\n            Field = \"SomeProperty\",\n            Direction = ArangoSortDirection.Asc\n        }\n    }\n});\n```\n\n## Create graph\n```csharp\nawait arango.Collection.CreateAsync(\"database\", \"vertices\", ArangoCollectionType.Document);\nawait Arango.Collection.CreateAsync(\"database\", \"edges\", ArangoCollectionType.Edge);\n\nawait Arango.Graph.CreateAsync(\"database\", new ArangoGraph\n{\n    Name = \"graph\",\n    EdgeDefinitions = new List\u003cArangoEdgeDefinition\u003e\n    {\n        new()\n        {\n          Collection = \"edges\",\n          From = new List\u003cstring\u003e {\"vertices\"},\n          To = new List\u003cstring\u003e {\"vertices\"}\n        }\n    }\n});\n```\n\n## Graph manipulation\n```csharp\nawait arango.Graph.Vertex.CreateAsync(\"database\", \"graph\", \"vertices\", new\n{\n    Key = \"alice\",\n    Name = \"Alice\"\n});\n\nawait arango.Graph.Vertex.CreateAsync(\"database\", \"graph\", \"vertices\", new\n{\n    Key = \"bob\",\n    Name = \"Bob\"\n});\n\nawait arango.Graph.Edge.CreateAsync(\"database\", \"graph\", \"edges\", new\n{\n    Key = \"ab\",\n    From = \"vertices/alice\",\n    To = \"vertices/bob\",\n    Label = \"friend\"\n});\n\nawait arango.Graph.Edge.UpdateAsync(\"database\", \"graph\", \"edges\", \"ab\", new\n{\n    Label = \"foe\"\n});\n\nawait arango.Graph.Vertex.RemoveAsync(\"database\", \"graph\", \"vertices\", \"bob\");\n```\n\n## Create custom function\n```csharp\nawait arango.Function.CreateAsync(\"database\", new ArangoFunctionDefinition\n{\n  Name = \"CUSTOM::TIMES10\",\n  Code = \"function (a) { return a * 10; }\",\n  IsDeterministic = true\n});\n```\n\n## Stream transactions\n```csharp\nvar transaction = await arango.Transaction.BeginAsync(\"database\", new ArangoTransaction\n{\n    Collections = new ArangoTransactionScope\n    {\n        Write = new List\u003cstring\u003e { \"collection\" }\n    }\n});\n\nawait arango.Document.CreateAsync(transaction, \"collection\", new\n{\n    Key = Guid.NewGuid(),\n    SomeValue = 1\n});\n\nawait arango.Document.CreateAsync(transaction, \"collection\", new\n{\n    Key = Guid.NewGuid(),\n    SomeValue = 2\n});\n\nawait arango.Transaction.CommitAsync(transaction);\n```\n\n## Foxx services\n```csharp\n// Build Foxx service zip archive\nawait using var ms = new MemoryStream();\nusing (var zip = new ZipArchive(ms, ZipArchiveMode.Create, true, Encoding.UTF8))\n{\n    await using (var manifest = zip.CreateEntry(\"manifest.json\").Open())\n    {\n        await manifest.WriteAsync(Encoding.UTF8.GetBytes(@\"\n{\n  \"\"$schema\"\": \"\"http://json.schemastore.org/foxx-manifest\"\",\n  \"\"name\"\": \"\"SampleService\"\",\n  \"\"description\"\": \"\"test\"\",\n  \"\"version\"\": \"\"1.0.0\"\",\n  \"\"license\"\": \"\"MIT\"\",\n  \"\"engines\"\": {\n    \"\"arangodb\"\": \"\"^3.0.0\"\"\n  },\n  \"\"main\"\": \"\"index.js\"\",\n  \"\"configuration\"\": {\n    \"\"currency\"\": {\n      \"\"description\"\": \"\"Currency symbol to use for prices in the shop.\"\",\n      \"\"default\"\": \"\"$\"\",\n      \"\"type\"\": \"\"string\"\"\n    },\n      \"\"secretKey\"\": {\n      \"\"description\"\": \"\"Secret key to use for signing session tokens.\"\",\n      \"\"type\"\": \"\"password\"\"\n    }\n  }\n}\n\"));\n    }\n\n    await using (var readme = zip.CreateEntry(\"README\").Open())\n    {\n        await readme.WriteAsync(Encoding.UTF8.GetBytes(@\"\nREADME!\n\"));\n    }\n\n    await using (var index = zip.CreateEntry(\"index.js\").Open())\n    {\n        await index.WriteAsync(Encoding.UTF8.GetBytes(@\"\n'use strict';\nconst createRouter = require('@arangodb/foxx/router');\nconst router = createRouter();\n\nmodule.context.use(router);\nrouter.get('/hello-world', function (req, res) {{\n  res.send({{ hello: 'world' }});\n}})\n.response(['application/json'], 'A generic greeting.')\n.summary('Generic greeting')\n.description('Prints a generic greeting.');\n\"));\n    }\n}\n\nms.Position = 0;\n\n// install service\nawait Arango.Foxx.InstallServiceAsync(\"database\", \"/sample/service\", ArangoFoxxSource.FromZip(ms));\n\n// list services excluding system services\nvar services = await Arango.Foxx.ListServicesAsync(\"database\", true);\n\n// call service\nvar res = await Arango.Foxx.GetAsync\u003cDictionary\u003cstring, string\u003e\u003e(\"database\", \"/sample/service/hello-world\");\nAssert.Equal(\"world\", res[\"hello\"]);\n```\n\n## Hot Backup (Enterprise Edition only)\n```csharp\nvar backup = await Arango.Backup.CreateAsync(new ArangoBackupRequest\n{\n\tAllowInconsistent = false,\n\tForce = true,\n\tLabel = \"test\",\n\tTimeout = 30\n});\n\nvar backups = await Arango.Backup.ListAsync();\n\nawait Arango.Backup.RestoreAsync(backup.Id);\n\nawait Arango.Backup.DeleteAsync(backup.Id);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoronabytes%2Fdotnet-arangodb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoronabytes%2Fdotnet-arangodb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoronabytes%2Fdotnet-arangodb/lists"}