diff --git a/src/Hqub.MusicBrainz.Tests/AreaGetTests.cs b/src/Hqub.MusicBrainz.Tests/AreaGetTests.cs
new file mode 100644
index 0000000..a335286
--- /dev/null
+++ b/src/Hqub.MusicBrainz.Tests/AreaGetTests.cs
@@ -0,0 +1,61 @@
+namespace Hqub.MusicBrainz.Tests
+{
+ using Hqub.MusicBrainz.Entities;
+ using NUnit.Framework;
+ using System.Linq;
+ using System.Threading.Tasks;
+
+ // Resource: area-get.json
+ // URL: https://musicbrainz.org/ws/2/area/c9ac1239-e832-41bc-9930-e252a1fd1105?inc=area-rels&fmt=json
+
+ public class AreaGetTests
+ {
+ private Area area;
+
+ [OneTimeSetUp]
+ public async Task Init()
+ {
+ var client = new MusicBrainzClient()
+ {
+ Cache = EmbeddedResourceCache.Instance
+ };
+
+ string[] inc = ["area-rels"];
+
+ area = await client.Area.GetAsync("c9ac1239-e832-41bc-9930-e252a1fd1105", inc);
+ }
+
+ [Test]
+ public void TestAreaElements()
+ {
+ Assert.That(area.Id, Is.EqualTo("c9ac1239-e832-41bc-9930-e252a1fd1105"));
+ Assert.That(area.Type, Is.EqualTo("City"));
+ Assert.That(area.Name, Is.EqualTo("Berlin"));
+ Assert.That(area.Relations, Is.Not.Null);
+ Assert.That(area.Iso2Codes, Is.Not.Null);
+ }
+
+ [Test]
+ public void TestAreaForwardRelations()
+ {
+ var list = area.Relations.Where(r => r.TargetType == "area" && r.Direction == "forward");
+
+ Assert.That(list.Count(), Is.GreaterThanOrEqualTo(6));
+ }
+
+ [Test]
+ public void TestAreaBackwardRelations()
+ {
+ var list = area.Relations.Where(r => r.TargetType == "area" && r.Direction == "backward");
+
+ Assert.That(list.Count(), Is.EqualTo(1));
+
+ var relation = list.First();
+
+ Assert.That(relation.Area, Is.Not.Null);
+ Assert.That(relation.Area.Type, Is.EqualTo("Country"));
+ Assert.That(relation.Area.Name, Is.EqualTo("Germany"));
+
+ }
+ }
+}
diff --git a/src/Hqub.MusicBrainz/Entities/Area.cs b/src/Hqub.MusicBrainz/Entities/Area.cs
index 34f1604..8a2245b 100644
--- a/src/Hqub.MusicBrainz/Entities/Area.cs
+++ b/src/Hqub.MusicBrainz/Entities/Area.cs
@@ -11,6 +11,8 @@ namespace Hqub.MusicBrainz.Entities
[DataContract(Name = "area")]
public class Area : IEntity
{
+ #region Properties
+
///
/// Gets or sets the MusicBrainz id.
///
@@ -52,5 +54,20 @@ public class Area : IEntity
///
[DataMember(Name = "iso-3166-2-codes")]
public List Iso2Codes { get; set; }
+
+ #endregion
+
+ #region Sub-queries
+
+ ///
+ /// Gets or sets a list of relations associated to this area.
+ ///
+ ///
+ /// var e = await client.Area.GetAsync(mbid, "area-rels");
+ ///
+ [DataMember(Name = "relations")]
+ public List Relations { get; set; }
+
+ #endregion
}
}
diff --git a/src/Hqub.MusicBrainz/Entities/Relation.cs b/src/Hqub.MusicBrainz/Entities/Relation.cs
index 113b764..7f9d942 100644
--- a/src/Hqub.MusicBrainz/Entities/Relation.cs
+++ b/src/Hqub.MusicBrainz/Entities/Relation.cs
@@ -86,6 +86,12 @@ public class Relation
[DataMember(Name = "work")]
public Work Work { get; set; }
+ ///
+ /// Gets or sets the area relationship (include area-rels).
+ ///
+ [DataMember(Name = "area")]
+ public Area Area { get; set; }
+
// Other relationships:
//
// ///
diff --git a/src/Hqub.MusicBrainz/MusicBrainzClient.cs b/src/Hqub.MusicBrainz/MusicBrainzClient.cs
index 1153894..55b8576 100644
--- a/src/Hqub.MusicBrainz/MusicBrainzClient.cs
+++ b/src/Hqub.MusicBrainz/MusicBrainzClient.cs
@@ -56,6 +56,11 @@ public sealed class MusicBrainzClient : IDisposable
///
public ILookupService Work { get; }
+ ///
+ /// Gets the area entity lookup service.
+ ///
+ public ILookupService Area { get; }
+
#endregion
///
@@ -63,7 +68,7 @@ public sealed class MusicBrainzClient : IDisposable
///
public IRequestCache Cache { get; set; }
- private HttpClient client;
+ private readonly HttpClient client;
///
/// Initializes a new instance of the class.
@@ -116,6 +121,7 @@ public MusicBrainzClient(HttpClient httpClient)
ReleaseGroups = new ReleaseGroupService(this, urlBuilder);
Work = new LookupService(this, urlBuilder, "work");
+ Area = new LookupService(this, urlBuilder, "area");
client = httpClient;
}