From 624dfba5ceef12ebacce1aa6532eceba47f10619 Mon Sep 17 00:00:00 2001 From: gagichce Date: Tue, 26 May 2015 16:05:49 -0400 Subject: [PATCH 01/20] added controller for testing + fixed model constructor --- .../Controllers/ReturnObjects/Test.cs | 32 +++++++++++++++++++ .../Controllers/SystemController.cs | 29 +++++++++++++++++ .../Models/SpeechLogEvent.cs | 3 +- .../hitchbot-secure-api.csproj | 2 ++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs new file mode 100644 index 00000000..61329b0d --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using hitchbot_secure_api.Controllers.ReturnObjects; +using Newtonsoft.Json; + +namespace hitchbot_secure_api.Controllers +{ + public partial class SystemController + { + public class ReturnTest : GenericHitchBot + { + public string Dec { get; set; } + + public int? _Dec + { + + get + { + if (string.IsNullOrWhiteSpace(Dec)) + return null; + int temp; + if (int.TryParse(Dec, out temp)) + return temp; + return null; + } + } + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs new file mode 100644 index 00000000..fe4b5f36 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.Http; + +namespace hitchbot_secure_api.Controllers +{ + public partial class SystemController : ApiController + { + public async Task TestModel([FromBody] ReturnTest Context) + { + if (!ModelState.IsValid) + return BadRequest("Model state is not valid"); + + + return Ok(); + } + + public async Task TestDatabase() + { + using (var db = new Dal.DatabaseContext()) + { + return Ok(db.Database.Exists()); + } + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs index c0e9a2e6..e7e1e6fa 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using hitchbot_secure_api.Controllers; +using hitchbot_secure_api.Controllers.ReturnObjects; namespace hitchbot_secure_api.Models { @@ -35,7 +36,7 @@ public SpeechLogEvent() TimeAdded = DateTime.UtcNow; } - public SpeechLogEvent(SpeechController.ReturnSpeech context) + public SpeechLogEvent(GenericHitchBot context) : this() { TimeOccured = context.DateTime; diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index 066b0c6a..ab5f06c5 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -224,7 +224,9 @@ + + From c2c8c6f8df603c3d665d2c9c4e3c9a5f0d1af206 Mon Sep 17 00:00:00 2001 From: gagichce Date: Tue, 26 May 2015 16:05:49 -0400 Subject: [PATCH 02/20] added controller for testing + fixed model constructor --- .../Controllers/ReturnObjects/Test.cs | 32 +++++++++++++++++++ .../Controllers/SystemController.cs | 29 +++++++++++++++++ .../Models/SpeechLogEvent.cs | 3 +- .../hitchbot-secure-api.csproj | 2 ++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs new file mode 100644 index 00000000..61329b0d --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Test.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using hitchbot_secure_api.Controllers.ReturnObjects; +using Newtonsoft.Json; + +namespace hitchbot_secure_api.Controllers +{ + public partial class SystemController + { + public class ReturnTest : GenericHitchBot + { + public string Dec { get; set; } + + public int? _Dec + { + + get + { + if (string.IsNullOrWhiteSpace(Dec)) + return null; + int temp; + if (int.TryParse(Dec, out temp)) + return temp; + return null; + } + } + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs new file mode 100644 index 00000000..fe4b5f36 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.Http; + +namespace hitchbot_secure_api.Controllers +{ + public partial class SystemController : ApiController + { + public async Task TestModel([FromBody] ReturnTest Context) + { + if (!ModelState.IsValid) + return BadRequest("Model state is not valid"); + + + return Ok(); + } + + public async Task TestDatabase() + { + using (var db = new Dal.DatabaseContext()) + { + return Ok(db.Database.Exists()); + } + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs index c0e9a2e6..e7e1e6fa 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using hitchbot_secure_api.Controllers; +using hitchbot_secure_api.Controllers.ReturnObjects; namespace hitchbot_secure_api.Models { @@ -35,7 +36,7 @@ public SpeechLogEvent() TimeAdded = DateTime.UtcNow; } - public SpeechLogEvent(SpeechController.ReturnSpeech context) + public SpeechLogEvent(GenericHitchBot context) : this() { TimeOccured = context.DateTime; diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index 066b0c6a..ab5f06c5 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -224,7 +224,9 @@ + + From c711dafffbe21555235a1338eba5b18bb5cc783a Mon Sep 17 00:00:00 2001 From: gagichce Date: Wed, 27 May 2015 13:13:30 -0400 Subject: [PATCH 03/20] updated date time method - now fixed so unix datetime is parsed correctly. --- .../Controllers/ReturnObjects/GenericHitchBot.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs index 56287c03..c62fe30b 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs @@ -21,7 +21,7 @@ public DateTime DateTime { if (TimeUnix.HasValue) { - return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds((double)TimeUnix); + return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(((double)TimeUnix)/1000); } if (!string.IsNullOrWhiteSpace(Time)) From 88bbfc5959ae42948766b6eb2f8e2fbba02aead8 Mon Sep 17 00:00:00 2001 From: gagichce Date: Wed, 27 May 2015 13:32:31 -0400 Subject: [PATCH 04/20] updated model for a double recognition score --- .../Controllers/ReturnObjects/Speech.cs | 4 ++-- .../hitchbot-secure-api/Controllers/SystemController.cs | 1 - .../Migrations/201505232238521_InitialCreate.cs | 8 ++++---- .../Migrations/201505232238521_InitialCreate.resx | 2 +- .../hitchbot-secure-api/Models/SpeechLogEvent.cs | 4 ++-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Speech.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Speech.cs index 2376fe17..32401a90 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Speech.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Speech.cs @@ -20,8 +20,8 @@ public class ReturnSpeech : GenericHitchBot public int? MatchAccuracy { get; set; } public int? EnvironmentType { get; set; } - public int? RecognitionScore { get; set; } - public int? GoogleRecognitionScore { get; set; } + public double? RecognitionScore { get; set; } + public double? GoogleRecognitionScore { get; set; } public int? ResponseScore { get; set; } public int? RecognizerTypeEnum { get; set; } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs index fe4b5f36..107d2412 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs @@ -14,7 +14,6 @@ public async Task TestModel([FromBody] ReturnTest Context) if (!ModelState.IsValid) return BadRequest("Model state is not valid"); - return Ok(); } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs index 20885211..b5bc5d2f 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs @@ -16,10 +16,10 @@ public override void Up() Exception = c.String(), Arguments = c.String(), Method = c.String(), - TimeOccured = c.DateTime(nullable: false), - TimeAdded = c.DateTime(nullable: false), Data = c.String(), Action = c.String(), + TimeOccured = c.DateTime(nullable: false), + TimeAdded = c.DateTime(nullable: false), HitchBotId = c.Int(nullable: false), }) .PrimaryKey(t => t.Id) @@ -90,8 +90,8 @@ public override void Up() Speech_MatchedLineLabel = c.String(), MatchAccuracy = c.Int(), EnvironmentType = c.Int(), - RecognitionScore = c.Int(), - GoogleRecognitionScore = c.Int(), + RecognitionScore = c.Double(), + GoogleRecognitionScore = c.Double(), ResponseScore = c.Int(), RecognizerType = c.Int(), RmsDecibalLevel = c.Double(), diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx index 13f93aa5..3f6e3917 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs index e7e1e6fa..2f0a324e 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/SpeechLogEvent.cs @@ -20,8 +20,8 @@ public class SpeechLogEvent public int? MatchAccuracy { get; set; } public int? EnvironmentType { get; set; } - public int? RecognitionScore { get; set; } - public int? GoogleRecognitionScore { get; set; } + public double? RecognitionScore { get; set; } + public double? GoogleRecognitionScore { get; set; } public int? ResponseScore { get; set; } public RecognizerType? RecognizerType { get; set; } From 1ab8df0fa19f4b8c4eb32c44192324f7bc344f3f Mon Sep 17 00:00:00 2001 From: gagichce Date: Thu, 28 May 2015 00:18:41 -0400 Subject: [PATCH 05/20] cleverscript variables are now loaded from the database correctly.. will need to revisit controller to update to model val --- .../Controllers/HitchBotController.cs | 36 +++++++++++-- .../Dal/DatabaseContext.cs | 2 + .../201505232238521_InitialCreate.cs | 53 +++++++++++++++---- .../201505232238521_InitialCreate.resx | 2 +- .../Models/ContextPacket.cs | 26 ++++++++- 5 files changed, 100 insertions(+), 19 deletions(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index ad9a68b5..e1bb8e3e 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -21,15 +21,15 @@ public string Test(string repeat) } [HttpGet] - public async Task GetCleverscriptContext() + public async Task GetCleverscriptContext(int? HitchBotId) { - using (var db = new DatabaseContext()) + if (!HitchBotId.HasValue) { - var result = new ContextPacket + var result = new { - data = new List + data = new List { - new KeyValuePair + new VariableValuePair { key = "current_city_name", value = "Hamilton" @@ -39,6 +39,32 @@ public async Task GetCleverscriptContext() return Ok(result); } + + using (var db = new DatabaseContext()) + { + + var packets = + db.ContextPackets.Where(l => l.HitchBotId == HitchBotId) + .OrderByDescending(l => l.TimeCreated) + .FirstOrDefault(); + + if (packets == null) + { + BadRequest(string.Format("No cleverscript variables found for hitchBOT with ID: {0}.", HitchBotId)); + } + + var variables = db.VariableValuePairs.Where(l => l.ContextPacketId == packets.Id); + + if (!variables.Any()) + BadRequest(string.Format("No cleverscript variables found for hitchBOT with ID: {0}.", HitchBotId)); + + var result = new + { + data = variables.ToList() + }; + + return Ok(result); + } } } } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs index fe9960cd..4750f11c 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs @@ -23,6 +23,8 @@ public DatabaseContext() public DbSet SpeechLogEvents { get; set; } public DbSet TabletStatuses { get; set; } public DbSet ExceptionLogs { get; set; } + public DbSet ContextPackets { get; set; } + public DbSet VariableValuePairs { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs index b5bc5d2f..3d7e0c95 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs @@ -8,19 +8,12 @@ public partial class InitialCreate : DbMigration public override void Up() { CreateTable( - "dbo.ExceptionLogs", + "dbo.ContextPackets", c => new { Id = c.Int(nullable: false, identity: true), - Message = c.String(), - Exception = c.String(), - Arguments = c.String(), - Method = c.String(), - Data = c.String(), - Action = c.String(), - TimeOccured = c.DateTime(nullable: false), - TimeAdded = c.DateTime(nullable: false), HitchBotId = c.Int(nullable: false), + TimeCreated = c.DateTime(nullable: false), }) .PrimaryKey(t => t.Id) .ForeignKey("dbo.HitchBots", t => t.HitchBotId, cascadeDelete: true) @@ -102,6 +95,38 @@ public override void Up() .ForeignKey("dbo.HitchBots", t => t.HitchBotId, cascadeDelete: true) .Index(t => t.HitchBotId); + CreateTable( + "dbo.VariableValuePairs", + c => new + { + Id = c.Int(nullable: false, identity: true), + key = c.String(), + value = c.String(), + ContextPacketId = c.Int(nullable: false), + }) + .PrimaryKey(t => t.Id) + .ForeignKey("dbo.ContextPackets", t => t.ContextPacketId, cascadeDelete: true) + .Index(t => t.ContextPacketId); + + CreateTable( + "dbo.ExceptionLogs", + c => new + { + Id = c.Int(nullable: false, identity: true), + Message = c.String(), + Exception = c.String(), + Arguments = c.String(), + Method = c.String(), + Data = c.String(), + Action = c.String(), + TimeOccured = c.DateTime(nullable: false), + TimeAdded = c.DateTime(nullable: false), + HitchBotId = c.Int(nullable: false), + }) + .PrimaryKey(t => t.Id) + .ForeignKey("dbo.HitchBots", t => t.HitchBotId, cascadeDelete: true) + .Index(t => t.HitchBotId); + CreateTable( "dbo.TabletStatus", c => new @@ -125,24 +150,30 @@ public override void Down() { DropForeignKey("dbo.TabletStatus", "HitchBotId", "dbo.HitchBots"); DropForeignKey("dbo.ExceptionLogs", "HitchBotId", "dbo.HitchBots"); + DropForeignKey("dbo.VariableValuePairs", "ContextPacketId", "dbo.ContextPackets"); + DropForeignKey("dbo.ContextPackets", "HitchBotId", "dbo.HitchBots"); DropForeignKey("dbo.SpeechLogEvents", "HitchBotId", "dbo.HitchBots"); DropForeignKey("dbo.HitchBots", "JourneyId", "dbo.Journeys"); DropForeignKey("dbo.Journeys", "StartLocation_Id", "dbo.Locations"); DropForeignKey("dbo.Journeys", "EndLocation_Id", "dbo.Locations"); DropForeignKey("dbo.Locations", "HitchBotId", "dbo.HitchBots"); DropIndex("dbo.TabletStatus", new[] { "HitchBotId" }); + DropIndex("dbo.ExceptionLogs", new[] { "HitchBotId" }); + DropIndex("dbo.VariableValuePairs", new[] { "ContextPacketId" }); DropIndex("dbo.SpeechLogEvents", new[] { "HitchBotId" }); DropIndex("dbo.Locations", new[] { "HitchBotId" }); DropIndex("dbo.Journeys", new[] { "StartLocation_Id" }); DropIndex("dbo.Journeys", new[] { "EndLocation_Id" }); DropIndex("dbo.HitchBots", new[] { "JourneyId" }); - DropIndex("dbo.ExceptionLogs", new[] { "HitchBotId" }); + DropIndex("dbo.ContextPackets", new[] { "HitchBotId" }); DropTable("dbo.TabletStatus"); + DropTable("dbo.ExceptionLogs"); + DropTable("dbo.VariableValuePairs"); DropTable("dbo.SpeechLogEvents"); DropTable("dbo.Locations"); DropTable("dbo.Journeys"); DropTable("dbo.HitchBots"); - DropTable("dbo.ExceptionLogs"); + DropTable("dbo.ContextPackets"); } } } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx index 3f6e3917..7aaf3c9e 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/ContextPacket.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/ContextPacket.cs index a2fccd91..f67d823e 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/ContextPacket.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/ContextPacket.cs @@ -1,19 +1,41 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.Http.Formatting; +using System.Security.Policy; using System.Text; using System.Threading.Tasks; +using Newtonsoft.Json; namespace hitchbot_secure_api.Models { public class ContextPacket { - public List data; + public int Id { get; set; } + + public int HitchBotId { get; set; } + public virtual HitchBot HitchBot { get; set; } + + public virtual ICollection Variables { get; set; } + + public DateTime TimeCreated { get; set; } + + public ContextPacket() + { + TimeCreated = DateTime.UtcNow; + } } - public class KeyValuePair + public class VariableValuePair { + [JsonIgnore] + public int Id { get; set; } public string key { get; set; } public string value { get; set; } + + [JsonIgnore] + public int ContextPacketId { get; set; } + [JsonIgnore] + public ContextPacket ContextPacket { get; set; } } } From 7fac4885628ba1b57366231b5b645772a2217d01 Mon Sep 17 00:00:00 2001 From: gagichce Date: Thu, 28 May 2015 00:29:56 -0400 Subject: [PATCH 06/20] added controller method for creating new variable value pairs --- .../Controllers/HitchBotController.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index e1bb8e3e..65becd21 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data.Entity; using System.Linq; using System.Net; using System.Net.Http; @@ -66,5 +67,35 @@ public async Task GetCleverscriptContext(int? HitchBotId) return Ok(result); } } + + [HttpPost] + public async Task AddPairToHb(int HitchBotId, string key, string value) + { + if (string.IsNullOrWhiteSpace(key) || string.IsNullOrWhiteSpace(value)) + return BadRequest("One or more of the parameters was null or whitespace."); + + using (var db = new DatabaseContext()) + { + var packets = + await db.ContextPackets.Where(l => l.HitchBotId == HitchBotId) + .OrderByDescending(l => l.TimeCreated) + .FirstOrDefaultAsync(); + + if (packets == null) + { + BadRequest(string.Format("No cleverscript variables found for hitchBOT with ID: {0}.", HitchBotId)); + } + + db.VariableValuePairs.Add(new VariableValuePair() + { + key = key, + value = value, + ContextPacketId = packets.Id + }); + + await db.SaveChangesAsync(); + } + return Ok(); + } } } From e992254961ab005c8521006297cfbd89b36a6603 Mon Sep 17 00:00:00 2001 From: gagichce Date: Sat, 30 May 2015 15:18:13 -0400 Subject: [PATCH 07/20] added image controller and uploading --- .../Controllers/ImageController.cs | 53 ++++++++ .../Dal/DatabaseContext.cs | 1 + .../Helpers/AzureBlobHelper.cs | 128 ++++++++++++++++++ .../hitchbot-secure-api/Helpers/PathHelper.cs | 17 +++ .../201505232238521_InitialCreate.cs | 50 +++++-- .../201505232238521_InitialCreate.resx | 2 +- .../hitchbot-secure-api/Models/HitchBot.cs | 2 + .../hitchbot-secure-api/Models/Image.cs | 23 ++++ .../hitchbot-secure-api/Models/Location.cs | 2 + .../hitchbot-secure-api.csproj | 28 ++++ .../hitchbot-secure-api/packages.config | 6 + 11 files changed, 298 insertions(+), 14 deletions(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ImageController.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/PathHelper.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Models/Image.cs diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ImageController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ImageController.cs new file mode 100644 index 00000000..68b8d72a --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ImageController.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using System.Web.Http; +using System.Globalization; +using System.Diagnostics; +using System.Net; + +namespace hitchbot_secure_api.Controllers +{ + public class ImageController : ApiController + { + /// + /// Accepts an Image from the tablet. + /// + /// Success + public Task PostImage(int HitchBotID = 10, string timeTaken = "20150121000000") + { + DateTime TimeTaken = DateTime.ParseExact(timeTaken, "yyyyMMddHHmmss", CultureInfo.InvariantCulture); + + HttpRequestMessage request = this.Request; + if (!request.Content.IsMimeMultipartContent()) + { + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } + + string root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/uploads/img"); + var provider = new MultipartFormDataStreamProvider(root); + + var task = request.Content.ReadAsMultipartAsync(provider). + ContinueWith(o => + { + + string file1 = provider.FileData.First().LocalFileName; + // this is the file name on the server where the file was saved this should be passed on to upload it to azure + Debug.WriteLine(file1); + Helpers.AzureBlobHelper.UploadImageAndAddToDb(HitchBotID, TimeTaken, "", file1); + + return new HttpResponseMessage() + { + Content = new StringContent("File uploaded."), + StatusCode = HttpStatusCode.OK + }; + } + ); + + return task; + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs index 4750f11c..31a5006b 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Dal/DatabaseContext.cs @@ -25,6 +25,7 @@ public DatabaseContext() public DbSet ExceptionLogs { get; set; } public DbSet ContextPackets { get; set; } public DbSet VariableValuePairs { get; set; } + public DbSet Images { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs new file mode 100644 index 00000000..be6b6cec --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.WindowsAzure.Storage; +using Microsoft.WindowsAzure.Storage.Auth; +using Microsoft.WindowsAzure.Storage.Blob; +using System.Configuration; +using hitchbot_secure_api.Dal; + +namespace hitchbot_secure_api.Helpers +{ + public static class AzureBlobHelper + { + public const string JS_LOCATION_FILE_NAME = "testLocations"; + public const string JS_FILE_EXTENSION = ".js"; + private const string JS_CONTAINER_NAME = "hbjs"; + private static Random randy = new Random(); + + public static string UploadLocationJsAndGetPublicUrl(string localRootFileDirectory, string fileName, int ID, string lang) + { + CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]); + + CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); + + CloudBlobContainer imgContainer = blobClient.GetContainerReference(JS_CONTAINER_NAME); + + CloudBlockBlob newBlob = imgContainer.GetBlockBlobReference(JS_LOCATION_FILE_NAME + lang + ID + JS_FILE_EXTENSION); + + newBlob.DeleteIfExists(); + + using (var fileString = System.IO.File.OpenRead(localRootFileDirectory + fileName)) + { + newBlob.UploadFromStream(fileString); + newBlob.Properties.ContentType = "text/javascript"; + + //we don't want the browser to cache this file because it contains data which is very likely to change frequently. + newBlob.Properties.CacheControl = "public, max-age=0"; + newBlob.SetProperties(); + } + + return newBlob.Uri.ToString(); + } + + private static TimeSpan JS_REBUILD_INTERVAL = new TimeSpan(1, 0, 0); + + /// + /// Determines if the javascript file containing the map data should be rebuilt based on the time passed since it was last built. + /// + /// the filename of the javascript file that may need to be rebuilt. + /// The ID if the javascript file (also the hitcbotID) to determine if it needs to be rebuilt + /// + public static bool ShouldJsBeRebuilt(string fileName, int ID) + { + CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]); + + CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); + + CloudBlobContainer imgContainer = blobClient.GetContainerReference(JS_CONTAINER_NAME); + + CloudBlockBlob blob = imgContainer.GetBlockBlobReference(JS_LOCATION_FILE_NAME + ID + JS_FILE_EXTENSION); + + if (blob.Exists()) + { + DateTimeOffset LastModified = blob.Properties.LastModified ?? new DateTime(); + + return DateTimeOffset.UtcNow - LastModified > JS_REBUILD_INTERVAL; + } + return true; + } + + public static void UploadJStoAzure(int hitchbotID, string language) + { + string TargetLocation = Helpers.PathHelper.GetJsBuildPath(); + //this is a mess! + Helpers.AzureBlobHelper.UploadLocationJsAndGetPublicUrl(TargetLocation, Helpers.AzureBlobHelper.JS_LOCATION_FILE_NAME + language + hitchbotID + Helpers.AzureBlobHelper.JS_FILE_EXTENSION, hitchbotID, language); + } + + public static async Task UploadImageAndGetPublicUrl(string localRootFileDirectory, string fileName) + { + CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]); + + CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); + + CloudBlobContainer imgContainer = blobClient.GetContainerReference("imgfromhb"); + + CloudBlockBlob newBlob = imgContainer.GetBlockBlobReference(randy.Next() + "-" + DateTime.UtcNow.Ticks + ".jpg"); + + using (var fileString = System.IO.File.OpenRead(localRootFileDirectory + fileName)) + { + newBlob.UploadFromStream(fileString); + newBlob.Properties.ContentType = "image/webp"; + newBlob.SetProperties(); + } + + return newBlob.Uri.ToString(); + } + + public static async void UploadImageAndAddToDb(int hbID, DateTime TimeTaken, string localFileDirectory, string fileName) + { + Task publicURL = UploadImageAndGetPublicUrl(localFileDirectory, fileName); + + using (var db = new DatabaseContext()) + { + var location = db.Locations.Where(l => l.HitchBotId == hbID) + .OrderByDescending(l => l.TakenTime).FirstOrDefault(); + + int? locationId = null; + + if (location != null) + locationId = location.Id; + + var image = new Models.Image() + { + HitchBotId = hbID, + LocationId = locationId, + Url = await publicURL, + TimeAdded = DateTime.UtcNow, + TimeTaken = TimeTaken + }; + + db.Images.Add(image); + db.SaveChanges(); + } + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/PathHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/PathHelper.cs new file mode 100644 index 00000000..a5a1e04f --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/PathHelper.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace hitchbot_secure_api.Helpers +{ + public static class PathHelper + { + public static string GetJsBuildPath() + { + //one hell of a namespace here. + return System.Web.HttpContext.Current.Server.MapPath("~/JSbuild/"); + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs index 3d7e0c95..01923839 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs @@ -32,22 +32,23 @@ public override void Up() .Index(t => t.JourneyId); CreateTable( - "dbo.Journeys", + "dbo.Images", c => new { Id = c.Int(nullable: false, identity: true), - Name = c.String(), - StartTime = c.DateTime(nullable: false), - EndTime = c.DateTime(), - TimeCreated = c.DateTime(nullable: false), - EndLocation_Id = c.Int(), - StartLocation_Id = c.Int(), + Url = c.String(), + HitchBotId = c.Int(nullable: false), + LocationId = c.Int(), + TimeTaken = c.DateTime(nullable: false), + TimeApproved = c.DateTime(), + TimeDenied = c.DateTime(), + TimeAdded = c.DateTime(nullable: false), }) .PrimaryKey(t => t.Id) - .ForeignKey("dbo.Locations", t => t.EndLocation_Id) - .ForeignKey("dbo.Locations", t => t.StartLocation_Id) - .Index(t => t.EndLocation_Id) - .Index(t => t.StartLocation_Id); + .ForeignKey("dbo.HitchBots", t => t.HitchBotId, cascadeDelete: true) + .ForeignKey("dbo.Locations", t => t.LocationId) + .Index(t => t.HitchBotId) + .Index(t => t.LocationId); CreateTable( "dbo.Locations", @@ -70,6 +71,24 @@ public override void Up() .ForeignKey("dbo.HitchBots", t => t.HitchBotId) .Index(t => t.HitchBotId); + CreateTable( + "dbo.Journeys", + c => new + { + Id = c.Int(nullable: false, identity: true), + Name = c.String(), + StartTime = c.DateTime(nullable: false), + EndTime = c.DateTime(), + TimeCreated = c.DateTime(nullable: false), + EndLocation_Id = c.Int(), + StartLocation_Id = c.Int(), + }) + .PrimaryKey(t => t.Id) + .ForeignKey("dbo.Locations", t => t.EndLocation_Id) + .ForeignKey("dbo.Locations", t => t.StartLocation_Id) + .Index(t => t.EndLocation_Id) + .Index(t => t.StartLocation_Id); + CreateTable( "dbo.SpeechLogEvents", c => new @@ -156,22 +175,27 @@ public override void Down() DropForeignKey("dbo.HitchBots", "JourneyId", "dbo.Journeys"); DropForeignKey("dbo.Journeys", "StartLocation_Id", "dbo.Locations"); DropForeignKey("dbo.Journeys", "EndLocation_Id", "dbo.Locations"); + DropForeignKey("dbo.Images", "LocationId", "dbo.Locations"); DropForeignKey("dbo.Locations", "HitchBotId", "dbo.HitchBots"); + DropForeignKey("dbo.Images", "HitchBotId", "dbo.HitchBots"); DropIndex("dbo.TabletStatus", new[] { "HitchBotId" }); DropIndex("dbo.ExceptionLogs", new[] { "HitchBotId" }); DropIndex("dbo.VariableValuePairs", new[] { "ContextPacketId" }); DropIndex("dbo.SpeechLogEvents", new[] { "HitchBotId" }); - DropIndex("dbo.Locations", new[] { "HitchBotId" }); DropIndex("dbo.Journeys", new[] { "StartLocation_Id" }); DropIndex("dbo.Journeys", new[] { "EndLocation_Id" }); + DropIndex("dbo.Locations", new[] { "HitchBotId" }); + DropIndex("dbo.Images", new[] { "LocationId" }); + DropIndex("dbo.Images", new[] { "HitchBotId" }); DropIndex("dbo.HitchBots", new[] { "JourneyId" }); DropIndex("dbo.ContextPackets", new[] { "HitchBotId" }); DropTable("dbo.TabletStatus"); DropTable("dbo.ExceptionLogs"); DropTable("dbo.VariableValuePairs"); DropTable("dbo.SpeechLogEvents"); - DropTable("dbo.Locations"); DropTable("dbo.Journeys"); + DropTable("dbo.Locations"); + DropTable("dbo.Images"); DropTable("dbo.HitchBots"); DropTable("dbo.ContextPackets"); } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx index 7aaf3c9e..490ca9bc 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/HitchBot.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/HitchBot.cs index 6d5b896a..f000da4a 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/HitchBot.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/HitchBot.cs @@ -17,6 +17,8 @@ public class HitchBot public virtual ICollection Locations { get; set; } public virtual ICollection SpeechLogEvents { get; set; } + + public virtual ICollection Images { get; set; } public int JourneyId { get; set; } [Required] public virtual Journey Journey { get; set; } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/Image.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Image.cs new file mode 100644 index 00000000..e2395750 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Image.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace hitchbot_secure_api.Models +{ + public class Image + { + public int Id { get; set; } + public string Url { get; set; } + + public int HitchBotId { get; set; } + public virtual HitchBot HitchBot { get; set; } + public int? LocationId { get; set; } + public virtual Location Location { get; set; } + public DateTime TimeTaken { get; set; } + public DateTime? TimeApproved { get; set; } + public DateTime? TimeDenied { get; set; } + public DateTime TimeAdded { get; set; } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs index ee15df5b..2ff9870b 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs @@ -26,6 +26,8 @@ public class Location public int? HitchBotId { get; set; } public virtual HitchBot HitchBot { get; set; } + public virtual ICollection Images { get; set; } + public DateTime? TakenTime { get; set; } public DateTime TimeAdded { get; set; } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index ab5f06c5..081defb9 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -64,6 +64,18 @@ True + + ..\packages\Microsoft.Data.Edm.5.6.2\lib\net40\Microsoft.Data.Edm.dll + True + + + ..\packages\Microsoft.Data.OData.5.6.2\lib\net40\Microsoft.Data.OData.dll + True + + + ..\packages\Microsoft.Data.Services.Client.5.6.2\lib\net40\Microsoft.Data.Services.Client.dll + True + ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll True @@ -100,6 +112,14 @@ ..\packages\Microsoft.Owin.Security.Twitter.3.0.1\lib\net45\Microsoft.Owin.Security.Twitter.dll True + + ..\packages\Microsoft.WindowsAzure.ConfigurationManager.1.8.0.0\lib\net35-full\Microsoft.WindowsAzure.Configuration.dll + True + + + ..\packages\WindowsAzure.Storage.4.3.0\lib\net40\Microsoft.WindowsAzure.Storage.dll + True + ..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll True @@ -111,6 +131,10 @@ ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll True + + ..\packages\System.Spatial.5.6.2\lib\net40\System.Spatial.dll + True + @@ -218,6 +242,7 @@ + @@ -233,6 +258,8 @@ Global.asax + + 201505232238521_InitialCreate.cs @@ -244,6 +271,7 @@ + diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/packages.config b/server/hitchbot-secure-api/hitchbot-secure-api/packages.config index 9abba989..a7d970cc 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/packages.config +++ b/server/hitchbot-secure-api/hitchbot-secure-api/packages.config @@ -18,6 +18,9 @@ + + + @@ -29,9 +32,12 @@ + + + \ No newline at end of file From 0702502dbdd7f123fc5df4928c72a21b0c911ccc Mon Sep 17 00:00:00 2001 From: gagichce Date: Sat, 30 May 2015 15:36:45 -0400 Subject: [PATCH 08/20] added map page --- .../Helpers/AzureBlobHelper.cs | 4 +- .../hitchbot-secure-api/Map/live.aspx | 18 +++++++ .../hitchbot-secure-api/Map/live.aspx.cs | 30 +++++++++++ .../Map/live.aspx.designer.cs | 51 +++++++++++++++++++ .../hitchbot-secure-api.csproj | 8 +++ 5 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.designer.cs diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs index be6b6cec..472cde77 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/AzureBlobHelper.cs @@ -43,7 +43,7 @@ public static string UploadLocationJsAndGetPublicUrl(string localRootFileDirecto return newBlob.Uri.ToString(); } - private static TimeSpan JS_REBUILD_INTERVAL = new TimeSpan(1, 0, 0); + private static TimeSpan JS_REBUILD_INTERVAL = new TimeSpan(0, 5, 0); /// /// Determines if the javascript file containing the map data should be rebuilt based on the time passed since it was last built. @@ -74,7 +74,7 @@ public static void UploadJStoAzure(int hitchbotID, string language) { string TargetLocation = Helpers.PathHelper.GetJsBuildPath(); //this is a mess! - Helpers.AzureBlobHelper.UploadLocationJsAndGetPublicUrl(TargetLocation, Helpers.AzureBlobHelper.JS_LOCATION_FILE_NAME + language + hitchbotID + Helpers.AzureBlobHelper.JS_FILE_EXTENSION, hitchbotID, language); + UploadLocationJsAndGetPublicUrl(TargetLocation, JS_LOCATION_FILE_NAME + language + hitchbotID + JS_FILE_EXTENSION, hitchbotID, language); } public static async Task UploadImageAndGetPublicUrl(string localRootFileDirectory, string fileName) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx b/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx new file mode 100644 index 00000000..b0605d30 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx @@ -0,0 +1,18 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="live.aspx.cs" Inherits="hitchbot_secure_api.Map.live" %> + + + + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.cs new file mode 100644 index 00000000..c296d15b --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace hitchbot_secure_api.Map +{ + public partial class live : Page + { + int projectID; + int hitchbotID; + protected void Page_Load(object sender, EventArgs e) + { + if (int.TryParse(Request.QueryString["hbID"], out projectID)) + { + hitchbotID = int.Parse(Request.QueryString["hbID"]); + + jsDataLocation.Text = @""; + + gmapsString.Text = string.Format(@""); + } + else + { + throw new HttpException(404, "hitchBOT not found!!"); + } + } + } +} \ No newline at end of file diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.designer.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.designer.cs new file mode 100644 index 00000000..c40c6dc8 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Map/live.aspx.designer.cs @@ -0,0 +1,51 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace hitchbot_secure_api.Map { + + + public partial class live { + + /// + /// HtmlMasterTag control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlElement HtmlMasterTag; + + /// + /// gmapsString control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal gmapsString; + + /// + /// jsDataLocation control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal jsDataLocation; + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index 081defb9..71447cca 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -260,6 +260,13 @@ + + live.aspx + ASPXCodeBehind + + + live.aspx + 201505232238521_InitialCreate.cs @@ -318,6 +325,7 @@ + From c85564efad271d980bafa259c22d889a477c2a17 Mon Sep 17 00:00:00 2001 From: gagichce Date: Sat, 30 May 2015 16:49:17 -0400 Subject: [PATCH 09/20] maps are now updating + model updates --- .../Controllers/HitchBotController.cs | 5 + .../Controllers/ReturnObjects/Location.cs | 10 +- .../Controllers/SystemController.cs | 9 + .../Helpers/Location/GoogleMapsBuilder.cs | 180 ++++++++++++++++++ .../Helpers/Location/GoogleMapsHelper.cs | 74 +++++++ .../Helpers/Location/LocationHelper.cs | 78 ++++++++ .../JSbuild/testLocationsen1.js | 6 + .../hitchbot-secure-api/Map/live.aspx.cs | 2 +- .../201505232238521_InitialCreate.cs | 10 +- .../201505232238521_InitialCreate.resx | 2 +- .../Migrations/Configuration.cs | 8 +- .../hitchbot-secure-api/Models/Location.cs | 10 +- .../Scripts/_references.js | Bin 816 -> 930 bytes .../hitchbot-secure-api.csproj | 4 + 14 files changed, 377 insertions(+), 21 deletions(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsHelper.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/JSbuild/testLocationsen1.js diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index 65becd21..32ba8e8a 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -21,6 +21,11 @@ public string Test(string repeat) return repeat; } + public async Task UpdateCleverscriptVariables() + { + return Ok(); + } + [HttpGet] public async Task GetCleverscriptContext(int? HitchBotId) { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs index 366cd160..cbfb430d 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs @@ -14,11 +14,11 @@ public partial class LocationController { public class ReturnLocation : GenericHitchBot { - public decimal Latitude { get; set; } - public decimal Longitude { get; set; } - public decimal? Altitude { get; set; } - public decimal? Accuracy { get; set; } - public decimal? Velocity { get; set; } + public double Latitude { get; set; } + public double Longitude { get; set; } + public double? Altitude { get; set; } + public double? Accuracy { get; set; } + public double? Velocity { get; set; } public int? LocationProviderEnum { get; set; } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs index 107d2412..e98156a9 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs @@ -24,5 +24,14 @@ public async Task TestDatabase() return Ok(db.Database.Exists()); } } + + [HttpGet] + public async Task BuildJs(int hitchBotId) + { + var builer = new Helpers.Location.GoogleMapsBuilder(hitchBotId); + builer.BuildJsAndUpload(); + + return Ok(string.Format("Map was successfully updated.")); + } } } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs new file mode 100644 index 00000000..088f4b2b --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.UI.WebControls; +using System.Data.Entity; + +namespace hitchbot_secure_api.Helpers.Location +{ + /// + /// This class is used to build the JS for the Dynamic Map on the HB website. Why doesn't this class take in the actual items and instead access the db? It could be called from any context. + /// + public class GoogleMapsBuilder + { + //these "map options" should be loaded from the db in the future. + private const string PolyPathColour = "E57373"; + private const double PolyPathOpacity = 1.0; + private const int PolyPathStrokeWeight = 2; + private const int DefaultMapZoomLevel = 4; + + Models.Journey Project; + private int hitchBotId; + + static Models.Location DefaultLocation = new Models.Location { Latitude = 0, Longitude = 0, TakenTime = DateTime.UtcNow }; + Models.Location CenterLocation = DefaultLocation; + //what gets counted here? only the markers which are start/stop or others. NOT info windows. + int NumberOfMarkers = 0; + + string FunctionCalls = string.Empty; + string BuilderEN = string.Empty; + + public GoogleMapsBuilder(int hitchBotId, int projectID = 1, int userID = 4) + { + this.hitchBotId = hitchBotId; + } + + /// + /// This is the function which builds and saves the js code locally. It builds it based on how it was initialized, whether it was linked to a project and other factors. + /// + public void BuildJS() + { + this.BuilderEN = BuildPolyPath(0); + + this.BuilderEN += BuildCurrentLocation(); + + this.BuilderEN += BuildGoogleMapsJsBody(); + + this.BuilderEN += BuildTargets(); + + System.IO.File.WriteAllText(Helpers.PathHelper.GetJsBuildPath() + Helpers.AzureBlobHelper.JS_LOCATION_FILE_NAME + "en" + this.hitchBotId + Helpers.AzureBlobHelper.JS_FILE_EXTENSION, this.BuilderEN); + + } + + public void BuildJsAndUpload() + { + BuildJS(); + + Helpers.AzureBlobHelper.UploadJStoAzure(hitchBotId, "en"); + + } + + private string BuildCurrentLocation() + { + using (var db = new Dal.DatabaseContext()) + { + var current_loc = + db.Locations.Where(l => l.HitchBotId == hitchBotId) + .OrderBy(l => l.TakenTime) + .ToArray() + .LastOrDefault(); + return @" + var currentPoint = new google.maps.LatLng(" + current_loc.Latitude + "," + current_loc.Longitude + + @"); + "; + } + } + + private string BuildTargets() + { + string builder = "var targetCoordinates = []; "; + + + //if (targets != null) + //{ + // if (targets.Count() > 0) + // { + + // builder = "var targetCoordinates = [ "; + + // // number to display on the markers. Increments every time. + // var num = 1; + // foreach (Models.MapMarker l in targets) + // { + + // if (l.TargetLocation != null) + // { + // if (lang == "en") + // { + // // Create marker detail for English + // builder += "{LatLng: new google.maps.LatLng(" + l.TargetLocation.Latitude + ", "; + // builder += l.TargetLocation.Longitude + "), info_text: {info_header: '" + new System.Web.HtmlString(l.HeaderText); + // builder += "', info_body: '" + new System.Web.HtmlString(l.BodyText) + "'}, touched: "; + // builder += l.HasBeenVisited ? "true" : "false"; + // builder += ", number: " + num + "},"; + // } + // else + // { + // // Create marker detail for German + // builder += "{LatLng: new google.maps.LatLng(" + l.TargetLocation.Latitude + ", "; + // builder += l.TargetLocation.Longitude + "), info_text: {info_header: '" + new System.Web.HtmlString(l.HeaderTextGerman); + // builder += "', info_body: '" + new System.Web.HtmlString(l.BodyTextGerman) + "'}, touched: "; + // builder += l.HasBeenVisited ? "true" : "false"; + // builder += ", number: " + num + "},"; + // } + // // Increment marker number + // num = num + 1; + // } + // } + // // Close locations JS array + // builder += "];"; + // } + // else + // { + // // If there's no locations, define it as empty + // builder = "var targetCoordinates = []; "; + // } + //} + return builder; + } + + private string BuildGoogleMapsJsBody() + { + return @"function AddPolyFill0(e){var t=new google.maps.Polyline({path:flightPlanCoordinates,geodesic:true,strokeColor:""#E57373"",strokeOpacity:1,strokeWeight:4});t.setMap(e)}function AddCurrentMarker(e){var t=new google.maps.MarkerImage(""http://hitchbotimg.blob.core.windows.net/img/hitchicon2.png"",new google.maps.Size(64,64),new google.maps.Point(0,0),new google.maps.Point(32,64));var n=new google.maps.Marker({position:currentPoint,map:e,animation:google.maps.Animation.DROP,icon:t});return}function AutoCenter(e){var t=new google.maps.LatLngBounds;t.extend(currentPoint);for(i=0;i""+""
""+""

""+n.info_text.info_header+""

""+""

""+n.info_text.info_body+""

"";var s=new google.maps.Marker({position:n.LatLng,map:e,title:n.info_text.info_header,html:i,icon:r});t.push(s)}for(var o=0;o + /// Builds the function for a path on a google map. It loads the data from the hitchBOT entity and builds it from its locations. + ///
+ /// + private string BuildPolyPath(int PolyPathNumber) + { + //get all the locations from before launch--messy TODO update this for the current launch date + using (var db = new Dal.DatabaseContext()) + { + var locations = db.Locations.Where(l => l.HitchBotId == hitchBotId).OrderBy(l => l.TakenTime).ToList(); + + string builder = string.Empty; + + if (locations != null) + { + if (locations.Count > 0) + { + var slimmedLocations = LocationHelper.SlimLocations(locations); + + builder = "var flightPlanCoordinates = [ "; + + // Slim locations + foreach (Models.Location myLocation in slimmedLocations) + { + // Add each location to a JS array. + builder += "\n new google.maps.LatLng(" + myLocation.Latitude + "," + myLocation.Longitude + + "), "; + } + + builder += @"];"; + } + else + { + builder = @"var flightPlanCoordinates = [];"; + } + } + return builder; + } + } + + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsHelper.cs new file mode 100644 index 00000000..77677ff9 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsHelper.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace hitchbot_secure_api.Helpers.Location +{ + public static class GoogleMapsHelper + { + public static void BuildLocationJS(int HitchBotID) + { + using (var db = new Dal.DatabaseContext()) + { + var locations = db.Locations.Where(l => l.HitchBotId == HitchBotID).OrderBy(l => l.TakenTime).ToList(); + + var slimmedLocations = LocationHelper.SlimLocations(locations); + string builder = "var flightPlanCoordinates = [ "; + + foreach (Models.Location myLocation in slimmedLocations) + { + builder += "\n new google.maps.LatLng(" + myLocation.Latitude + "," + myLocation.Longitude + "),"; + } + + builder += @" ]; + + var flightPath = new google.maps.Polyline({ + path: flightPlanCoordinates, + geodesic: true, + strokeColor: '#E57373', //taken from material design by google + strokeOpacity: 1.0, + strokeWeight: 2 + }); + + function AddPolyFill(map){ + flightPath.setMap(map); + }"; + + System.IO.File.WriteAllText(Helpers.PathHelper.GetJsBuildPath() + Helpers.AzureBlobHelper.JS_LOCATION_FILE_NAME + Helpers.AzureBlobHelper.JS_FILE_EXTENSION, builder); + } + } + + private static string GenInfoWindow(Models.Location myLocation) + { + string returnString = @"function AddInfoWindow(map){ + var myLatLong = new google.maps.LatLng(" + myLocation.Latitude + "," + myLocation.Longitude + @"); + var contentString = '
'+ + '
'+ + '
'+ + '

Manitoulin Island

'+ + '
'+ + '

Canada’s most famous hitchhiking robot spent part of its holiday weekend taking part in a Pow Wow with the Wikwemikong First Nation on Manitoulin Island, picking up an honourary name in the process.'+ + '

Attribution: National Post, '+ + 'See the article here.

'+ + '
'+ + '
'; + + var infowindow = new google.maps.InfoWindow({ + content: contentString + }); + + var marker = new google.maps.Marker({ + position: myLatLong, + map: map, + title: 'hitchBOT on Manitoulin Island' + }); + google.maps.event.addListener(marker, 'click', function() { + infowindow.open(map,marker); + }); return infowindow;}"; + + return returnString; + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs new file mode 100644 index 00000000..faaa9164 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace hitchbot_secure_api.Helpers.Location +{ + public static class LocationHelper + { + public const string hBIcon = "http://goo.gl/uwnJCB"; + + //yes you just found our API key.. wow .. congrats. Too bad it only works on hitchbot.me places. + public const string gAPIkey = "&key=AIzaSyCEJOxq4a_fUiutFzCukico7aUy--6wMCw"; + + public const string gmapsString = "http://maps.googleapis.com/maps/api/staticmap?size=800x800&path=weight:4%7Ccolor:blue%7Cenc:"; + public const string gmapsRegionString = "http://maps.googleapis.com/maps/api/geocode/json?latlng="; + public const string gmapsMarkerString = "&markers=icon:http://goo.gl/uwnJCB|size:mid|color:red|label:H|"; + + private const int maxLocations = 350; + + + + public static List SlimLocations(List inList) + { + int Interval = inList.Count / (LocationHelper.maxLocations - 2); + + if (Interval < 2) + { + Interval = 2; + } + List outList = new List(); + + for (int i = 0; i < inList.Count; i += Interval) + { + outList.Add(inList[i]); + } + + //always add the last value - map always updated then plus other things rely on it! + outList.Add(inList.Last()); + + return outList; + } + + //code taken and modified from http://stackoverflow.com/questions/3852268/c-sharp-implementation-of-googles-encoded-polyline-algorithm + //public static string EncodeCoordsForGMAPS(List points) + //{ + // var str = new StringBuilder(); + + // var encodeDiff = (Action)(diff => + // { + // int shifted = diff << 1; + // if (diff < 0) + // shifted = ~shifted; + // int rem = shifted; + // while (rem >= 0x20) + // { + // str.Append((char)((0x20 | (rem & 0x1f)) + 63)); + // rem >>= 5; + // } + // str.Append((char)(rem + 63)); + // }); + + // int lastLat = 0; + // int lastLng = 0; + // foreach (var point in points) + // { + // int lat = (int)Math.Round(point.Latitude * 1E5); + // int lng = (int)Math.Round(point.Longitude * 1E5); + // encodeDiff(lat - lastLat); + // encodeDiff(lng - lastLng); + // lastLat = lat; + // lastLng = lng; + // } + // return str.ToString(); + //} + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/JSbuild/testLocationsen1.js b/server/hitchbot-secure-api/hitchbot-secure-api/JSbuild/testLocationsen1.js new file mode 100644 index 00000000..4420bf8a --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/JSbuild/testLocationsen1.js @@ -0,0 +1,6 @@ +var flightPlanCoordinates = [ + new google.maps.LatLng(43.29,-79.86), + new google.maps.LatLng(46.00,-35.00), + new google.maps.LatLng(46.00,-35.00), ]; + var currentPoint = new google.maps.LatLng(46.00,-35.00); + function AddPolyFill0(e){var t=new google.maps.Polyline({path:flightPlanCoordinates,geodesic:true,strokeColor:"#E57373",strokeOpacity:1,strokeWeight:4});t.setMap(e)}function AddCurrentMarker(e){var t=new google.maps.MarkerImage("http://hitchbotimg.blob.core.windows.net/img/hitchicon2.png",new google.maps.Size(64,64),new google.maps.Point(0,0),new google.maps.Point(32,64));var n=new google.maps.Marker({position:currentPoint,map:e,animation:google.maps.Animation.DROP,icon:t});return}function AutoCenter(e){var t=new google.maps.LatLngBounds;t.extend(currentPoint);for(i=0;i"; + jsDataLocation.Text = @""; gmapsString.Text = string.Format(@""); } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs index 01923839..a270f4ea 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs @@ -55,11 +55,11 @@ public override void Up() c => new { Id = c.Int(nullable: false, identity: true), - Latitude = c.Decimal(nullable: false, precision: 18, scale: 2), - Longitude = c.Decimal(nullable: false, precision: 18, scale: 2), - Altitude = c.Decimal(precision: 18, scale: 2), - Accuracy = c.Decimal(precision: 18, scale: 2), - Velocity = c.Decimal(precision: 18, scale: 2), + Latitude = c.Double(nullable: false), + Longitude = c.Double(nullable: false), + Altitude = c.Double(), + Accuracy = c.Double(), + Velocity = c.Double(), LocationProvider = c.Int(nullable: false), NearestCity = c.String(), ForceProduction = c.Boolean(nullable: false), diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx index 490ca9bc..535ba6b4 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs index b9fc0d6c..6d6a42ab 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs @@ -37,14 +37,14 @@ protected override void Seed(hitchbot_secure_api.Dal.DatabaseContext context) new Location() { NearestCity = "SeedLocation1", - Latitude = 43.2423582m, - Longitude = -79.8391097m //also the true birthplace of hitchBOT + Latitude = 43.2423582, + Longitude = -79.8391097 //also the true birthplace of hitchBOT }, new Location() { NearestCity = "SeedLocation2", - Latitude = 43.7m, - Longitude = -79.4m, + Latitude = 43.7, + Longitude = -79.4, }, new Location() { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs index 2ff9870b..7374eac2 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs @@ -12,11 +12,11 @@ public class Location [Key] public int Id { get; set; } - public decimal Latitude { get; set; } - public decimal Longitude { get; set; } - public decimal? Altitude { get; set; } - public decimal? Accuracy { get; set; } - public decimal? Velocity { get; set; } + public double Latitude { get; set; } + public double Longitude { get; set; } + public double? Altitude { get; set; } + public double? Accuracy { get; set; } + public double? Velocity { get; set; } public LocationProvider LocationProvider { get; set; } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Scripts/_references.js b/server/hitchbot-secure-api/hitchbot-secure-api/Scripts/_references.js index 828e18ca251b6c91383bef42a3c33dd83f16b71a..8f6ae7593c70b09400313e0939c5aa4221756aa4 100644 GIT binary patch delta 69 zcmdnMwupU$0rO-7MlDl420aFShAf6+h9rhkhD?SWh7=&bgdr6uQUc`VGbA%40$G_r QRvu6+6-XLR{>Uf{01)2~H2?qr delta 7 OcmZ3)zJYCn0W$y!ngT-r diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index 71447cca..ace19a38 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -259,6 +259,9 @@ Global.asax
+ + + live.aspx @@ -325,6 +328,7 @@ + From e7cdbf99c0cd8241285faded6c1b54c4ea0a5fcb Mon Sep 17 00:00:00 2001 From: gagichce Date: Sat, 30 May 2015 17:37:58 -0400 Subject: [PATCH 10/20] weather and other info is now updated properly --- .../Controllers/HitchBotController.cs | 28 +- .../Helpers/WeatherHelper.cs | 266 ++++++++++++++++++ .../Migrations/Configuration.cs | 4 +- .../hitchbot-secure-api.csproj | 1 + 4 files changed, 295 insertions(+), 4 deletions(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index 32ba8e8a..98778e57 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Data.Entity; +using System.Data.Entity.Core.Metadata.Edm; using System.Linq; using System.Net; using System.Net.Http; @@ -21,9 +22,32 @@ public string Test(string repeat) return repeat; } - public async Task UpdateCleverscriptVariables() + + public async Task UpdateCleverscriptVariables(int HitchBotId) { - return Ok(); + using (var db = new DatabaseContext()) + { + var location = await db.Locations.Where(l => l.HitchBotId == HitchBotId).OrderByDescending(l => l.TakenTime).FirstAsync(); + var weatherApi = new Helpers.WeatherHelper.OpenWeatherApi(); + + weatherApi.LoadWeatherData(location.Latitude, location.Longitude); + + var contextpacket = new Models.ContextPacket() + { + HitchBotId = HitchBotId, + Variables = new List() + }; + + contextpacket.Variables.Add(weatherApi.GetCityNamePair()); + contextpacket.Variables.Add(weatherApi.GetTempCPair()); + contextpacket.Variables.Add(weatherApi.GetWeatherStatusPair()); + + db.ContextPackets.Add(contextpacket); + + await db.SaveChangesAsync(); + + return Ok("Variables were updated successfully"); + } } [HttpGet] diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs new file mode 100644 index 00000000..983b8762 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs @@ -0,0 +1,266 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using hitchbot_secure_api.Models; +using Newtonsoft.Json; + +// ReSharper disable InconsistentNaming +namespace hitchbot_secure_api.Helpers +{ + public static class WeatherHelper + { + + public class OpenWeatherApi + { + + private const string AppId = "f4710ad75291edad6d38785b4cdcb315"; //The APPID + private owData _owCurrentWeather; //Holds the deserialized data + + //From: http://www.codeproject.com/Tips/397574/Use-Csharp-to-get-JSON-Data-from-the-Web-and-Map-i + private static T _download_serialized_json_data(string url) where T : new() + { + using (var w = new WebClient()) + { + string jsonData = string.Empty; + // attempt to download JSON data as a string + try + { + jsonData = w.DownloadString(url); + } + catch (Exception) + { + // ignored + } + // if string with JSON data is not empty, deserialize it to class and return its instance + return !string.IsNullOrEmpty(jsonData) ? JsonConvert.DeserializeObject(jsonData) : new T(); + } + } + + public VariableValuePair GetCityNamePair() + { + return new VariableValuePair() + { + key = "current_city_name", + value = GetCityName() + }; + } + + public VariableValuePair GetTempCPair() + { + return new VariableValuePair() + { + key = "weather_temperatureC", + value = GetTempInC().ToString(CultureInfo.InvariantCulture) + }; + } + + public VariableValuePair GetWeatherStatusPair() + { + return new VariableValuePair() + { + key = "weather_status", + value = GetWeatherCondition() + }; + } + + //Load the data from a JSON request + public void LoadWeatherData(double lat, double lon) + { + try + { + string url = "http://api.openweathermap.org/data/2.5/weather?APPID=" + AppId + "&lat=" + lat + "&lon=" + lon; + _owCurrentWeather = _download_serialized_json_data(url); + } + catch (Exception er) + { + Console.WriteLine("Error loading current weather for lat {0}, lon {1}. Message: {2}", lat, lon, er.Message); + } + + } + + public string GetWeatherCondition() + { + var weatherConds = ""; + + try + { + //Not sure why a list is used by the OpenWeather site, but it is probably down to the ability for multiple conditions to exist at once + weatherConds = _owCurrentWeather.weather[0].main; + } + catch (Exception er) + { + Console.WriteLine("ERROR: {0}", er.Message); + } + + return weatherConds; + } + //Get the current weather text in a CSV string + public string GetWeatherCondsAsCsv() + { + var weatherConds = ""; + + try + { + //Not sure why a list is used by the OpenWeather site, but it is probably down to the ability for multiple conditions to exist at once + weatherConds = _owCurrentWeather.weather.Aggregate(weatherConds, (current, wListItem) => current + (wListItem.main + ",")); + + weatherConds = weatherConds.Substring(0, weatherConds.Length - 1); //Shed the last comma + } + catch (Exception er) + { + Console.WriteLine("ERROR: {0}", er.Message); + } + + return weatherConds; //Send back the data + } + + //Get the integer values as a CSV string + public string GetWeatherIdsAsCsv() + { + var weatherIDs = ""; + + + try + { + //Not sure why a list is used by the OpenWeather site, but it is probably down to the ability for multiple conditions to exist at once + weatherIDs = _owCurrentWeather.weather.Aggregate(weatherIDs, (current, wListItem) => current + (wListItem.id.ToString() + ",")); + + weatherIDs = weatherIDs.Substring(0, weatherIDs.Length - 1); //Shed the last comma + } + catch (Exception er) + { + Console.WriteLine("ERROR: {0}", er.Message); + } + + return weatherIDs; //Send back the data + } + + public double GetTempInK() + { + var temp = 0d; + try + { + temp = _owCurrentWeather.main.temp; + } + catch (Exception er) + { + Console.WriteLine("ERROR: {0}", er.Message); + } + + return temp; + } + + public double GetTempInC() + { + var temp = 0d; + try + { + temp = _owCurrentWeather.main.temp - 273; + } + catch (Exception er) + { + Console.WriteLine("ERROR: {0}", er.Message); + } + + return temp; + } + + public double GetHumidity() + { + var humidity = 0d; + try + { + humidity = _owCurrentWeather.main.humidity; + } + catch (Exception er) + { + Console.WriteLine("ERROR: {0}", er.Message); + } + + return humidity; + } + + public string GetCityName() + { + var name = ""; + try + { + name = _owCurrentWeather.name.ToString(CultureInfo.InvariantCulture); + } + catch (Exception er) + { + Console.WriteLine("ERROR: {0}", er.Message); + } + + return name; + } + + } + + public class Coord + { + public double lon { get; set; } + public double lat { get; set; } + } + + public class Sys + { + public string country { get; set; } + public int sunrise { get; set; } + public int sunset { get; set; } + } + + public class Weather + { + public int id { get; set; } + public string main { get; set; } + public string description { get; set; } + public string icon { get; set; } + } + + public class Main + { + public double temp { get; set; } + public double humidity { get; set; } + public double pressure { get; set; } + public double temp_min { get; set; } + public double temp_max { get; set; } + } + + public class Wind + { + public double speed { get; set; } + public double deg { get; set; } + } + + public class Rain + { + public int __invalid_name__3h { get; set; } + } + + public class Clouds + { + public int all { get; set; } + } + + public class owData + { + public Coord coord { get; set; } + public Sys sys { get; set; } + public List weather { get; set; } + public Main main { get; set; } + public Wind wind { get; set; } + public Rain rain { get; set; } + public Clouds clouds { get; set; } + public int dt { get; set; } + public int id { get; set; } + public string name { get; set; } + public int cod { get; set; } + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs index 6d6a42ab..ae3a8453 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs @@ -51,14 +51,14 @@ protected override void Seed(hitchbot_secure_api.Dal.DatabaseContext context) NearestCity = "SeedHitchBOTLocation1", Latitude = 45, Longitude = -34, - TakenTime = DateTime.UtcNow.AddMinutes(-1) + TakenTime = DateTime.UtcNow.AddMinutes(-20) }, new Location() { NearestCity = "SeedHitchBOTLocation2", Latitude = 46, Longitude = -35, - TakenTime = DateTime.UtcNow.AddMinutes(-1) + TakenTime = DateTime.UtcNow.AddMinutes(-20) }, new Location() { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index ace19a38..35e61293 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -263,6 +263,7 @@ + live.aspx ASPXCodeBehind From 7d1f1a02e0f4c8f7ed249938707b46b0c35d2e7a Mon Sep 17 00:00:00 2001 From: gagichce Date: Sat, 30 May 2015 19:33:22 -0400 Subject: [PATCH 11/20] spot gps + --- .../Controllers/HitchBotController.cs | 51 ++++++++++++++++ .../Controllers/ReturnObjects/Location.cs | 19 ++++++ .../Helpers/Location/GoogleMapsBuilder.cs | 3 +- .../Helpers/WeatherHelper.cs | 21 +------ .../Helpers/WebApiHelper.cs | 37 ++++++++++++ .../201505232238521_InitialCreate.cs | 1 + .../201505232238521_InitialCreate.resx | 2 +- .../Migrations/Configuration.cs | 4 +- .../hitchbot-secure-api/Models/Location.cs | 58 +++++++++++++++++++ .../hitchbot-secure-api.csproj | 1 + 10 files changed, 175 insertions(+), 22 deletions(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WebApiHelper.cs diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index 98778e57..b6bc95d7 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -7,9 +7,12 @@ using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; +using System.Web.Management; using Newtonsoft.Json; using hitchbot_secure_api.Dal; +using hitchbot_secure_api.Helpers; using hitchbot_secure_api.Models; +using System.Configuration; namespace hitchbot_secure_api.Controllers { @@ -22,6 +25,54 @@ public string Test(string repeat) return repeat; } + [HttpPost] + public async Task UpdateGpsFromSpotFeed(int HitchBotId) + { + using (var db = new DatabaseContext()) + { + var spotCurrentIdsTask = + db.Locations.Where(l => l.LocationProvider == LocationProvider.SpotGPS && l.HitchBotId == HitchBotId) + .Select(l => new { l.SpotID }) + .ToListAsync(); + + var feed_id = ConfigurationManager.AppSettings["spot-feed-id"]; + var url = string.Format( + "https://api.findmespot.com/spot-main-web/consumer/rest-api/2.0/public/feed/{0}/message.json", + feed_id); + + var spotty = WebApiHelper._download_serialized_json_data(url); + + var previousIds = await spotCurrentIdsTask; + + var messages = spotty.response.feedMessageResponse.messages.message + .Where(l => l.messageType == "EXTREME-TRACK") + .Where(l => previousIds.All(h => h.SpotID != l.id)) + .Select(l => new LocationController.SpotDto + { + latitude = l.latitude, + longitude = l.longitude, + spotId = l.id, + unixTime = l.unixTime + }).ToList(); + + messages.ForEach(l => + { + db.Locations.Add(new Location() + { + Latitude = l.latitude, + Longitude = l.longitude, + TakenTime = l.Time, + LocationProvider = LocationProvider.SpotGPS, + HitchBotId = HitchBotId, + SpotID = l.spotId + }); + }); + + await db.SaveChangesAsync(); + + return Ok(); + } + } public async Task UpdateCleverscriptVariables(int HitchBotId) { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs index cbfb430d..f6905356 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/Location.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Web.Http; @@ -27,5 +28,23 @@ public LocationProvider _LocationProvider get { return ((LocationProvider)(LocationProviderEnum ?? 0)); } } } + + public class SpotDto + { + public int spotId { get; set; } + public double latitude { get; set; } + public double longitude { get; set; } + + public int unixTime { get; set; } + + public DateTime Time + { + get + { + return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unixTime); + + } + } + } } } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs index 088f4b2b..6d34cdd8 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using System.Web.UI.WebControls; using System.Data.Entity; +using hitchbot_secure_api.Models; namespace hitchbot_secure_api.Helpers.Location { @@ -145,7 +146,7 @@ private string BuildPolyPath(int PolyPathNumber) //get all the locations from before launch--messy TODO update this for the current launch date using (var db = new Dal.DatabaseContext()) { - var locations = db.Locations.Where(l => l.HitchBotId == hitchBotId).OrderBy(l => l.TakenTime).ToList(); + var locations = db.Locations.Where(l => l.HitchBotId == hitchBotId && l.LocationProvider == LocationProvider.SpotGPS).OrderBy(l => l.TakenTime).ToList(); string builder = string.Empty; diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs index 983b8762..7adacfe4 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs @@ -22,24 +22,7 @@ public class OpenWeatherApi private owData _owCurrentWeather; //Holds the deserialized data //From: http://www.codeproject.com/Tips/397574/Use-Csharp-to-get-JSON-Data-from-the-Web-and-Map-i - private static T _download_serialized_json_data(string url) where T : new() - { - using (var w = new WebClient()) - { - string jsonData = string.Empty; - // attempt to download JSON data as a string - try - { - jsonData = w.DownloadString(url); - } - catch (Exception) - { - // ignored - } - // if string with JSON data is not empty, deserialize it to class and return its instance - return !string.IsNullOrEmpty(jsonData) ? JsonConvert.DeserializeObject(jsonData) : new T(); - } - } + public VariableValuePair GetCityNamePair() { @@ -74,7 +57,7 @@ public void LoadWeatherData(double lat, double lon) try { string url = "http://api.openweathermap.org/data/2.5/weather?APPID=" + AppId + "&lat=" + lat + "&lon=" + lon; - _owCurrentWeather = _download_serialized_json_data(url); + _owCurrentWeather = WebApiHelper._download_serialized_json_data(url); } catch (Exception er) { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WebApiHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WebApiHelper.cs new file mode 100644 index 00000000..75df9423 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WebApiHelper.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace hitchbot_secure_api.Helpers +{ + public static class WebApiHelper + { + public static T GetObjectFromWeb(string url) where T : new() + { + return _download_serialized_json_data(url); + } + + public static T _download_serialized_json_data(string url) where T : new() + { + using (var w = new WebClient()) + { + string jsonData = string.Empty; + // attempt to download JSON data as a string + try + { + jsonData = w.DownloadString(url); + } + catch (Exception) + { + // ignored + } + // if string with JSON data is not empty, deserialize it to class and return its instance + return !string.IsNullOrEmpty(jsonData) ? JsonConvert.DeserializeObject(jsonData) : new T(); + } + } + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs index a270f4ea..8c774ff6 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.cs @@ -60,6 +60,7 @@ public override void Up() Altitude = c.Double(), Accuracy = c.Double(), Velocity = c.Double(), + SpotID = c.Int(), LocationProvider = c.Int(nullable: false), NearestCity = c.String(), ForceProduction = c.Boolean(nullable: false), diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx index 535ba6b4..0a707bd8 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/201505232238521_InitialCreate.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs index ae3a8453..e9584323 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Migrations/Configuration.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Web.Mvc; using hitchbot_secure_api.Models; namespace hitchbot_secure_api.Migrations @@ -38,7 +39,8 @@ protected override void Seed(hitchbot_secure_api.Dal.DatabaseContext context) { NearestCity = "SeedLocation1", Latitude = 43.2423582, - Longitude = -79.8391097 //also the true birthplace of hitchBOT + Longitude = -79.8391097, //also the true birthplace of hitchBOT + TakenTime = DateTime.UtcNow }, new Location() { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs index 7374eac2..051bb9cc 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Models/Location.cs @@ -18,6 +18,8 @@ public class Location public double? Accuracy { get; set; } public double? Velocity { get; set; } + public int? SpotID { get; set; } + public LocationProvider LocationProvider { get; set; } public string NearestCity { get; set; } @@ -54,4 +56,60 @@ public enum LocationProvider TabletAGPS, SpotGPS } + + + //used http://json2csharp.com/ to get this. haha feels like such a dirty cheat. + public class SpotApiCall + { + public class Feed + { + public string id { get; set; } + public string name { get; set; } + public string description { get; set; } + public string status { get; set; } + public int usage { get; set; } + public int daysRange { get; set; } + public bool detailedMessageShown { get; set; } + } + + public class Message + { + public int id { get; set; } + public string messengerId { get; set; } + public string messengerName { get; set; } + public int unixTime { get; set; } + public string messageType { get; set; } + public double latitude { get; set; } + public double longitude { get; set; } + public string modelId { get; set; } + public string showCustomMsg { get; set; } + public string dateTime { get; set; } + public string batteryState { get; set; } + public int hidden { get; set; } + public string messageContent { get; set; } + } + + public class Messages + { + public List message { get; set; } + } + + public class FeedMessageResponse + { + public int count { get; set; } + public Feed feed { get; set; } + public int totalCount { get; set; } + public int activityCount { get; set; } + public Messages messages { get; set; } + } + + public class Response + { + public FeedMessageResponse feedMessageResponse { get; set; } + } + + + public Response response { get; set; } + + } } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index 35e61293..ddf90ab5 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -264,6 +264,7 @@ + live.aspx ASPXCodeBehind From 8d64e82be3deb6ea295f19230274180ac8164d28 Mon Sep 17 00:00:00 2001 From: gagichce Date: Sat, 30 May 2015 19:36:49 -0400 Subject: [PATCH 12/20] updated zoom level --- .../hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs index 6d34cdd8..3f44a0f1 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs @@ -132,7 +132,7 @@ private string BuildTargets() private string BuildGoogleMapsJsBody() { - return @"function AddPolyFill0(e){var t=new google.maps.Polyline({path:flightPlanCoordinates,geodesic:true,strokeColor:""#E57373"",strokeOpacity:1,strokeWeight:4});t.setMap(e)}function AddCurrentMarker(e){var t=new google.maps.MarkerImage(""http://hitchbotimg.blob.core.windows.net/img/hitchicon2.png"",new google.maps.Size(64,64),new google.maps.Point(0,0),new google.maps.Point(32,64));var n=new google.maps.Marker({position:currentPoint,map:e,animation:google.maps.Animation.DROP,icon:t});return}function AutoCenter(e){var t=new google.maps.LatLngBounds;t.extend(currentPoint);for(i=0;i""+""
""+""

""+n.info_text.info_header+""

""+""

""+n.info_text.info_body+""

"";var s=new google.maps.Marker({position:n.LatLng,map:e,title:n.info_text.info_header,html:i,icon:r});t.push(s)}for(var o=0;o Date: Mon, 1 Jun 2015 12:51:44 -0400 Subject: [PATCH 13/20] restored sanity - google maps code is now actually readable. changed centering to be around path travelled rather than target coords --- .../Helpers/Location/GoogleMapsBuilder.cs | 101 +++++++++++++----- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs index 3f44a0f1..70b12dbb 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs @@ -67,13 +67,9 @@ private string BuildCurrentLocation() { var current_loc = db.Locations.Where(l => l.HitchBotId == hitchBotId) - .OrderBy(l => l.TakenTime) - .ToArray() - .LastOrDefault(); - return @" - var currentPoint = new google.maps.LatLng(" + current_loc.Latitude + "," + current_loc.Longitude + - @"); - "; + .OrderByDescending(l => l.TakenTime) + .FirstOrDefault(); + return @"var currentPoint = new google.maps.LatLng(" + current_loc.Latitude + "," + current_loc.Longitude +");"; } } @@ -132,7 +128,62 @@ private string BuildTargets() private string BuildGoogleMapsJsBody() { - return @"function AddPolyFill0(e){var t=new google.maps.Polyline({path:flightPlanCoordinates,geodesic:true,strokeColor:""#E57373"",strokeOpacity:1,strokeWeight:4});t.setMap(e)}function AddCurrentMarker(e){var t=new google.maps.MarkerImage(""http://hitchbotimg.blob.core.windows.net/img/hitchicon2.png"",new google.maps.Size(64,64),new google.maps.Point(0,0),new google.maps.Point(32,64));var n=new google.maps.Marker({position:currentPoint,map:e,animation:google.maps.Animation.DROP,icon:t});return}function AutoCenter(e){var t=new google.maps.LatLngBounds;t.extend(currentPoint);for(i=0;i""+""
""+""

""+n.info_text.info_header+""

""+""

""+n.info_text.info_body+""

"";var s=new google.maps.Marker({position:n.LatLng,map:e,title:n.info_text.info_header,html:i,icon:r});t.push(s)}for(var o=0;o 0) + { + builder = "var flightPlanCoordinates = [ "; + + var slimmedLocations = LocationHelper.SlimLocations(locations) + .Select(l => string.Format("new google.maps.LatLng({0},{1})", l.Latitude, l.Longitude)); + + builder += string.Join(",\n", slimmedLocations); + + builder += @"];"; + } + else { - if (locations.Count > 0) - { - var slimmedLocations = LocationHelper.SlimLocations(locations); - - builder = "var flightPlanCoordinates = [ "; - - // Slim locations - foreach (Models.Location myLocation in slimmedLocations) - { - // Add each location to a JS array. - builder += "\n new google.maps.LatLng(" + myLocation.Latitude + "," + myLocation.Longitude + - "), "; - } - - builder += @"];"; - } - else - { - builder = @"var flightPlanCoordinates = [];"; - } + builder = @"var flightPlanCoordinates = [];"; } return builder; } From 38e0ba4569c3dd9c429da3d9025c30a9cd498a4f Mon Sep 17 00:00:00 2001 From: gagichce Date: Wed, 3 Jun 2015 01:18:24 -0400 Subject: [PATCH 14/20] changed int -> long --- .../Controllers/ReturnObjects/GenericHitchBot.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs index c62fe30b..63cc8339 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/ReturnObjects/GenericHitchBot.cs @@ -11,7 +11,7 @@ public class GenericHitchBot { public int HitchBotId { get; set; } - public int? TimeUnix { get; set; } + public long? TimeUnix { get; set; } public string Time { get; set; } From 2f8e421ac07ea52039a03cbec76bda3e941796a7 Mon Sep 17 00:00:00 2001 From: gagichce Date: Fri, 5 Jun 2015 22:05:50 -0400 Subject: [PATCH 15/20] updated location filtering methods --- .../hitchbot-secure-api/Controllers/HitchBotController.cs | 2 +- .../hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs | 4 ++-- .../hitchbot-secure-api/Helpers/Location/LocationHelper.cs | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index b6bc95d7..b9ffc485 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -45,7 +45,7 @@ public async Task UpdateGpsFromSpotFeed(int HitchBotId) var previousIds = await spotCurrentIdsTask; var messages = spotty.response.feedMessageResponse.messages.message - .Where(l => l.messageType == "EXTREME-TRACK") + .Where(l => l.messageType == "EXTREME-TRACK" || l.messageType == "NEWMOVEMENT") .Where(l => previousIds.All(h => h.SpotID != l.id)) .Select(l => new LocationController.SpotDto { diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs index 70b12dbb..d99c473e 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs @@ -69,7 +69,7 @@ private string BuildCurrentLocation() db.Locations.Where(l => l.HitchBotId == hitchBotId) .OrderByDescending(l => l.TakenTime) .FirstOrDefault(); - return @"var currentPoint = new google.maps.LatLng(" + current_loc.Latitude + "," + current_loc.Longitude +");"; + return @"var currentPoint = new google.maps.LatLng(" + current_loc.Latitude + "," + current_loc.Longitude + ");"; } } @@ -197,7 +197,7 @@ private string BuildPolyPath(int PolyPathNumber) //get all the locations from before launch--messy TODO update this for the current launch date using (var db = new Dal.DatabaseContext()) { - var locations = db.Locations.Where(l => l.HitchBotId == hitchBotId && l.LocationProvider == LocationProvider.SpotGPS).OrderBy(l => l.TakenTime).ToList(); + var locations = db.Locations.Where(l => l.HitchBotId == hitchBotId && l.TakenTime > l.HitchBot.Journey.StartTime && l.LocationProvider == LocationProvider.SpotGPS).OrderBy(l => l.TakenTime).ToList(); string builder = string.Empty; diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs index faaa9164..0d7d8342 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/LocationHelper.cs @@ -39,7 +39,8 @@ public static class LocationHelper //always add the last value - map always updated then plus other things rely on it! outList.Add(inList.Last()); - return outList; + //return outList; + return inList; } //code taken and modified from http://stackoverflow.com/questions/3852268/c-sharp-implementation-of-googles-encoded-polyline-algorithm From 9bced33eb2f90275e23d9cc433340289331f06a4 Mon Sep 17 00:00:00 2001 From: gagichce Date: Fri, 5 Jun 2015 22:06:31 -0400 Subject: [PATCH 16/20] rounded the temperature - for cleverscript --- .../hitchbot-secure-api/Helpers/WeatherHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs index 7adacfe4..4cf84f8a 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs @@ -38,7 +38,7 @@ public VariableValuePair GetTempCPair() return new VariableValuePair() { key = "weather_temperatureC", - value = GetTempInC().ToString(CultureInfo.InvariantCulture) + value = Math.Round(GetTempInC()).ToString(CultureInfo.InvariantCulture) }; } From f8a2572bba23f2e8ab33f4ca433fcdf647dfdde0 Mon Sep 17 00:00:00 2001 From: gagichce Date: Fri, 5 Jun 2015 22:32:54 -0400 Subject: [PATCH 17/20] tts readable ints are now also sent --- .../Controllers/HitchBotController.cs | 5 +- .../Helpers/HumanReadableInt.cs | 62 +++++++++++++++++++ .../Helpers/WeatherHelper.cs | 17 +++-- .../hitchbot-secure-api.csproj | 1 + 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 server/hitchbot-secure-api/hitchbot-secure-api/Helpers/HumanReadableInt.cs diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index b9ffc485..81566112 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -79,11 +79,11 @@ public async Task UpdateCleverscriptVariables(int HitchBotId) using (var db = new DatabaseContext()) { var location = await db.Locations.Where(l => l.HitchBotId == HitchBotId).OrderByDescending(l => l.TakenTime).FirstAsync(); - var weatherApi = new Helpers.WeatherHelper.OpenWeatherApi(); + var weatherApi = new WeatherHelper.OpenWeatherApi(); weatherApi.LoadWeatherData(location.Latitude, location.Longitude); - var contextpacket = new Models.ContextPacket() + var contextpacket = new ContextPacket() { HitchBotId = HitchBotId, Variables = new List() @@ -91,6 +91,7 @@ public async Task UpdateCleverscriptVariables(int HitchBotId) contextpacket.Variables.Add(weatherApi.GetCityNamePair()); contextpacket.Variables.Add(weatherApi.GetTempCPair()); + contextpacket.Variables.Add(weatherApi.GetTempTextCPair()); contextpacket.Variables.Add(weatherApi.GetWeatherStatusPair()); db.ContextPackets.Add(contextpacket); diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/HumanReadableInt.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/HumanReadableInt.cs new file mode 100644 index 00000000..b0783fa4 --- /dev/null +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/HumanReadableInt.cs @@ -0,0 +1,62 @@ +namespace hitchbot_secure_api.Helpers +{ + //adapted from http://stackoverflow.com/questions/3213/convert-integers-to-written-numbers + public static class HumanFriendlyInteger + { + static readonly string[] ones = { "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" }; + static readonly string[] teens = { "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" }; + static readonly string[] tens = { "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" }; + static readonly string[] thousandsGroups = { "", " Thousand", " Million", " Billion" }; + + private static string FriendlyInteger(int n, string leftDigits, int thousands) + { + if (n == 0) + { + return leftDigits; + } + string friendlyInt = leftDigits; + if (friendlyInt.Length > 0) + { + friendlyInt += " "; + } + + if (n < 10) + { + friendlyInt += ones[n]; + } + else if (n < 20) + { + friendlyInt += teens[n - 10]; + } + else if (n < 100) + { + friendlyInt += FriendlyInteger(n % 10, tens[n / 10 - 2], 0); + } + else if (n < 1000) + { + friendlyInt += FriendlyInteger(n % 100, (ones[n / 100] + " Hundred"), 0); + } + else + { + friendlyInt += FriendlyInteger(n % 1000, FriendlyInteger(n / 1000, "", thousands + 1), 0); + } + + return friendlyInt + thousandsGroups[thousands]; + } + + public static string IntegerToWritten(int n) + { + if (n == 0) + { + return "Zero"; + } + if (n < 0) + { + return "minus " + IntegerToWritten(-n); + } + + return FriendlyInteger(n, "", 0); + } + + } +} diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs index 4cf84f8a..575febca 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/WeatherHelper.cs @@ -26,7 +26,7 @@ public class OpenWeatherApi public VariableValuePair GetCityNamePair() { - return new VariableValuePair() + return new VariableValuePair { key = "current_city_name", value = GetCityName() @@ -35,16 +35,25 @@ public VariableValuePair GetCityNamePair() public VariableValuePair GetTempCPair() { - return new VariableValuePair() + return new VariableValuePair { key = "weather_temperatureC", - value = Math.Round(GetTempInC()).ToString(CultureInfo.InvariantCulture) + value = Convert.ToInt32(GetTempInC()).ToString() + }; + } + + public VariableValuePair GetTempTextCPair() + { + return new VariableValuePair + { + key = "weather_ctext", + value = Helpers.HumanFriendlyInteger.IntegerToWritten(Convert.ToInt32(GetTempInC())) }; } public VariableValuePair GetWeatherStatusPair() { - return new VariableValuePair() + return new VariableValuePair { key = "weather_status", value = GetWeatherCondition() diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj index ddf90ab5..2cfef527 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj +++ b/server/hitchbot-secure-api/hitchbot-secure-api/hitchbot-secure-api.csproj @@ -259,6 +259,7 @@ Global.asax
+ From d27b2364790508f160840656c46bf01678c52567 Mon Sep 17 00:00:00 2001 From: gagichce Date: Fri, 5 Jun 2015 22:37:25 -0400 Subject: [PATCH 18/20] now the current marker only displays the spot points --- .../hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs index d99c473e..df521c0c 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs @@ -67,6 +67,7 @@ private string BuildCurrentLocation() { var current_loc = db.Locations.Where(l => l.HitchBotId == hitchBotId) + .Where(l=>l.LocationProvider == LocationProvider.SpotGPS) .OrderByDescending(l => l.TakenTime) .FirstOrDefault(); return @"var currentPoint = new google.maps.LatLng(" + current_loc.Latitude + "," + current_loc.Longitude + ");"; From e5046ceff0f353013fb74d0268383c20229020ed Mon Sep 17 00:00:00 2001 From: gagichce Date: Fri, 5 Jun 2015 23:05:35 -0400 Subject: [PATCH 19/20] added a map update time field + force prod --- .../hitchbot-secure-api/Controllers/SystemController.cs | 7 ++++++- .../Helpers/Location/GoogleMapsBuilder.cs | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs index e98156a9..34936892 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/SystemController.cs @@ -9,6 +9,7 @@ namespace hitchbot_secure_api.Controllers { public partial class SystemController : ApiController { + public static DateTime MAP_LAST_UPDATED = DateTime.UtcNow; public async Task TestModel([FromBody] ReturnTest Context) { if (!ModelState.IsValid) @@ -30,8 +31,12 @@ public async Task BuildJs(int hitchBotId) { var builer = new Helpers.Location.GoogleMapsBuilder(hitchBotId); builer.BuildJsAndUpload(); + //HALLELIHA THE MAP WAS UPDATED + MAP_LAST_UPDATED = DateTime.UtcNow; + //Also basically this. + //TIME_SINCE_LAST_MAP_UPDATE_EMAIL { get { return DateTime.UtcNow; } } return Ok(string.Format("Map was successfully updated.")); - } + } } } diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs index df521c0c..695846df 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Helpers/Location/GoogleMapsBuilder.cs @@ -67,7 +67,7 @@ private string BuildCurrentLocation() { var current_loc = db.Locations.Where(l => l.HitchBotId == hitchBotId) - .Where(l=>l.LocationProvider == LocationProvider.SpotGPS) + .Where(l => l.LocationProvider == LocationProvider.SpotGPS) .OrderByDescending(l => l.TakenTime) .FirstOrDefault(); return @"var currentPoint = new google.maps.LatLng(" + current_loc.Latitude + "," + current_loc.Longitude + ");"; @@ -198,7 +198,12 @@ private string BuildPolyPath(int PolyPathNumber) //get all the locations from before launch--messy TODO update this for the current launch date using (var db = new Dal.DatabaseContext()) { - var locations = db.Locations.Where(l => l.HitchBotId == hitchBotId && l.TakenTime > l.HitchBot.Journey.StartTime && l.LocationProvider == LocationProvider.SpotGPS).OrderBy(l => l.TakenTime).ToList(); + var locations = db.Locations + .Where(l => + (l.HitchBotId == hitchBotId && l.TakenTime > l.HitchBot.Journey.StartTime && l.LocationProvider == LocationProvider.SpotGPS) + || + (l.ForceProduction)) + .OrderBy(l => l.TakenTime).ToList(); string builder = string.Empty; From a22c7f2fece9ad7af2bced4961a1a1e51676ccd7 Mon Sep 17 00:00:00 2001 From: gagichce Date: Sun, 7 Jun 2015 00:41:26 -0400 Subject: [PATCH 20/20] added stop points to the displayed GPS types --- .../hitchbot-secure-api/Controllers/HitchBotController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs index 81566112..1a4e97ce 100644 --- a/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs +++ b/server/hitchbot-secure-api/hitchbot-secure-api/Controllers/HitchBotController.cs @@ -45,7 +45,7 @@ public async Task UpdateGpsFromSpotFeed(int HitchBotId) var previousIds = await spotCurrentIdsTask; var messages = spotty.response.feedMessageResponse.messages.message - .Where(l => l.messageType == "EXTREME-TRACK" || l.messageType == "NEWMOVEMENT") + .Where(l => l.messageType == "EXTREME-TRACK" || l.messageType == "NEWMOVEMENT" || l.messageType== "STOP") .Where(l => previousIds.All(h => h.SpotID != l.id)) .Select(l => new LocationController.SpotDto {