-
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathEndpointCapture.cs
More file actions
119 lines (104 loc) · 4.87 KB
/
Copy pathEndpointCapture.cs
File metadata and controls
119 lines (104 loc) · 4.87 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System.Text.Json;
using NpgsqlRest;
namespace NpgsqlRestClient;
/// <summary>
/// Captures endpoint metadata during NpgsqlRest initialization.
/// Used by the --endpoints CLI command to output endpoint information.
/// </summary>
public class EndpointCapture : IEndpointCreateHandler
{
public static RoutineEndpoint[] Endpoints { get; private set; } = [];
public void Cleanup(RoutineEndpoint[] endpoints)
{
Endpoints = endpoints;
}
public static void WriteEndpointsJson(Utf8JsonWriter writer)
{
writer.WriteStartArray();
foreach (var ep in Endpoints)
{
writer.WriteStartObject();
writer.WriteString("method", ep.Method.ToString());
writer.WriteString("path", ep.Path);
// Routine info
writer.WriteStartObject("routine");
writer.WriteString("schema", ep.Routine.Schema);
writer.WriteString("name", ep.Routine.Name);
writer.WriteString("type", ep.Routine.Type.ToString());
if (ep.Routine.Type is RoutineType.Table or RoutineType.View)
{
writer.WriteString("crudType", ep.Routine.CrudType.ToString());
}
writer.WriteBoolean("returnsSet", ep.Routine.ReturnsSet);
writer.WriteBoolean("isVoid", ep.Routine.IsVoid);
writer.WriteString("definition", ep.Routine.SimpleDefinition);
writer.WriteEndObject();
// Parameters
writer.WriteStartArray("parameters");
foreach (var param in ep.Routine.Parameters)
{
writer.WriteStartObject();
writer.WriteString("name", param.ConvertedName);
writer.WriteString("originalName", param.ActualName);
writer.WriteString("type", param.TypeDescriptor.OriginalType);
writer.WriteBoolean("hasDefault", param.TypeDescriptor.HasDefault);
if (ep.HasPathParameters && ep.PathParameters!.Contains(param.ConvertedName, StringComparer.OrdinalIgnoreCase))
{
writer.WriteBoolean("isPathParameter", true);
}
writer.WriteEndObject();
}
writer.WriteEndArray();
// Return columns
if (ep.Routine.ColumnCount > 0)
{
writer.WriteStartArray("returnColumns");
for (int i = 0; i < ep.Routine.ColumnCount; i++)
{
writer.WriteStartObject();
writer.WriteString("name", ep.Routine.ColumnNames[i]);
writer.WriteString("originalName", ep.Routine.OriginalColumnNames[i]);
if (i < ep.Routine.ColumnsTypeDescriptor.Length)
{
writer.WriteString("type", ep.Routine.ColumnsTypeDescriptor[i].OriginalType);
}
writer.WriteEndObject();
}
writer.WriteEndArray();
}
// Configuration
writer.WriteString("requestParamType", ep.RequestParamType.ToString());
writer.WriteBoolean("requiresAuthorization", ep.RequiresAuthorization);
if (ep.AuthorizeRoles is { Count: > 0 })
{
writer.WriteStartArray("authorizeRoles");
foreach (var role in ep.AuthorizeRoles) writer.WriteStringValue(role);
writer.WriteEndArray();
}
if (ep.Login) writer.WriteBoolean("login", true);
if (ep.Logout) writer.WriteBoolean("logout", true);
if (ep.SecuritySensitive) writer.WriteBoolean("securitySensitive", true);
if (ep.Raw) writer.WriteBoolean("raw", true);
if (ep.Cached) writer.WriteBoolean("cached", true);
if (ep.Upload) writer.WriteBoolean("upload", true);
if (ep.IsProxy) writer.WriteBoolean("isProxy", true);
if (ep.UserContext) writer.WriteBoolean("userContext", true);
if (ep.UseUserParameters) writer.WriteBoolean("userParameters", true);
if (ep.ConnectionName is not null) writer.WriteString("connectionName", ep.ConnectionName);
if (ep.SseEventsPath is not null) writer.WriteString("sseEventsPath", ep.SseEventsPath);
if (ep.RateLimiterPolicy is not null) writer.WriteString("rateLimiterPolicy", ep.RateLimiterPolicy);
if (ep.ErrorCodePolicy is not null) writer.WriteString("errorCodePolicy", ep.ErrorCodePolicy);
if (ep.CustomParameters is { Count: > 0 })
{
writer.WriteStartObject("customParameters");
foreach (var kvp in ep.CustomParameters)
{
writer.WriteString(kvp.Key, kvp.Value);
}
writer.WriteEndObject();
}
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}