Examples

The following examples illustrate how third party dispatch systems interact with the Atlas Labs MobileCAD API.

Initialization / Interface Start Up

Upon loading or starting CAD interface applications, vendors should verify the current state of the API and bring it current with the CAD system.

Authentication

The following C# code illustrates the procedure for logging in and obtaining an authentication token. The received token maybe used in both WebSockets and REST calls.

class Program
{
	[DataContract]
	public class AuthResponse
	{
		[DataMember(Name = "access_token")]
		public string Token { get; set; }
		[DataMember(Name = "expires_in")]
		public int Expires { get; set; }
	}
	static void Main(string[] args)
	{
		string baseUrl = "https://api.atlaslabs.io";
		string username = "test@domain.com";
		string password = "honeybadger";
		using (HttpClient client = new HttpClient())
		{
			client.BaseAddress = new Uri(baseUrl);
			client.DefaultRequestHeaders.Accept.Clear();
			client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
			if (LoginAsync(client, username, password).Result)
			{
				Console.WriteLine("Login success!");
			}
			else
				Console.WriteLine("Login failed!");
		}
	}
	static async Task LoginAsync(HttpClient client, string username, string password)
	{
		// Setup request for token authentication
		HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "Token");
		var keyValues = new List> {
			new KeyValuePair("grant_type", "password"),
			new KeyValuePair("username", username),
			new KeyValuePair("password", password) };

		request.Content = new FormUrlEncodedContent(keyValues);
		HttpResponseMessage response = await client.SendAsync(request);

		if (response.IsSuccessStatusCode)
		{
			if (response.Content == null)
				return false;

			// Successful header. Read content and save token for future requests
			AuthResponse auth = await response.Content.ReadAsAsync();

			Console.WriteLine("Token expires in " + auth.Expires + " seconds");

			// Save bearer token for future requests
			client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", auth.Token);
			return true;
		}

		return false;
	}
}
		

Initialization

Following successful authentication, clients should initialize their systems by synchronizing the API objects (vehicles, priorities, service levels, etc) with customer dispatch platforms. Typically this is done by retrieving a list of all API objects and comparing against the dispatch system, then forwarding updates, deletions, and additions back to the API.

// ExtRef1 and ExtRef2 are convenience fields for third party use and are recommended for storing mapping values
// or import/export codes to customer dispatch systems
List priorities = new List 
{
	new EntityDto(){ Name = "Alpha", ExtRef1 = "A", ExtRef2 = "1" },
	new EntityDto(){ Name = "Bravo", ExtRef1 = "B", ExtRef2 = "1" },
	new EntityDto(){ Name = "Charlie", ExtRef1 = "C", ExtRef2 = "1" },
	new EntityDto(){ Name = "Delta", ExtRef1 = "D", ExtRef2 = "1" },
};
foreach (EntityDto dto in priorities)
{
	using (HttpResponseMessage response = await client.PostAsJsonAsync("api/Priority", dto))
	{
		if (response.IsSuccessStatusCode)
			Console.WriteLine("Created priority {0} at {1}", dto.Name, response.Headers.Location);
		else
			Console.WriteLine("Error creating priority. Http status: {0}, Message: {1}", response.StatusCode, response.ReasonPhrase);
		}
}
List serviceLevels = new List
{
	new EntityDto(){ Name = "BLS", ExtRef1 = "1", ExtRef2 = "2" },
	new EntityDto(){ Name = "ALS", ExtRef1 = "2", ExtRef2 = "2" },
};
Foreach (EntityDto dto in serviceLevels)
{
	using (HttpResponseMessage response = await client.PostAsJsonAsync("api/ServiceLevel", dto))
	{
		if (response.IsSuccessStatusCode)
			Console.WriteLine("Created service level {0} at {1}", dto.Name, response.Headers.Location);
		else
			Console.WriteLine("Error creating priority. Http status: {0}, Message: {1}", response.StatusCode, response.ReasonPhrase);
	}
}
// Import list of possible vehicle statuses before loading vehicles
List vehicleStatus = new List
{
	new EntityDto(){ Name = "Out of Service", ExtRef1 = "1", ExtRef2 = "0" },
	new EntityDto(){ Name = "OOS Training", ExtRef1 = "2", ExtRef2 = "0" },
	new EntityDto(){ Name = "Av Radio", ExtRef1 = "1", ExtRef2 = "1" },
	new EntityDto(){ Name = "Av Quarters", ExtRef1 = "2", ExtRef2 = "1" },
	new EntityDto(){ Name = "Assigned", ExtRef1 = "1", ExtRef2 = "2" },
};
foreach (EntityDto dto in vehicleStatus)
{
	using (HttpResponseMessage response = await client.PostAsJsonAsync("api/VehicleStatus", dto))
	{
		if (response.IsSuccessStatusCode)
			Console.WriteLine("Created vehicle status {0} at {1}", dto.Name, response.Headers.Location);
		else
			Console.WriteLine("Error creating vehicle status. Http status: {0}, Message: {1}", response.StatusCode, response.ReasonPhrase);
	}
}
List vehicles = new List
{
	new VehicleDto(){ Name = "001", Alias = "M-1", Status = "Out of Service", ExtRef1 = "001", ExtRef2 = "" },
	new VehicleDto(){ Name = "002", Alias = "E-1", Status = "Out of Service", ExtRef1 = "002", ExtRef2 = "" }
};
foreach (VehicleDto dto in vehicles)
{
	using (HttpResponseMessage response = await client.PostAsJsonAsync("api/Vehicle", dto))
	{
		if (response.IsSuccessStatusCode)
			Console.WriteLine("Created vehicle {0} at {1}", dto.Name, response.Headers.Location);
		else
			Console.WriteLine("Error creating vehicle. Http status: {0}, Message: {1}", response.StatusCode, response.ReasonPhrase);
	}
}