Automatic push from FunctionsAPI
This commit is contained in:
parent
d92bdd6109
commit
723d775125
3355
Cargo.lock
generated
Normal file
3355
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
12
Cargo.toml
Normal file
12
Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
edition = "2024"
|
||||||
|
name = "web"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
fathom-function = { git = "ssh://git@github.com/fathom-io/pipeline-calculations.git", branch = "johnabell/pipeline-route" }
|
||||||
|
pipeline-application = { git = "ssh://git@github.com/fathom-io/pipeline-calculations.git", branch = "johnabell/pipeline-route" }
|
||||||
|
pipeline-configuration = { git = "ssh://git@github.com/fathom-io/pipeline-calculations.git", branch = "johnabell/pipeline-route" }
|
||||||
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
|
tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread"] }
|
||||||
|
uuid = { version = "1" }
|
||||||
67
README.md
67
README.md
@ -1,2 +1,67 @@
|
|||||||
# 20d90993d6bd46ccaec7f3bfd5eea492
|
# Pipeline route calculation
|
||||||
|
|
||||||
|
A function that exposes the pipeline route calculations.
|
||||||
|
|
||||||
|
The pipeline route can be defined by various means
|
||||||
|
- `kml` route file
|
||||||
|
- `kmz` route file
|
||||||
|
- `csv` of the x,y, and optionally z coordinates of the pipeline.
|
||||||
|
|
||||||
|
If the elevation is missing, we utilise one of the following services to obtain
|
||||||
|
the elevation of each waypoint on the pipeline.
|
||||||
|
|
||||||
|
- Google maps
|
||||||
|
- Map box
|
||||||
|
- Open elevation
|
||||||
|
|
||||||
|
This function implements the calculation of this following part of the BPML:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
Start((Start))
|
||||||
|
Start --> KML{User upload .kml or .csv?}
|
||||||
|
KML -->|.kml| V("Calculate pipeline measures (Vincenty's Method) - Calculation #2")
|
||||||
|
KML -->|.csv| POS{Is position in UTM or Lat/Lon?}
|
||||||
|
POS -->|UTM| PROJ(Poject to Lat/Lon - Calculation #3)
|
||||||
|
PROJ --> MEAS
|
||||||
|
POS -->|Lat/Lon| MEAS{Does the file contain the measure?}
|
||||||
|
MEAS -->|no| V
|
||||||
|
MEAS -->|yes| Done
|
||||||
|
V --> Done((Done))
|
||||||
|
```
|
||||||
|
|
||||||
|
## Input
|
||||||
|
|
||||||
|
### Arguments
|
||||||
|
|
||||||
|
- `elevation_provider`: a `string` value should be one of the following types
|
||||||
|
- `mapbox`
|
||||||
|
- `google_maps`
|
||||||
|
- `open_elevation`
|
||||||
|
- `pipeline_id`: an `array` of `strings` which should each be a valid uuid representing a pipeline.
|
||||||
|
- `route_file`: an `array` of `objects` containing the details of the uploaded file.
|
||||||
|
|
||||||
|
Note the pipeline_id array and route_file array should be the length such that
|
||||||
|
the first entry in each array corresponds to one another.
|
||||||
|
|
||||||
|
|
||||||
|
### Environment
|
||||||
|
|
||||||
|
- `ORG_ID`: the organization id
|
||||||
|
- `PROJECT_ID`: the id of the data project where the pipeline data is found
|
||||||
|
- `ENV`: the environment of the platform e.g. `dev` or `stg` etc.
|
||||||
|
|
||||||
|
## Testing the function locally
|
||||||
|
|
||||||
|
You can run and test the function locally by running
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo run
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you can check it work with `curl` as follows
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST localhost:8080 -v \
|
||||||
|
-d "\"{\\\"elevation_provider\\\": \\\"open_elevation\\\", \\\"formData\\\": {\\\"elevationProvider\\\": \\\"open_elevation\\\", \\\"pipeline_datasetIds\\\": \\\"\\\", \\\"pipeline_organizationId\\\": \\\"2cbfe270-d195-48ad-aed1-24145924635c\\\", \\\"pipeline_resourceClientIds\\\": [], \\\"pipeline_resourceIds\\\": [], \\\"pipeline_resourceTypeId\\\": null, \\\"pipeline_workspaceId\\\": null, \\\"routeFile\\\": [{\\\"fileId\\\": \\\"a97c1871-b6b2-4ea0-8a04-43ae4c7d76e3\\\", \\\"revisionId\\\": \\\"975b4034-aad1-4e12-b531-fb0cf0b6f255\\\"}]}, \\\"input\\\": null, \\\"pipeline_id\\\": [\\\"0195a527-f16b-7d83-b936-35bc2dd92f9d\\\"], \\\"route_file\\\": [{\\\"fileId\\\": \\\"a97c1871-b6b2-4ea0-8a04-43ae4c7d76e3\\\", \\\"revisionId\\\": \\\"975b4034-aad1-4e12-b531-fb0cf0b6f255\\\"}]}\""
|
||||||
|
```
|
||||||
|
|||||||
77
src/main.rs
Normal file
77
src/main.rs
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
use fathom_function::Context;
|
||||||
|
use pipeline_application::application::{
|
||||||
|
Application, ElevationProvider as ApplicationElevationProvider,
|
||||||
|
FileDetails as ApplicationFileDetails,
|
||||||
|
};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[fathom_function::function(default(
|
||||||
|
org_id = "2cbfe270-d195-48ad-aed1-24145924635c",
|
||||||
|
project_id = "67c6f36910e4c56ed42bf841"
|
||||||
|
))]
|
||||||
|
async fn pipeline_route(context: Context, input: Input) -> Result<String, String> {
|
||||||
|
let elevation_provider = input.elevation_provider;
|
||||||
|
let mut app = Application::new(context.env, context.org_id, &context.project_id).unwrap();
|
||||||
|
// TODO: We need a solution for getting API keys into functions
|
||||||
|
app.with_key().map_box("pk.eyJ1IjoiaG11YmFpcmVlayIsImEiOiJjam03ZXh1cXcxdXV2M3FtdWl4dGphNmxhIn0.1V1fEZMzOt0YumJtwU9AvA".to_owned());
|
||||||
|
for (pipeline_id, file_details) in input.into_iter() {
|
||||||
|
app.process_pipeline_route_file(
|
||||||
|
pipeline_id,
|
||||||
|
file_details,
|
||||||
|
elevation_provider,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
Ok("Success".to_owned())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct Input {
|
||||||
|
elevation_provider: ElevationProvider,
|
||||||
|
// This is not currently set correctly - since we cannot select assets yet.
|
||||||
|
pipeline_id: Vec<Uuid>,
|
||||||
|
route_file: Vec<FileDetails>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Input {
|
||||||
|
fn into_iter(self) -> impl Iterator<Item = (Uuid, FileDetails)> {
|
||||||
|
self.pipeline_id.into_iter().zip(self.route_file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, Deserialize)]
|
||||||
|
#[serde(rename_all = "snake_case")]
|
||||||
|
pub enum ElevationProvider {
|
||||||
|
OpenElevation,
|
||||||
|
Mapbox,
|
||||||
|
GoogleMaps,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<ElevationProvider> for ApplicationElevationProvider {
|
||||||
|
fn from(value: ElevationProvider) -> Self {
|
||||||
|
match value {
|
||||||
|
ElevationProvider::OpenElevation => Self::OpenElevation,
|
||||||
|
ElevationProvider::Mapbox => Self::MapBox,
|
||||||
|
ElevationProvider::GoogleMaps => Self::GoogleMaps,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct FileDetails {
|
||||||
|
pub file_id: Uuid,
|
||||||
|
pub revision_id: Uuid,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl From<FileDetails> for ApplicationFileDetails {
|
||||||
|
fn from(value: FileDetails) -> Self {
|
||||||
|
Self {
|
||||||
|
id: value.file_id,
|
||||||
|
revision_id: value.revision_id,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user