@@ -14,32 +14,15 @@ namespace Repository.App.API
14
14
{
15
15
public class Endpoints
16
16
{
17
- // TODO: Delete this dict and its uses before hand-in
18
- static Dictionary < string , int > numUpdates = new Dictionary < string , int > ( ) ;
19
- //static DatabaseManager databaseManager = new DatabaseManager(new MetadataDb());
20
- //static ResourceManager resourceManager = new ResourceManager(new FileDb(), new MetadataDb());
21
17
public Endpoints ( WebApplication app )
22
18
{
23
- //databaseManager.TrackAllDynamicResources();
24
-
25
- // TODO: Delete if we don't end up using MultiThreadFileWriter
26
- //var fileWriter = app.Services.GetRequiredService<MultiThreadFileWriter>();
27
- //fileWriter.WriteLine("yo", "c:\\myfile.txt");
28
-
29
- // Rate limiting is added to some endpoints only, as it will keep the program stable.
30
- // The endpoints without rate limiting, such as ping, are endpoints we don't expect to break anything from a large amount of requests, and rate limiting would only be to prevent ddos attacks.
31
- // If we add rate limiting to these endpoints, we need to add another policy that allows a higher request rate than the one used for files.
32
- // Metadata already has an internal queue for writing updates, which means rate limiting isn't required.
33
- // TODO: metadata queue only applies when writing to the file, not reading from. This hasn't been an issue so far, but maybe rate limiting on metadata read requests could be useful.
34
19
var ratePolicy = "fixed" ;
35
20
36
21
var _hostEnvironment = app . Environment ;
37
22
#region connection
38
23
// To maintain connection
39
24
app . MapGet ( "ping" , ( HttpContext httpContext ) =>
40
25
{
41
- //var appUrl = app.Urls.FirstOrDefault();
42
- //Console.WriteLine("Repo URL: " + appUrl);
43
26
return "pong" ;
44
27
} ) ;
45
28
@@ -58,30 +41,25 @@ public Endpoints(WebApplication app)
58
41
Console . WriteLine ( "Received GET request for file on resource id: " + resourceId ) ;
59
42
return manager . GetFileById ( resourceId ) ;
60
43
} ) ;
61
- //.RequireRateLimiting(ratePolicy); // TODO: Find out if retrieving files without rate limiter can be an issue (especially with streaming)
62
44
63
45
// To save incomming files (.png, .xes, .bpmn, .pnml etc)
64
46
app . MapPost ( "/resources" , ( HttpContext context , ResourceManager manager ) => {
65
47
Console . WriteLine ( "Received POST request to save file" ) ;
66
- var appUrl = app . Urls . FirstOrDefault ( ) ;
67
- var formObject = context . Request . Form . ToFormObject ( ) ;
48
+ var request = context . Request ;
49
+ //var appUrl = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}{request.QueryString}"; // Full URL with path and everything
50
+ var appUrl = $ "{ request . Scheme } ://{ request . Host } { request . PathBase } ";
51
+ var formObject = context . Request . Form . ToFormObject ( appUrl ) ;
68
52
69
53
if ( formObject == null ) return Results . BadRequest ( "Invalid FormData keys" ) ;
70
54
if ( formObject . File == null ) return Results . BadRequest ( "Exactly one file is required" ) ;
71
55
if ( formObject . Host == null ) formObject . Host = $ "{ appUrl } /resources/";
72
- return manager . PostFile ( formObject , appUrl ! ) ;
56
+ return manager . PostFile ( formObject ) ;
73
57
} )
74
58
. RequireRateLimiting ( ratePolicy ) ;
75
59
76
60
app . MapPut ( "/resources/{resourceId}" , ( HttpContext context , string resourceId , ResourceManager manager ) =>
77
61
{
78
62
Console . WriteLine ( "Received PUT request to update file with id: " + resourceId ) ;
79
-
80
- // TODO: Delete the following section. Just to track number of updates and to print headers:
81
- if ( numUpdates . ContainsKey ( resourceId ) ) numUpdates [ resourceId ] += 1 ;
82
- else numUpdates [ resourceId ] = 1 ;
83
- Console . WriteLine ( $ "Num updates for { resourceId } = { numUpdates [ resourceId ] } ") ;
84
-
85
63
var requestFiles = context . Request . Form . Files ;
86
64
if ( requestFiles ? . Count != 1 ) return Results . BadRequest ( "Exactly one file is required" ) ;
87
65
var formFile = requestFiles . Single ( ) ;
@@ -113,32 +91,22 @@ public Endpoints(WebApplication app)
113
91
return manager . GetChildrenMetadataList ( resourceId ) ;
114
92
} ) ;
115
93
94
+ // To save metadata object without a file
116
95
app . MapPost ( "/resources/metadata" , ( HttpRequest request , ResourceManager manager ) =>
117
96
{
118
97
Console . WriteLine ( "Received POST request to create metadata object without a file" ) ;
119
- var appUrl = app . Urls . FirstOrDefault ( ) ; // TODO: This isn't the cleanest way to get our own URL. Maybe change at some point.
120
-
121
- //request.EnableBuffering();
122
- //request.Body.Seek(0, SeekOrigin.Begin);
123
- //if (request.ContentLength == 0)
124
- // return Results.BadRequest("Invalid request. Body must have form data.");
98
+ var appUrl = $ "{ request . Scheme } ://{ request . Host } { request . PathBase } ";
125
99
126
100
var formObject = request . Form . ToFormObject ( ) ;
127
101
if ( formObject == null ) return Results . BadRequest ( "Invalid FormData keys" ) ;
128
102
return manager . PostMetadata ( formObject , appUrl ! ) ;
129
- //return manager.PostMetadata(request.Form, appUrl!);
130
103
} ) ;
131
104
105
+ // To update metadata object only
132
106
app . MapPut ( "/resources/metadata/{resourceId}" , ( HttpRequest request , string resourceId , ResourceManager manager ) =>
133
107
{
134
108
Console . WriteLine ( "Received PUT request to update metadata object without a file" ) ;
135
- var appUrl = app . Urls . FirstOrDefault ( ) ; // TODO: This isn't the cleanest way to get our own URL. Maybe change at some point.
136
-
137
- //request.EnableBuffering();
138
- //request.Body.Seek(0, SeekOrigin.Begin);
139
- //if (request.ContentLength == 0)
140
- // return Results.BadRequest("Invalid request. Body must have form data.");
141
-
109
+ var appUrl = $ "{ request . Scheme } ://{ request . Host } { request . PathBase } ";
142
110
return manager . UpdateMetadataObject ( request . Form , appUrl ! , resourceId ) ;
143
111
} ) ;
144
112
@@ -151,19 +119,21 @@ public Endpoints(WebApplication app)
151
119
return manager . GetFilteredList ( bodyString ) ;
152
120
} ) ;
153
121
#endregion
122
+
154
123
#region visualizers
155
124
// To retrieve graph for given resourceId
156
- app . MapGet ( "/resources/graphs/{resourceId}" , ( string resourceId , ResourceManager manager ) =>
125
+ app . MapGet ( "/resources/graphs/{resourceId}" , ( HttpRequest request , string resourceId , ResourceManager manager ) =>
157
126
{
158
127
Console . WriteLine ( "Received GET request for relation graph on resource id: " + resourceId ) ;
159
128
return manager . GetGraphForResource ( resourceId ) ;
160
129
} ) ;
161
130
162
131
// To create/retrieve a histogram for an EventLog.
163
- app . MapPost ( "/resources/histograms/{resourceId}" , ( string resourceId , ResourceManager manager ) =>
132
+ app . MapPost ( "/resources/histograms/{resourceId}" , ( HttpRequest request , string resourceId , ResourceManager manager ) =>
164
133
{
165
134
Console . WriteLine ( "Received POST request for histogram on resource id: " + resourceId ) ;
166
- var appUrl = app . Urls . FirstOrDefault ( ) ; // TODO: This isn't the cleanest way to get our own URL. Maybe change at some point.
135
+ //var appUrl = app.Urls.FirstOrDefault(); // TODO: This isn't the cleanest way to get our own URL. Maybe change at some point.
136
+ var appUrl = $ "{ request . Scheme } ://{ request . Host } { request . PathBase } ";
167
137
return manager . GetHistogram ( resourceId , appUrl ) ;
168
138
} ) ;
169
139
#endregion
0 commit comments