1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
using System.Text.Json;
using System.Text.Json.Nodes;
namespace Spacebar.Models.Api;
public class SpacebarApiException : Exception {
public int Code { get; set; }
public string ErrorMessage { get; set; }
public string? Request { get; set; } // Spacebar extension
// public Dictionary<string, FieldErrorList> Errors { get; set; }
public JsonObject? Errors { get; set; }
public JsonObject?[]? AjvErrors { get; set; }
public JsonObject? OriginalErrorData { get; init; }
public class FieldErrorList {
// public
}
public SpacebarApiException(string? message) : base(message) { }
// TODO: abstract out to HTTP layer
public static SpacebarApiException FromJson(JsonObject resp) {
var msg = resp["code"]!.GetValue<int>() + " " + resp["message"]!.GetValue<string>();
if (resp.ContainsKey("_ajvErrors") && resp["_ajvErrors"]!.AsArray().Any()) {
msg = msg + " " + resp["_ajvErrors"]!.ToJsonString(new() { WriteIndented = true });
} else if (resp.ContainsKey("errors") && resp["errors"]!.AsObject().Any()) {
msg = msg + " " + resp["errors"]!.ToJsonString(new() { WriteIndented = true });
}
var ex = new SpacebarApiException(msg) {
OriginalErrorData = resp,
Code = resp["code"]!.GetValue<int>(),
ErrorMessage = resp["message"]!.GetValue<string>(),
Request = resp["request"]?.GetValue<string>(),
Errors = resp["errors"]?.AsObject(),
AjvErrors = resp["_ajvErrors"]?.Deserialize<JsonObject?[]>(),
};
return ex;
}
public JsonObject AsJsonObject() => OriginalErrorData?.DeepClone().AsObject() ?? new() {
{ "message", Message },
{ "code", Code },
{ "request", Request },
{ "errors", Errors }
};
}
|