geeny-api 0.3.0

Crate for consuming the Geeny APIs as a client
Documentation
// Copyright 2017 Telefónica Germany Next GmbH. See the COPYRIGHT file at
// the top-level directory of this distribution
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

//! API Data Models
//!
//! These models are Rust equivalents of the models defined by the Geeny APIs.
//! All types are serializable and deserializable using [serde](https://docs.serde.rs/serde).

use uuid::Uuid;

///////////////////////////////////////////////////////////////
// CONNECT/AUTH
///////////////////////////////////////////////////////////////
/// Structure for logging into the Geeny cloud via Basic Authentication
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct AuthLoginRequest {
    pub email: String,
    pub password: String,
}

// TODO DI-244 - Type alias? Don't just reuse types because they have the same data
/// Structure containing an API token from the Geeny cloud
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct AuthLoginResponse {
    pub token: String,
}

/// Structure for creating a user account on the Geeny Cloud
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
#[serde(rename_all = "camelCase")]
pub struct RegistrationRequest {
    pub email: String,
    pub first_name: String,
    pub last_name: String,
    pub password: String,
    pub is_developer: bool,
}

///////////////////////////////////////////////////////////////
// MESSAGE TYPE
///////////////////////////////////////////////////////////////
/// Structure for creating a new `MessageType`
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct MessageTypeRequest {
    pub name: String,
    pub description: String,
    pub media_type: String,
    pub tags: Vec<String>,
}

/// Structure representing a `MessageType` on the Geeny cloud
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct MessageType {
    pub id: Uuid,
    pub name: String,
    pub description: String,
    pub media_type: String,
    pub tags: Vec<String>,
    pub created: String, // TODO date time?
}

///////////////////////////////////////////////////////////////
// THING TYPE
///////////////////////////////////////////////////////////////
/// Structure for creating a new `ThingType`
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct ThingTypeRequest {
    pub name: String,
    pub resources: Vec<Resource>,
}

/// Structure representing a `ThingType` on the Geeny cloud
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct ThingType {
    pub id: Uuid,
    pub name: String,
    pub public: bool,
    pub created: String,             // TODO datetime
    pub deactivated: Option<String>, // TODO datetime
}

/// Enumeration of possible methods of a Resource
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
#[serde(rename_all = "camelCase")]
pub enum ResourceMethod {
    Pub,
    Sub,
}

/// Structure representing a Resource on the Geeny cloud
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct Resource {
    pub uri: String,
    pub method: ResourceMethod,
    pub message_type: Uuid,
}

///////////////////////////////////////////////////////////////
// THING
///////////////////////////////////////////////////////////////

/// Structure for storing certificates generated for a given Thing
///
/// These certificates are used when connecting via MQTT
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct ThingCertificates {
    pub ca: String,
    pub cert: String,
    pub key: String,
}

/// Structure represeting a Thing on the Geeny cloud
#[derive(Debug, Deserialize, Serialize, Clone, Hash)]
pub struct Thing {
    pub id: Uuid,
    pub name: String,
    pub serial_number: String,
    pub thing_type: Uuid,
    pub certs: Option<ThingCertificates>,
    pub created: String, // TODO date time?
    pub deactivated: Option<String>,
}

// NOTE: "id" is the one source of truth for Thing(s)
impl PartialEq for Thing {
    fn eq(&self, other: &Self) -> bool {
        self.id == other.id
    }
}
impl Eq for Thing {}

/// Structure for creating a new Thing
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct ThingRequest {
    pub name: String,
    pub serial_number: String,
    pub thing_type: Uuid,
}

///////////////////////////////////////////////////////////////
// OTHER
///////////////////////////////////////////////////////////////

/// Generic structure used for obtaining multiple items from the Geeny cloud
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct MetaResponseInfo {
    pub limit: usize,
    pub offset: usize,
}

/// Generic structure used for obtaining multiple items from the Geeny cloud
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Hash)]
pub struct GenericResponse<T> {
    pub meta: MetaResponseInfo,
    pub data: Vec<T>,
}