1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// 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>,
}