Skip to content

Instantly share code, notes, and snippets.

@usergood
Created March 7, 2025 01:07
Show Gist options
  • Save usergood/4cf638616e2bfd90b618d59dd4df70f2 to your computer and use it in GitHub Desktop.
Save usergood/4cf638616e2bfd90b618d59dd4df70f2 to your computer and use it in GitHub Desktop.
Heim Demo openapi
name = "demo-geolocation"
component_target = 'demo-geolocation:1.0.0'
[[trigger.http]]
type = "http"
path = "/demo/extract-geo-location"
method = "POST"
[[trigger.http]]
type = "http"
path = "/demo/get-country"
method = "POST"
[[trigger.http]]
type = "http"
path = "/demo/sun-times"
method = "POST"
[capabilities]
allowed-outgoing-url = ["https://api.sunrise-sunset.org/*", "https://api.opencagedata.com/*"]
meta {
name: Extract Geo-Location from Image
type: http
seq: 1
}
post {
url: http://127.0.0.1:3000/demo/extract-geo-location
body: json
auth: none
}
headers {
Authorization: mysecret-token
}
body:json {
{
"image": "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"
}
}
using DemoGeolocationWorld.wit.imports.heim.demoGeolocation.v1_0_0;
namespace DemoGeolocationWorld.wit.exports.heim.demoGeolocation.v1_0_0;
public partial class GeoLocationImpl : IGeoLocation
{
public static bool Authorized(string AuthToken)
{
if (AuthToken == "mysecret-token")
{
return true;
}
return false;
}
// Extract Geo-Location from Image
public static async Task<ITypes.GeoLocationResponse> ExtractGeoLocationAsync(
string Authorization,
ITypes.ExtractGeoLocationRequestBody extractGeoLocationRequestBody)
{
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type
#pragma warning disable CS8603 // Possible null reference return
ITypes.GeoLocationResponse return_value = null;
if (!Authorized(Authorization))
{
return await Task.FromResult(return_value);
}
// Decode the base64 string to a byte array
byte[] imageBytes = Convert.FromBase64String(extractGeoLocationRequestBody.image);
// Create a MemoryStream from the byte array
using (var stream = new MemoryStream(imageBytes))
{
var directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(stream);
foreach (var directory in directories)
{
var gpsDirectory = directory as MetadataExtractor.Formats.Exif.GpsDirectory;
if (gpsDirectory != null)
{
var geoLocation = gpsDirectory.GetGeoLocation();
if (geoLocation != null)
{
return await Task.FromResult(
new ITypes.GeoLocationResponse(
geoLocation.Latitude,
geoLocation.Longitude));
}
}
}
}
return return_value;
#pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type
#pragma warning restore CS8603 // Possible null reference return
}
// Retrieve Country Name from Coordinates
public static async Task<ITypes.CountryResponse> GetCountryFromCoordinatesAsync(
string Authorization,
ITypes.Coordinates getCountryFromCoordinatesRequestBody)
{
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type
#pragma warning disable CS8603 // Possible null reference return
ITypes.CountryResponse return_value = null;
if (!Authorized(Authorization))
{
return await Task.FromResult(return_value);
}
var httpClient = new HttpClient();
var apiKey = "API-KEY"; // Replace with your API key
var url = $"https://api.opencagedata.com/geocode/v1/json"+
$"?q={getCountryFromCoordinatesRequestBody.latitude}+{getCountryFromCoordinatesRequestBody.longitude}" +
$"&key={apiKey}";
var response = await httpClient.GetStringAsync(url);
using (System.Text.Json.JsonDocument doc = System.Text.Json.JsonDocument.Parse(response))
{
var country = doc.RootElement
.GetProperty("results")[0]
.GetProperty("components")
.GetProperty("country")
.GetString();
return await Task.FromResult(new ITypes.CountryResponse(country));
}
#pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type
#pragma warning restore CS8603 // Possible null reference return
}
// Retrieve Sun Rise and Set Times
public static async Task<ITypes.SunTimesResponse> GetSunTimesAsync(
string Authorization,
ITypes.SunTimesRequest sunTimesRequest)
{
#pragma warning disable CS8602
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type
#pragma warning disable CS8603 // Possible null reference return
#pragma warning disable CS8604 // Possible null reference return
ITypes.SunTimesResponse return_value = null;
if (!Authorized(Authorization))
{
return await Task.FromResult(return_value);
}
var formattedDate = DateTime.Parse(sunTimesRequest.date).ToString("yyyy-MM-dd");
var url = $"https://api.sunrise-sunset.org/json" +
$"?lat={sunTimesRequest.coordinates.latitude}" +
$"&lng={sunTimesRequest.coordinates.longitude}" +
$"&date={formattedDate}&formatted=0";
var httpClient = new HttpClient();
var response = await httpClient.GetStringAsync(url);
using (System.Text.Json.JsonDocument doc = System.Text.Json.JsonDocument.Parse(response))
{
var sunrise = doc.RootElement
.GetProperty("results")
.GetProperty("sunrise")
.GetString();
var sunset = doc.RootElement
.GetProperty("results")
.GetProperty("sunset")
.GetString();
return new ITypes.SunTimesResponse(sunrise, sunset);
}
#pragma warning restore CS8604
#pragma warning restore CS8600
#pragma warning restore CS8603
#pragma warning restore CS8602
}
}
{
"openapi": "3.0.3",
"info": {
"title": "Demo Geolocation",
"version": "1.0.0",
"description": "API for geolocation services including image processing, country retrieval, and sun timing."
},
"tags": [
{
"name": "geo-location",
"description": "Operations related to geolocation services."
}
],
"components": {
"schemas": {
"Coordinates": {
"type": "object",
"properties": {
"latitude": {
"type": "number",
"format": "double",
"description": "Latitude of the location."
},
"longitude": {
"type": "number",
"format": "double",
"description": "Longitude of the location."
}
},
"required": ["latitude", "longitude"]
},
"GeoLocationResponse": {
"type": "object",
"properties": {
"latitude": {
"type": "number",
"format": "double"
},
"longitude": {
"type": "number",
"format": "double"
}
}
},
"CountryResponse": {
"type": "object",
"properties": {
"country": {
"type": "string",
"description": "Name of the country."
}
}
},
"SunTimesResponse": {
"type": "object",
"properties": {
"sunrise": {
"type": "string",
"format": "time",
"description": "Time of sunrise."
},
"sunset": {
"type": "string",
"format": "time",
"description": "Time of sunset."
}
}
},
"SunTimesRequest": {
"type": "object",
"properties": {
"coordinates": {
"$ref": "#/components/schemas/Coordinates"
},
"date": {
"type": "string",
"format": "date",
"description": "Date for which to retrieve sun times."
}
}
}
}
},
"paths": {
"/extract-geo-location": {
"post": {
"tags": ["geo-location"],
"summary": "Extract Geo-Location from Image",
"operationId": "extractGeoLocation",
"parameters": [
{
"name": "Authorization",
"in": "header",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"image": {
"type": "string",
"format": "binary",
"description": "Base64 encoded image."
}
},
"required": ["image"]
}
}
},
"examples": {
"example1": {
"value": {
"image": "iVBORw0KGgoAAAANSUhEUgAAAAUA..."
}
}
}
},
"responses": {
"200": {
"description": "Geo-Location coordinates extracted successfully.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GeoLocationResponse"
}
}
}
}
}
}
},
"/get-country": {
"post": {
"tags": ["geo-location"],
"summary": "Retrieve Country Name from Coordinates",
"operationId": "getCountryFromCoordinates",
"parameters": [
{
"name": "Authorization",
"in": "header",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Coordinates"
}
}
},
"examples": {
"example1": {
"value": {
"latitude": 37.7749,
"longitude": -122.4194
}
}
}
},
"responses": {
"200": {
"description": "Country name retrieved successfully.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CountryResponse"
}
}
}
}
}
}
},
"/sun-times": {
"post": {
"tags": ["geo-location"],
"summary": "Retrieve Sun Rise and Set Times",
"operationId": "getSunTimes",
"parameters": [
{
"name": "Authorization",
"in": "header",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunTimesRequest"
}
}
},
"examples": {
"example1": {
"value": {
"suntimesrequest": {
"coordinates": {
"latitude": 37.7749,
"longitude": -122.4194
},
"date": "2023-10-01"
}
}
}
}
},
"responses": {
"200": {
"description": "Sun rise and set times retrieved successfully.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SunTimesResponse"
}
}
}
}
}
}
}
}
}
meta {
name: Retrieve Country Name from Coordinates
type: http
seq: 2
}
post {
url: http://127.0.0.1:3000/demo/get-country
body: json
auth: none
}
headers {
Authorization: mysecret-token
}
body:json {
{
"latitude": 59.274,
"longitude": 15.2136
}
}
meta {
name: Retrieve Sun Rise and Set Times
type: http
seq: 3
}
post {
url: http://127.0.0.1:3000/demo/sun-times
body: json
auth: none
}
headers {
Authorization: mysecret-token
}
body:json {
{
"coordinates": {
"latitude": 59.274,
"longitude": 15.2136
},
"date": "2025-03-06"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment