use native_db::{native_db, ToKey};
use native_model::{native_model, Model};
use serde::{Deserialize, Serialize};
use super::v1::{AncestorLocal, EntityLifecycle, MediaType, Syncable};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[native_model(id = 16, version = 6)]
#[native_db]
pub struct EventLocalV9 {
pub id: Option<i64>,
#[primary_key]
pub id_local: Option<String>,
pub message: Option<String>,
pub media_url: Option<String>,
pub file_path: Option<String>,
pub location: Option<String>,
pub altitude: f64,
pub heading: f64,
pub media_type: MediaType,
pub device_id: i64,
pub earthranger_url: Option<String>,
pub timestamp_observation: String,
pub is_public: bool,
#[secondary_key]
pub session_id: Option<i64>,
#[secondary_key]
pub ancestor_id_local: Option<String>,
pub tagged_at: Option<String>,
pub embedded_at: Option<String>,
pub segmented_at: Option<String>,
pub tracked_at: Option<String>,
#[serde(default)]
pub lifecycle: EntityLifecycle,
pub lifecycle_changed_at: String,
#[serde(default)]
pub lifecycle_changed_by: Option<String>,
#[serde(default)]
pub lifecycle_reason: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[native_model(id = 16, version = 7)]
#[native_db]
pub struct EventLocalV12 {
pub id: Option<i64>,
#[primary_key]
pub id_local: Option<String>,
pub message: Option<String>,
pub media_url: Option<String>,
pub file_path: Option<String>,
pub location: Option<String>,
pub origin_location: Option<String>,
pub origin_pitch: Option<f64>,
pub origin_heading: Option<f64>,
pub origin_roll: Option<f64>,
pub sensor_pitch: Option<f64>,
pub sensor_yaw: Option<f64>,
pub sensor_roll: Option<f64>,
pub origin_height: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub media_type: MediaType,
pub device_id: i64,
pub earthranger_url: Option<String>,
pub timestamp_observation: String,
pub is_public: bool,
#[secondary_key]
pub session_id: Option<i64>,
#[secondary_key]
pub ancestor_id_local: Option<String>,
pub tagged_at: Option<String>,
pub embedded_at: Option<String>,
pub segmented_at: Option<String>,
pub tracked_at: Option<String>,
#[serde(default)]
pub lifecycle: EntityLifecycle,
pub lifecycle_changed_at: String,
#[serde(default)]
pub lifecycle_changed_by: Option<String>,
#[serde(default)]
pub lifecycle_reason: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[native_model(id = 16, version = 8, from = EventLocalV12)]
#[native_db]
pub struct EventLocalV15 {
pub id: Option<i64>,
#[primary_key]
pub id_local: Option<String>,
pub message: Option<String>,
pub media_url: Option<String>,
pub file_path: Option<String>,
pub location: Option<String>,
pub origin_location: Option<String>,
pub origin_pitch: Option<f64>,
pub origin_heading: Option<f64>,
pub origin_roll: Option<f64>,
pub sensor_pitch: Option<f64>,
pub sensor_yaw: Option<f64>,
pub sensor_roll: Option<f64>,
pub origin_height: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub media_type: MediaType,
pub device_id: i64,
pub earthranger_url: Option<String>,
pub timestamp_observation: String,
pub is_public: bool,
#[secondary_key]
pub session_id: Option<i64>,
#[secondary_key]
pub ancestor_id_local: Option<String>,
pub tagged_at: Option<String>,
pub embedded_at: Option<String>,
pub segmented_at: Option<String>,
pub tracked_at: Option<String>,
pub thumbnail_file_path: Option<String>,
pub thumbnail_generated_at: Option<String>,
pub proxy_file_path: Option<String>,
pub proxy_generated_at: Option<String>,
#[serde(default)]
pub lifecycle: EntityLifecycle,
pub lifecycle_changed_at: String,
#[serde(default)]
pub lifecycle_changed_by: Option<String>,
#[serde(default)]
pub lifecycle_reason: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[native_model(id = 16, version = 9, from = EventLocalV15)]
#[native_db]
pub struct EventLocalV16 {
pub id: Option<i64>,
#[primary_key]
pub id_local: Option<String>,
pub message: Option<String>,
pub media_url: Option<String>,
pub file_path: Option<String>,
pub location: Option<String>,
pub origin_location: Option<String>,
pub origin_pitch: Option<f64>,
pub origin_heading: Option<f64>,
pub origin_roll: Option<f64>,
pub sensor_pitch: Option<f64>,
pub sensor_yaw: Option<f64>,
pub sensor_roll: Option<f64>,
pub origin_height: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub media_type: MediaType,
pub modality: Option<String>,
pub source: Option<String>,
pub device_id: i64,
pub earthranger_url: Option<String>,
pub timestamp_observation: String,
pub is_public: bool,
#[secondary_key]
pub session_id: Option<i64>,
#[secondary_key]
pub ancestor_id_local: Option<String>,
pub tagged_at: Option<String>,
pub embedded_at: Option<String>,
pub segmented_at: Option<String>,
pub tracked_at: Option<String>,
pub thumbnail_file_path: Option<String>,
pub thumbnail_generated_at: Option<String>,
pub proxy_file_path: Option<String>,
pub proxy_generated_at: Option<String>,
#[serde(default)]
pub lifecycle: EntityLifecycle,
pub lifecycle_changed_at: String,
#[serde(default)]
pub lifecycle_changed_by: Option<String>,
#[serde(default)]
pub lifecycle_reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[native_model(id = 16, version = 10, from = EventLocalV16)]
#[native_db]
pub struct EventLocal {
pub id: Option<i64>,
#[primary_key]
pub id_local: Option<String>,
pub message: Option<String>,
pub media_url: Option<String>,
pub file_path: Option<String>,
pub location: Option<String>,
pub origin_location: Option<String>,
pub origin_pitch: Option<f64>,
pub origin_heading: Option<f64>,
pub origin_roll: Option<f64>,
pub sensor_pitch: Option<f64>,
pub sensor_yaw: Option<f64>,
pub sensor_roll: Option<f64>,
pub origin_height: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub media_type: MediaType,
pub modality: Option<String>,
pub source: Option<String>,
pub device_id: i64,
pub earthranger_url: Option<String>,
pub timestamp_observation: String,
pub is_public: bool,
#[secondary_key]
pub session_id: Option<i64>,
#[secondary_key]
pub ancestor_id_local: Option<String>,
pub connectivity_id: Option<i64>,
pub sensor_pose_id: Option<i64>,
pub tagged_at: Option<String>,
pub embedded_at: Option<String>,
pub segmented_at: Option<String>,
pub tracked_at: Option<String>,
pub thumbnail_file_path: Option<String>,
pub thumbnail_generated_at: Option<String>,
pub proxy_file_path: Option<String>,
pub proxy_generated_at: Option<String>,
#[serde(default)]
pub lifecycle: EntityLifecycle,
pub lifecycle_changed_at: String,
#[serde(default)]
pub lifecycle_changed_by: Option<String>,
#[serde(default)]
pub lifecycle_reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct Event {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i64>,
pub message: Option<String>,
pub media_url: Option<String>,
pub file_path: Option<String>,
pub location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_pitch: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_heading: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_roll: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_pitch: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_yaw: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_roll: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_height: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub media_type: MediaType,
#[serde(skip_serializing_if = "Option::is_none")]
pub modality: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
pub device_id: i64,
pub earthranger_url: Option<String>,
pub timestamp_observation: String,
pub is_public: bool,
pub session_id: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connectivity_id: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sensor_pose_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tagged_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub embedded_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub segmented_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tracked_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail_file_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail_generated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_file_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_generated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub processing_blocked_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub processing_blocked_reason: Option<String>,
#[serde(default)]
pub lifecycle: EntityLifecycle,
#[serde(skip_serializing_if = "Option::is_none")]
pub lifecycle_changed_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lifecycle_changed_by: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lifecycle_reason: Option<String>,
}
impl From<EventLocalV12> for EventLocalV15 {
fn from(previous: EventLocalV12) -> Self {
Self {
id: previous.id,
id_local: previous.id_local,
message: previous.message,
media_url: previous.media_url,
file_path: previous.file_path,
location: previous.location,
origin_location: previous.origin_location,
origin_pitch: previous.origin_pitch,
origin_heading: previous.origin_heading,
origin_roll: previous.origin_roll,
sensor_pitch: previous.sensor_pitch,
sensor_yaw: previous.sensor_yaw,
sensor_roll: previous.sensor_roll,
origin_height: previous.origin_height,
altitude: previous.altitude,
heading: previous.heading,
media_type: previous.media_type,
device_id: previous.device_id,
earthranger_url: previous.earthranger_url,
timestamp_observation: previous.timestamp_observation,
is_public: previous.is_public,
session_id: previous.session_id,
ancestor_id_local: previous.ancestor_id_local,
tagged_at: previous.tagged_at,
embedded_at: previous.embedded_at,
segmented_at: previous.segmented_at,
tracked_at: previous.tracked_at,
thumbnail_file_path: None,
thumbnail_generated_at: None,
proxy_file_path: None,
proxy_generated_at: None,
lifecycle: previous.lifecycle,
lifecycle_changed_at: previous.lifecycle_changed_at,
lifecycle_changed_by: previous.lifecycle_changed_by,
lifecycle_reason: previous.lifecycle_reason,
}
}
}
impl From<EventLocalV15> for EventLocalV12 {
fn from(current: EventLocalV15) -> Self {
Self {
id: current.id,
id_local: current.id_local,
message: current.message,
media_url: current.media_url,
file_path: current.file_path,
location: current.location,
origin_location: current.origin_location,
origin_pitch: current.origin_pitch,
origin_heading: current.origin_heading,
origin_roll: current.origin_roll,
sensor_pitch: current.sensor_pitch,
sensor_yaw: current.sensor_yaw,
sensor_roll: current.sensor_roll,
origin_height: current.origin_height,
altitude: current.altitude,
heading: current.heading,
media_type: current.media_type,
device_id: current.device_id,
earthranger_url: current.earthranger_url,
timestamp_observation: current.timestamp_observation,
is_public: current.is_public,
session_id: current.session_id,
ancestor_id_local: current.ancestor_id_local,
tagged_at: current.tagged_at,
embedded_at: current.embedded_at,
segmented_at: current.segmented_at,
tracked_at: current.tracked_at,
lifecycle: current.lifecycle,
lifecycle_changed_at: current.lifecycle_changed_at,
lifecycle_changed_by: current.lifecycle_changed_by,
lifecycle_reason: current.lifecycle_reason,
}
}
}
impl From<EventLocalV15> for EventLocalV16 {
fn from(previous: EventLocalV15) -> Self {
Self {
id: previous.id,
id_local: previous.id_local,
message: previous.message,
media_url: previous.media_url,
file_path: previous.file_path,
location: previous.location,
origin_location: previous.origin_location,
origin_pitch: previous.origin_pitch,
origin_heading: previous.origin_heading,
origin_roll: previous.origin_roll,
sensor_pitch: previous.sensor_pitch,
sensor_yaw: previous.sensor_yaw,
sensor_roll: previous.sensor_roll,
origin_height: previous.origin_height,
altitude: previous.altitude,
heading: previous.heading,
media_type: previous.media_type,
modality: None,
source: None,
device_id: previous.device_id,
earthranger_url: previous.earthranger_url,
timestamp_observation: previous.timestamp_observation,
is_public: previous.is_public,
session_id: previous.session_id,
ancestor_id_local: previous.ancestor_id_local,
tagged_at: previous.tagged_at,
embedded_at: previous.embedded_at,
segmented_at: previous.segmented_at,
tracked_at: previous.tracked_at,
thumbnail_file_path: previous.thumbnail_file_path,
thumbnail_generated_at: previous.thumbnail_generated_at,
proxy_file_path: previous.proxy_file_path,
proxy_generated_at: previous.proxy_generated_at,
lifecycle: previous.lifecycle,
lifecycle_changed_at: previous.lifecycle_changed_at,
lifecycle_changed_by: previous.lifecycle_changed_by,
lifecycle_reason: previous.lifecycle_reason,
}
}
}
impl From<EventLocalV16> for EventLocalV15 {
fn from(current: EventLocalV16) -> Self {
Self {
id: current.id,
id_local: current.id_local,
message: current.message,
media_url: current.media_url,
file_path: current.file_path,
location: current.location,
origin_location: current.origin_location,
origin_pitch: current.origin_pitch,
origin_heading: current.origin_heading,
origin_roll: current.origin_roll,
sensor_pitch: current.sensor_pitch,
sensor_yaw: current.sensor_yaw,
sensor_roll: current.sensor_roll,
origin_height: current.origin_height,
altitude: current.altitude,
heading: current.heading,
media_type: current.media_type,
device_id: current.device_id,
earthranger_url: current.earthranger_url,
timestamp_observation: current.timestamp_observation,
is_public: current.is_public,
session_id: current.session_id,
ancestor_id_local: current.ancestor_id_local,
tagged_at: current.tagged_at,
embedded_at: current.embedded_at,
segmented_at: current.segmented_at,
tracked_at: current.tracked_at,
thumbnail_file_path: current.thumbnail_file_path,
thumbnail_generated_at: current.thumbnail_generated_at,
proxy_file_path: current.proxy_file_path,
proxy_generated_at: current.proxy_generated_at,
lifecycle: current.lifecycle,
lifecycle_changed_at: current.lifecycle_changed_at,
lifecycle_changed_by: current.lifecycle_changed_by,
lifecycle_reason: current.lifecycle_reason,
}
}
}
impl From<EventLocalV16> for EventLocal {
fn from(previous: EventLocalV16) -> Self {
Self {
id: previous.id,
id_local: previous.id_local,
message: previous.message,
media_url: previous.media_url,
file_path: previous.file_path,
location: previous.location,
origin_location: previous.origin_location,
origin_pitch: previous.origin_pitch,
origin_heading: previous.origin_heading,
origin_roll: previous.origin_roll,
sensor_pitch: previous.sensor_pitch,
sensor_yaw: previous.sensor_yaw,
sensor_roll: previous.sensor_roll,
origin_height: previous.origin_height,
altitude: previous.altitude,
heading: previous.heading,
media_type: previous.media_type,
modality: previous.modality,
source: previous.source,
device_id: previous.device_id,
earthranger_url: previous.earthranger_url,
timestamp_observation: previous.timestamp_observation,
is_public: previous.is_public,
session_id: previous.session_id,
ancestor_id_local: previous.ancestor_id_local,
connectivity_id: None,
sensor_pose_id: None,
tagged_at: previous.tagged_at,
embedded_at: previous.embedded_at,
segmented_at: previous.segmented_at,
tracked_at: previous.tracked_at,
thumbnail_file_path: previous.thumbnail_file_path,
thumbnail_generated_at: previous.thumbnail_generated_at,
proxy_file_path: previous.proxy_file_path,
proxy_generated_at: previous.proxy_generated_at,
lifecycle: previous.lifecycle,
lifecycle_changed_at: previous.lifecycle_changed_at,
lifecycle_changed_by: previous.lifecycle_changed_by,
lifecycle_reason: previous.lifecycle_reason,
}
}
}
impl From<EventLocal> for EventLocalV16 {
fn from(current: EventLocal) -> Self {
Self {
id: current.id,
id_local: current.id_local,
message: current.message,
media_url: current.media_url,
file_path: current.file_path,
location: current.location,
origin_location: current.origin_location,
origin_pitch: current.origin_pitch,
origin_heading: current.origin_heading,
origin_roll: current.origin_roll,
sensor_pitch: current.sensor_pitch,
sensor_yaw: current.sensor_yaw,
sensor_roll: current.sensor_roll,
origin_height: current.origin_height,
altitude: current.altitude,
heading: current.heading,
media_type: current.media_type,
modality: current.modality,
source: current.source,
device_id: current.device_id,
earthranger_url: current.earthranger_url,
timestamp_observation: current.timestamp_observation,
is_public: current.is_public,
session_id: current.session_id,
ancestor_id_local: current.ancestor_id_local,
tagged_at: current.tagged_at,
embedded_at: current.embedded_at,
segmented_at: current.segmented_at,
tracked_at: current.tracked_at,
thumbnail_file_path: current.thumbnail_file_path,
thumbnail_generated_at: current.thumbnail_generated_at,
proxy_file_path: current.proxy_file_path,
proxy_generated_at: current.proxy_generated_at,
lifecycle: current.lifecycle,
lifecycle_changed_at: current.lifecycle_changed_at,
lifecycle_changed_by: current.lifecycle_changed_by,
lifecycle_reason: current.lifecycle_reason,
}
}
}
impl From<EventLocal> for Event {
fn from(local: EventLocal) -> Self {
Self {
id: local.id,
message: local.message,
media_url: local.media_url,
file_path: local.file_path,
location: local.location,
origin_location: local.origin_location,
origin_pitch: local.origin_pitch,
origin_heading: local.origin_heading,
origin_roll: local.origin_roll,
sensor_pitch: local.sensor_pitch,
sensor_yaw: local.sensor_yaw,
sensor_roll: local.sensor_roll,
origin_height: local.origin_height,
altitude: local.altitude,
heading: local.heading,
media_type: local.media_type,
modality: local.modality,
source: local.source,
device_id: local.device_id,
earthranger_url: local.earthranger_url,
timestamp_observation: local.timestamp_observation,
is_public: local.is_public,
session_id: local.session_id,
connectivity_id: local.connectivity_id,
sensor_pose_id: local.sensor_pose_id,
tagged_at: local.tagged_at,
embedded_at: local.embedded_at,
segmented_at: local.segmented_at,
tracked_at: local.tracked_at,
thumbnail_file_path: local.thumbnail_file_path,
thumbnail_generated_at: local.thumbnail_generated_at,
proxy_file_path: local.proxy_file_path,
proxy_generated_at: local.proxy_generated_at,
processing_blocked_at: None,
processing_blocked_reason: None,
lifecycle: local.lifecycle,
lifecycle_changed_at: Some(local.lifecycle_changed_at),
lifecycle_changed_by: local.lifecycle_changed_by,
lifecycle_reason: local.lifecycle_reason,
}
}
}
impl From<Event> for EventLocal {
fn from(event: Event) -> Self {
Self {
id: event.id,
id_local: None,
message: event.message,
media_url: event.media_url,
file_path: event.file_path,
location: event.location,
origin_location: event.origin_location,
origin_pitch: event.origin_pitch,
origin_heading: event.origin_heading,
origin_roll: event.origin_roll,
sensor_pitch: event.sensor_pitch,
sensor_yaw: event.sensor_yaw,
sensor_roll: event.sensor_roll,
origin_height: event.origin_height,
altitude: event.altitude,
heading: event.heading,
media_type: event.media_type,
modality: event.modality,
source: event.source,
device_id: event.device_id,
earthranger_url: event.earthranger_url,
timestamp_observation: event.timestamp_observation,
is_public: event.is_public,
session_id: event.session_id,
ancestor_id_local: None,
connectivity_id: event.connectivity_id,
sensor_pose_id: event.sensor_pose_id,
tagged_at: event.tagged_at,
embedded_at: event.embedded_at,
segmented_at: event.segmented_at,
tracked_at: event.tracked_at,
thumbnail_file_path: event.thumbnail_file_path,
thumbnail_generated_at: event.thumbnail_generated_at,
proxy_file_path: event.proxy_file_path,
proxy_generated_at: event.proxy_generated_at,
lifecycle: event.lifecycle,
lifecycle_changed_at: event
.lifecycle_changed_at
.unwrap_or_else(|| chrono::Utc::now().to_rfc3339()),
lifecycle_changed_by: event.lifecycle_changed_by,
lifecycle_reason: event.lifecycle_reason,
}
}
}
impl Default for EventLocal {
fn default() -> Self {
Event::default().into()
}
}
impl AncestorLocal for EventLocal {
fn ancestor_id_local(&self) -> Option<String> {
self.ancestor_id_local.clone()
}
fn set_ancestor_id_local(&mut self, ancestor_id_local: String) {
self.ancestor_id_local = Some(ancestor_id_local);
}
}
impl Syncable for EventLocal {
fn id(&self) -> Option<i64> {
self.id
}
fn set_id(&mut self, id: i64) {
self.id = Some(id);
}
fn id_local(&self) -> Option<String> {
self.id_local.clone()
}
fn set_id_local(&mut self, id_local: String) {
self.id_local = Some(id_local);
}
}
impl Syncable for Event {
fn id(&self) -> Option<i64> {
self.id
}
fn set_id(&mut self, id: i64) {
self.id = Some(id);
}
fn id_local(&self) -> Option<String> {
None
}
fn set_id_local(&mut self, _: String) {}
}
impl Event {
#[allow(clippy::too_many_arguments)]
pub fn new(
message: Option<String>,
media_url: Option<String>,
file_path: Option<String>,
earthranger_url: Option<String>,
latitude: f64,
longitude: f64,
altitude: f64,
heading: f64,
media_type: MediaType,
device_id: i64,
timestamp_observation: u64,
is_public: bool,
session_id: Option<i64>,
) -> Self {
use chrono::{DateTime, Utc};
let timestamp_observation = DateTime::from_timestamp(timestamp_observation as i64, 0)
.unwrap_or_else(|| DateTime::<Utc>::from_timestamp(0, 0).expect("Unix epoch is valid"))
.to_rfc3339();
Self {
message,
media_url,
file_path,
earthranger_url,
location: Some(Self::format_location(latitude, longitude)),
altitude,
heading,
media_type,
device_id,
timestamp_observation,
is_public,
session_id,
lifecycle_changed_at: Some(chrono::Utc::now().to_rfc3339()),
..Default::default()
}
}
pub fn format_location(latitude: f64, longitude: f64) -> String {
format!("POINT({longitude} {latitude})")
}
}
impl EventLocal {
#[allow(clippy::too_many_arguments)]
pub fn new(
message: Option<String>,
media_url: Option<String>,
file_path: Option<String>,
earthranger_url: Option<String>,
latitude: f64,
longitude: f64,
altitude: f64,
heading: f64,
media_type: MediaType,
device_id: i64,
timestamp_observation: u64,
is_public: bool,
session_id: Option<i64>,
) -> Self {
Event::new(
message,
media_url,
file_path,
earthranger_url,
latitude,
longitude,
altitude,
heading,
media_type,
device_id,
timestamp_observation,
is_public,
session_id,
)
.into()
}
pub fn format_location(latitude: f64, longitude: f64) -> String {
Event::format_location(latitude, longitude)
}
}