Ignore:
Timestamp:
Jan 27, 2023, 7:28:00 PM (22 months ago)
Author:
alloc
Message:
  • Major refactoring
  • Using Utf8Json for (de)serialization
  • Moving APIs to REST
  • Removing dependencies from WebServer and MapRenderer to ServerFixes
File:
1 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements2/MarkersMod/src/Markers.cs

    r391 r402  
    11using System.Collections.Generic;
    22using System.Net;
    3 using AllocsFixes.JSON;
     3using JetBrains.Annotations;
     4using Utf8Json;
    45using Webserver;
    56using Webserver.WebAPI;
    67
    78namespace Examples {
     9        [UsedImplicitly]
    810        public class Markers : AbsRestApi {
    911                private const int numRandomMarkers = 5;
     
    1113                private readonly Dictionary<string, (int, int)> markers = new Dictionary<string, (int, int)> ();
    1214
    13                 private static readonly JsonArray emptyResult = new JsonArray ();
    14                
    1515                public Markers () {
    1616                        GameRandom random = GameRandomManager.Instance.CreateGameRandom ();
     
    2424                }
    2525
     26                private static readonly byte[] jsonKeyId = JsonWriter.GetEncodedPropertyNameWithBeginObject ("id");
     27                private static readonly byte[] jsonKeyLat = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("lat");
     28                private static readonly byte[] jsonKeyLng = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator ("lng");
     29
    2630                protected override void HandleRestGet (RequestContext _context) {
    2731                        string id = _context.RequestPath;
    2832                       
     33                        PrepareEnvelopedResult (out JsonWriter writer);
     34                       
    2935                        if (string.IsNullOrEmpty (id)) {
    30                                 JsonArray result = new JsonArray ();
     36                                writer.WriteBeginArray ();
    3137
     38                                bool first = true;
    3239                                foreach ((string markerId, (int, int) coordinates) in markers) {
    33                                         JsonObject marker = new JsonObject ();
    34                                         marker.Add ("id", new JsonString (markerId));
    35                                         marker.Add ("lat", new JsonNumber (coordinates.Item1));
    36                                         marker.Add ("lng", new JsonNumber (coordinates.Item2));
    37                                         result.Add (marker);
     40                                        if (!first) {
     41                                                writer.WriteValueSeparator ();
     42                                        }
     43                                       
     44                                        first = false;
     45                                       
     46                                        writeMarkerJson (ref writer, markerId, coordinates);
    3847                                }
    39                                
    40                                 SendEnvelopedResult (_context, result);
     48
     49                                writer.WriteEndArray ();
     50                                SendEnvelopedResult (_context, ref writer);
    4151                                return;
    4252                        }
    4353
    4454                        if (!markers.TryGetValue (id, out (int, int) location)) {
    45                                 SendEnvelopedResult (_context, emptyResult, HttpStatusCode.NotFound);
     55                                writer.WriteRaw (JsonEmptyData);
     56                                SendEnvelopedResult (_context, ref writer, HttpStatusCode.NotFound);
    4657                                return;
    4758                        }
    4859
    4960                        {
    50                                 JsonArray result = new JsonArray ();
    51                                 JsonObject marker = new JsonObject ();
    52                                 marker.Add ("id", new JsonString (id));
    53                                 marker.Add ("lat", new JsonNumber (location.Item1));
    54                                 marker.Add ("lng", new JsonNumber (location.Item2));
    55                                 result.Add (marker);
    56                                 SendEnvelopedResult (_context, result);
     61                                writer.WriteBeginArray ();
     62                               
     63                                writeMarkerJson (ref writer, id, location);
     64                               
     65                                writer.WriteEndArray ();
     66                                SendEnvelopedResult (_context, ref writer);
    5767                        }
    5868                }
    5969
    60                 protected override void HandleRestPost (RequestContext _context, JsonNode _jsonBody) {
    61                         if (!(_jsonBody is JsonObject bodyObject)) {
    62                                 SendEnvelopedResult (_context, null, HttpStatusCode.BadRequest, _jsonBody, "BODY_NOT_OBJECT");
     70                private void writeMarkerJson (ref JsonWriter _writer, string _markerId, (int, int) _coordinates) {
     71                        _writer.WriteRaw (jsonKeyId);
     72                        _writer.WriteString (_markerId);
     73                        _writer.WriteRaw (jsonKeyLat);
     74                        _writer.WriteInt32 (_coordinates.Item1);
     75                        _writer.WriteRaw (jsonKeyLng);
     76                        _writer.WriteInt32 (_coordinates.Item2);
     77                        _writer.WriteEndObject ();
     78                }
     79
     80                protected override void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
     81                        if (!TryGetJsonField (_jsonInput, "lat", out int lat)) {
     82                                SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_OR_INVALID_LAT");
    6383                                return;
    6484                        }
    6585
    66                         if (!TryGetJsonField (bodyObject, "lat", out int lat)) {
    67                                 SendEnvelopedResult (_context, null, HttpStatusCode.BadRequest, _jsonBody, "NO_OR_INVALID_LAT");
    68                                 return;
    69                         }
    70 
    71                         if (!TryGetJsonField (bodyObject, "lng", out int lng)) {
    72                                 SendEnvelopedResult (_context, null, HttpStatusCode.BadRequest, _jsonBody, "NO_OR_INVALID_LNG");
     86                        if (!TryGetJsonField (_jsonInput, "lng", out int lng)) {
     87                                SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_OR_INVALID_LNG");
    7388                                return;
    7489                        }
     
    7792                        markers.Add (newId, (lat, lng));
    7893
    79                         JsonString result = new JsonString (newId);
    80                         SendEnvelopedResult (_context, result, HttpStatusCode.Created);
     94                        PrepareEnvelopedResult (out JsonWriter writer);
     95                        writer.WriteString (newId);
     96                        SendEnvelopedResult (_context, ref writer, HttpStatusCode.Created);
    8197                }
    8298
    83                 protected override void HandleRestPut (RequestContext _context, JsonNode _jsonBody) {
    84                         if (!(_jsonBody is JsonObject bodyObject)) {
    85                                 SendEnvelopedResult (_context, null, HttpStatusCode.BadRequest, _jsonBody, "BODY_NOT_OBJECT");
     99                protected override void HandleRestPut (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
     100                        if (!TryGetJsonField (_jsonInput, "lat", out int lat)) {
     101                                SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_OR_INVALID_LAT");
    86102                                return;
    87103                        }
    88104
    89                         if (!TryGetJsonField (bodyObject, "lat", out int lat)) {
    90                                 SendEnvelopedResult (_context, null, HttpStatusCode.BadRequest, _jsonBody, "NO_OR_INVALID_LAT");
    91                                 return;
    92                         }
    93 
    94                         if (!TryGetJsonField (bodyObject, "lng", out int lng)) {
    95                                 SendEnvelopedResult (_context, null, HttpStatusCode.BadRequest, _jsonBody, "NO_OR_INVALID_LNG");
     105                        if (!TryGetJsonField (_jsonInput, "lng", out int lng)) {
     106                                SendErrorResult (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_OR_INVALID_LNG");
    96107                                return;
    97108                        }
     
    100111
    101112                        if (!markers.TryGetValue (id, out _)) {
    102                                 SendEnvelopedResult (_context, null, HttpStatusCode.NotFound, _jsonBody, "ID_NOT_FOUND");
     113                                SendErrorResult (_context, HttpStatusCode.NotFound, _jsonInputData, "ID_NOT_FOUND");
    103114                                return;
    104115                        }
     
    106117                        markers [id] = (lat, lng);
    107118
    108                         JsonObject result = new JsonObject ();
    109                         result.Add ("id", new JsonString (id));
    110                         result.Add ("lat", new JsonNumber (lat));
    111                         result.Add ("lng", new JsonNumber (lng));
    112                         SendEnvelopedResult (_context, result);
     119                        PrepareEnvelopedResult (out JsonWriter writer);
     120                        writer.WriteRaw (jsonKeyId);
     121                        writer.WriteString (id);
     122                        writer.WriteRaw (jsonKeyLat);
     123                        writer.WriteInt32 (lat);
     124                        writer.WriteRaw (jsonKeyLng);
     125                        writer.WriteInt32 (lng);
     126                        writer.WriteEndObject ();
     127                        SendEnvelopedResult (_context, ref writer);
    113128                }
    114129
     
    116131                        string id = _context.RequestPath;
    117132
    118                         SendEnvelopedResult (_context, null, markers.Remove (id) ? HttpStatusCode.NoContent : HttpStatusCode.NotFound);
     133                        PrepareEnvelopedResult (out JsonWriter writer);
     134                        writer.WriteRaw (JsonEmptyData);
     135                        SendEnvelopedResult (_context, ref writer, markers.Remove (id) ? HttpStatusCode.NoContent : HttpStatusCode.NotFound);
    119136                }
    120137        }
Note: See TracChangeset for help on using the changeset viewer.