1#![allow(clippy::module_name_repetitions)] use chrono::{NaiveDate, NaiveDateTime};
5use postgis_diesel::types::{Point, Polygon};
6use serde::{Deserialize, Serialize};
7use typeshare::typeshare;
8use utoipa::{IntoParams, ToSchema};
9use uuid::Uuid;
10
11use self::layers::LayerDto;
12
13use super::r#enum::{
14 herbaceous_or_woody::HerbaceousOrWoody, include_archived_seeds::IncludeArchivedSeeds,
15 life_cycle::LifeCycle, privacy_access_control::PrivacyAccessControl, quality::Quality,
16 quantity::Quantity, spatial_relation_type::SpatialRelationType,
17};
18
19pub mod actions;
20pub mod application_settings_impl;
21pub mod areas;
22pub mod areas_impl;
23pub mod base_layer_images;
24pub mod base_layer_images_impl;
25pub mod coordinates_impl;
26pub mod core;
27pub mod drawing_variant_impl;
28pub mod drawings;
29pub mod drawings_impl;
30pub mod guided_tours_impl;
31pub mod layer_impl;
32pub mod layers;
33pub mod map_collaborator_impl;
34pub mod map_impl;
35pub mod new_map_collaborator_impl;
36pub mod new_map_impl;
37pub mod new_seed_impl;
38pub mod page_impl;
39pub mod plantings;
40pub mod plantings_impl;
41pub mod plants_impl;
42pub mod seed_impl;
43pub mod timeline;
44pub mod update_map_geometry_impl;
45pub mod update_map_impl;
46
47#[typeshare]
49#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
50pub struct ConfigDto {
51 pub issuer_uri: String,
53 pub client_id: String,
55 pub version: String,
57}
58
59#[typeshare]
61#[derive(Serialize, Deserialize, ToSchema)]
62pub struct SeedDto {
63 pub id: i32,
65 pub name: String,
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub plant_id: Option<i32>,
70 pub harvest_year: i16,
72 pub quantity: Quantity,
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub use_by: Option<NaiveDate>,
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub origin: Option<String>,
80 #[serde(skip_serializing_if = "Option::is_none")]
82 pub taste: Option<String>,
83 #[serde(skip_serializing_if = "Option::is_none")]
85 pub yield_: Option<String>,
86 #[serde(skip_serializing_if = "Option::is_none")]
88 pub generation: Option<i16>,
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub quality: Option<Quality>,
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub price: Option<i16>,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub notes: Option<String>,
98 pub created_by: Uuid,
100 #[serde(skip_serializing_if = "Option::is_none")]
103 pub archived_at: Option<String>,
104}
105
106#[allow(clippy::missing_docs_in_private_items)] #[typeshare]
108#[derive(Serialize, Deserialize, ToSchema)]
109pub struct NewSeedDto {
110 pub name: String,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub plant_id: Option<i32>,
113 pub harvest_year: i16,
114 pub quantity: Quantity,
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub use_by: Option<NaiveDate>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub origin: Option<String>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub taste: Option<String>,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub yield_: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub generation: Option<i16>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub quality: Option<Quality>,
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub price: Option<i16>,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub notes: Option<String>,
131}
132
133#[typeshare]
135#[derive(Serialize, Deserialize, ToSchema)]
136pub struct ArchiveSeedDto {
137 pub archived: bool,
139}
140
141#[typeshare]
143#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
144pub struct PlantsSummaryDto {
145 pub id: i32,
147 pub unique_name: String,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub common_name_en: Option<Vec<Option<String>>>,
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub common_name_de: Option<Vec<Option<String>>>,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub spread: Option<i32>,
158 pub life_cycle: Vec<LifeCycle>,
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub herbaceous_or_woody: Option<HerbaceousOrWoody>,
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub has_drought_tolerance: Option<bool>,
165 #[serde(skip_serializing_if = "Option::is_none")]
166 pub hardiness_zone: Option<String>,
167 #[serde(skip_serializing_if = "Option::is_none")]
168 pub functions: Option<String>,
169 #[serde(skip_serializing_if = "Option::is_none")]
170 pub edible: Option<bool>,
171 pub edible_parts: Vec<Option<String>>,
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub warning: Option<String>,
174 pub sowing_outdoors: Vec<Option<i16>>,
175 pub harvest_time: Vec<Option<i16>>,
176 pub icon_path: Option<String>,
177}
178
179#[typeshare]
181#[derive(Debug, Deserialize, IntoParams)]
182pub struct PlantsSearchParameters {
183 #[serde(skip_serializing_if = "Option::is_none")]
185 pub name: Option<String>,
186}
187
188#[typeshare]
190#[derive(Debug, Deserialize, IntoParams)]
191pub struct RelationSearchParameters {
192 pub plant_id: i32,
194}
195
196#[typeshare]
198#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
199pub struct RelationsDto {
200 pub id: i32,
202 pub relations: Vec<RelationDto>,
204}
205
206#[typeshare]
208#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
209pub struct RelationDto {
210 pub id: i32,
212 pub relation: SpatialRelationType,
214}
215
216#[typeshare]
218#[derive(Debug, Deserialize, IntoParams)]
219pub struct SeedSearchParameters {
220 #[serde(skip_serializing_if = "Option::is_none")]
222 pub name: Option<String>,
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub harvest_year: Option<i16>,
226 #[serde(skip_serializing_if = "Option::is_none")]
229 pub archived: Option<IncludeArchivedSeeds>,
230}
231
232#[typeshare]
234#[derive(Debug, Deserialize, IntoParams)]
235pub struct PageParameters {
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub per_page: Option<i32>,
239 #[serde(skip_serializing_if = "Option::is_none")]
242 pub page: Option<i32>,
243}
244
245#[typeshare]
247#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
248#[aliases(
249 PagePlantsSummaryDto = Page<PlantsSummaryDto>,
250 PageSeedDto = Page<SeedDto>,
251 PageMapDto = Page<MapDto>,
252 PageLayerDto = Page<LayerDto>
253)]
254pub struct Page<T> {
255 pub results: Vec<T>,
257 pub page: i32,
259 pub per_page: i32,
261 pub total_pages: i32,
263}
264
265#[typeshare]
267#[derive(Serialize, Deserialize, ToSchema)]
268pub struct MapDto {
269 pub id: i32,
271 pub name: String,
273 pub created_at: NaiveDateTime,
275 pub modified_at: NaiveDateTime,
277 pub created_by: Uuid,
279 pub modified_by: Uuid,
281 #[serde(skip_serializing_if = "Option::is_none")]
283 pub deletion_date: Option<NaiveDate>,
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub last_visit: Option<NaiveDate>,
287 pub is_inactive: bool,
289 pub zoom_factor: i16,
291 pub privacy: PrivacyAccessControl,
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub description: Option<String>,
296 #[serde(skip_serializing_if = "Option::is_none")]
298 pub location: Option<Coordinates>,
299 #[typeshare(serialized_as = "object")]
303 #[schema(value_type = Object)]
304 pub geometry: Polygon<Point>,
305}
306
307#[typeshare]
309#[derive(Serialize, Deserialize, ToSchema)]
310pub struct NewMapDto {
311 pub name: String,
313 #[serde(skip_serializing_if = "Option::is_none")]
315 pub deletion_date: Option<NaiveDate>,
316 #[serde(skip_serializing_if = "Option::is_none")]
318 pub last_visit: Option<NaiveDate>,
319 pub is_inactive: bool,
321 pub zoom_factor: i16,
323 pub privacy: PrivacyAccessControl,
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub description: Option<String>,
328 #[serde(skip_serializing_if = "Option::is_none")]
330 pub location: Option<Coordinates>,
331 #[typeshare(serialized_as = "object")]
335 #[schema(value_type = Object)]
336 pub geometry: Polygon<Point>,
337}
338
339#[typeshare]
341#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
342pub struct UpdateMapDto {
343 #[serde(skip_serializing_if = "Option::is_none")]
345 pub name: Option<String>,
346 #[serde(skip_serializing_if = "Option::is_none")]
348 pub privacy: Option<PrivacyAccessControl>,
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub description: Option<String>,
352 #[serde(skip_serializing_if = "Option::is_none")]
354 pub location: Option<Coordinates>,
355}
356
357#[typeshare]
359#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
360pub struct UpdateMapGeometryDto {
361 #[typeshare(serialized_as = "object")]
365 #[schema(value_type = Object)]
366 pub geometry: Polygon<Point>,
367}
368
369#[typeshare]
371#[derive(Debug, Deserialize, IntoParams)]
372pub struct MapSearchParameters {
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub name: Option<String>,
376 #[serde(skip_serializing_if = "Option::is_none")]
378 pub is_inactive: Option<bool>,
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub created_by: Option<Uuid>,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub privacy: Option<PrivacyAccessControl>,
385}
386
387#[typeshare]
389#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
390pub struct Coordinates {
391 pub latitude: f64,
393 pub longitude: f64,
395}
396
397#[typeshare]
399#[derive(Debug, Deserialize, IntoParams)]
400pub struct ConnectToMapQueryParams {
401 pub map_id: i32,
403 pub user_id: String,
405}
406
407#[typeshare]
409#[derive(Debug, Deserialize, IntoParams)]
410pub struct HeatMapQueryParams {
411 pub plant_layer_id: Uuid,
413 pub shade_layer_id: Uuid,
415 pub hydrology_layer_id: Uuid,
417 pub soil_layer_id: Uuid,
419 pub plant_id: i32,
421 #[serde(skip_serializing_if = "Option::is_none")]
424 pub date: Option<NaiveDate>,
425}
426
427#[typeshare]
428#[derive(Serialize, Deserialize, ToSchema)]
429pub struct GuidedToursDto {
431 pub editor_tour_completed: bool,
433 pub editor_tour_paused: bool,
435}
436
437#[typeshare]
438#[derive(Serialize, Deserialize, ToSchema)]
439pub struct UpdateGuidedToursDto {
441 #[serde(skip_serializing_if = "Option::is_none")]
443 pub editor_tour_completed: Option<bool>,
444 #[serde(skip_serializing_if = "Option::is_none")]
446 pub editor_tour_paused: Option<bool>,
447}
448
449#[typeshare]
451#[derive(Serialize, Deserialize, ToSchema)]
452pub struct ApplicationSettingDto {
453 pub id: i32,
455 pub key: String,
457 pub value: String,
459}
460
461#[typeshare]
462#[derive(Debug, Serialize, ToSchema)]
463#[serde(rename_all = "camelCase")]
464pub struct MapCollaboratorDto {
466 pub map_id: i32,
468 pub user_id: Uuid,
470 pub username: String,
472}
473
474#[typeshare]
475#[derive(Debug, Deserialize, ToSchema)]
476#[serde(rename_all = "camelCase")]
477pub struct NewMapCollaboratorDto {
479 pub user_id: Uuid,
481}
482
483#[typeshare]
484#[derive(Debug, Serialize, Deserialize, ToSchema)]
485#[serde(rename_all = "camelCase")]
486pub struct DeleteMapCollaboratorDto {
487 pub user_id: Uuid,
489}
490
491#[typeshare]
492#[derive(Debug, Deserialize, IntoParams)]
493#[serde(rename_all = "camelCase")]
494pub struct MapCollaboratorSearchParameters {
496 pub map_id: i32,
498}
499
500#[typeshare]
501#[derive(Debug, Deserialize, IntoParams)]
502#[serde(rename_all = "camelCase")]
503pub struct UserSearchParameters {
505 pub username: String,
507}