Automatic push from FunctionsAPI
This commit is contained in:
parent
aed83158ea
commit
d03b7d4afa
3535
Cargo.lock
generated
Normal file
3535
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
edition = "2024"
|
||||||
|
name = "web"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
fathom-function = { git = "ssh://git@github.com/fathom-io/pipeline-calculations.git", branch = "johnabell/ili-comparison" }
|
||||||
|
pipeline-application = { git = "ssh://git@github.com/fathom-io/pipeline-calculations.git", branch = "johnabell/ili-comparison" }
|
||||||
|
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 @@
|
|||||||
# b72b8497cc1f432fbe18b30b50d60f12
|
# 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\\\"}]}\""
|
||||||
|
```
|
||||||
|
|||||||
76
src/main.rs
Normal file
76
src/main.rs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
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 = "6807aed617c4295ab4a6aa78"
|
||||||
|
))]
|
||||||
|
async fn pipeline_route(context: Context, input: Input) -> Result<String, String> {
|
||||||
|
let elevation_provider = input.elevation_provider;
|
||||||
|
let 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("".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,
|
||||||
|
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