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, light_requirement::LightRequirement,
16 privacy_access_control::PrivacyAccessControl, quality::Quality, quantity::Quantity,
17 shade::Shade, soil_texture::SoilTextureEnum, spatial_relation_type::SpatialRelationType,
18 water_requirement::WaterRequirementEnum,
19};
20
21pub mod actions;
22pub mod application_settings_impl;
23pub mod areas;
24pub mod areas_impl;
25pub mod base_layer_images;
26pub mod base_layer_images_impl;
27pub mod coordinates_impl;
28pub mod core;
29pub mod drawing_variant_impl;
30pub mod drawings;
31pub mod drawings_impl;
32pub mod guided_tour_impl;
33pub mod layer_impl;
34pub mod layers;
35pub mod map_collaborator_impl;
36pub mod map_impl;
37pub mod new_map_collaborator_impl;
38pub mod new_map_impl;
39pub mod new_seed_impl;
40pub mod page_impl;
41pub mod plantings;
42pub mod plantings_impl;
43pub mod plants_impl;
44pub mod seed_impl;
45pub mod timeline;
46pub mod update_map_geometry_impl;
47pub mod update_map_impl;
48
49#[typeshare]
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
52pub struct ConfigDto {
53 pub issuer_uri: String,
55 pub client_id: String,
57 pub version: String,
59}
60
61#[typeshare]
63#[derive(Serialize, Deserialize, ToSchema)]
64pub struct SeedDto {
65 pub id: i32,
67 pub name: String,
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub plant_id: Option<i32>,
72 pub harvest_year: i16,
74 pub quantity: Quantity,
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub use_by: Option<NaiveDate>,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub origin: Option<String>,
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub taste: Option<String>,
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub yield_: Option<String>,
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub generation: Option<i16>,
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub quality: Option<Quality>,
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub price: Option<i16>,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 pub notes: Option<String>,
100 pub created_by: Uuid,
102 #[serde(skip_serializing_if = "Option::is_none")]
105 pub archived_at: Option<String>,
106}
107
108#[allow(clippy::missing_docs_in_private_items)] #[typeshare]
110#[derive(Serialize, Deserialize, ToSchema)]
111pub struct NewSeedDto {
112 pub name: String,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub plant_id: Option<i32>,
115 pub harvest_year: i16,
116 pub quantity: Quantity,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub use_by: Option<NaiveDate>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub origin: Option<String>,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub taste: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub yield_: Option<String>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub generation: Option<i16>,
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub quality: Option<Quality>,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub price: Option<i16>,
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub notes: Option<String>,
133}
134
135#[typeshare]
137#[derive(Serialize, Deserialize, ToSchema)]
138pub struct ArchiveSeedDto {
139 pub archived: bool,
141}
142
143#[typeshare]
145#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
146pub struct PlantsSummaryDto {
147 pub id: i32,
149 pub unique_name: String,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub common_name_en: Option<Vec<Option<String>>>,
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub common_name_de: Option<Vec<Option<String>>>,
157 #[serde(skip_serializing_if = "Option::is_none")]
159 pub plant_family: Option<String>,
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub spread: Option<i32>,
163 pub life_cycle: Vec<LifeCycle>,
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub herbaceous_or_woody: Option<HerbaceousOrWoody>,
168 #[serde(skip_serializing_if = "Option::is_none")]
169 pub has_drought_tolerance: Option<bool>,
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub hardiness_zone: Option<String>,
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub functions: Option<String>,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 pub edible: Option<bool>,
176 pub edible_parts: Vec<Option<String>>,
177 #[serde(skip_serializing_if = "Option::is_none")]
178 pub warning: Option<String>,
179 pub sowing_outdoors: Vec<Option<i16>>,
180 pub harvest_time: Vec<Option<i16>>,
181 pub icon_path: Option<String>,
182 pub soil_texture: Option<Vec<Option<SoilTextureEnum>>>,
183 pub shade: Option<Shade>,
184 pub light_requirement: Option<Vec<Option<LightRequirement>>>,
185 pub water_requirement: Option<Vec<Option<WaterRequirementEnum>>>,
186}
187
188#[typeshare]
190#[derive(Debug, Deserialize, IntoParams)]
191pub struct PlantsSearchParameters {
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub name: Option<String>,
195}
196
197#[typeshare]
199#[derive(Debug, Deserialize, IntoParams)]
200pub struct RelationSearchParameters {
201 pub plant_id: i32,
203}
204
205#[typeshare]
207#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
208pub struct RelationsDto {
209 pub id: i32,
211 pub relations: Vec<RelationDto>,
213}
214
215#[typeshare]
217#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
218pub struct RelationDto {
219 pub id: i32,
221 pub relation: SpatialRelationType,
223}
224
225#[typeshare]
227#[derive(Debug, Deserialize, IntoParams)]
228pub struct SeedSearchParameters {
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub name: Option<String>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub harvest_year: Option<i16>,
235 #[serde(skip_serializing_if = "Option::is_none")]
238 pub archived: Option<IncludeArchivedSeeds>,
239}
240
241#[typeshare]
243#[derive(Debug, Deserialize, IntoParams)]
244pub struct PageParameters {
245 #[serde(skip_serializing_if = "Option::is_none")]
247 pub per_page: Option<i32>,
248 #[serde(skip_serializing_if = "Option::is_none")]
251 pub page: Option<i32>,
252}
253
254#[typeshare]
256#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
257#[aliases(
258 PagePlantsSummaryDto = Page<PlantsSummaryDto>,
259 PageSeedDto = Page<SeedDto>,
260 PageMapDto = Page<MapDto>,
261 PageLayerDto = Page<LayerDto>
262)]
263pub struct Page<T> {
264 pub results: Vec<T>,
266 pub page: i32,
268 pub per_page: i32,
270 pub total_pages: i32,
272}
273
274#[typeshare]
276#[derive(Serialize, Deserialize, ToSchema)]
277pub struct MapDto {
278 pub id: i32,
280 pub name: String,
282 pub created_at: NaiveDateTime,
284 pub modified_at: NaiveDateTime,
286 pub created_by: Uuid,
288 pub modified_by: Uuid,
290 #[serde(skip_serializing_if = "Option::is_none")]
292 pub deletion_date: Option<NaiveDate>,
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub last_visit: Option<NaiveDate>,
296 pub is_inactive: bool,
298 pub zoom_factor: i16,
300 pub privacy: PrivacyAccessControl,
302 #[serde(skip_serializing_if = "Option::is_none")]
304 pub description: Option<String>,
305 #[serde(skip_serializing_if = "Option::is_none")]
307 pub location: Option<Coordinates>,
308 #[typeshare(serialized_as = "object")]
312 #[schema(value_type = Object)]
313 pub geometry: Polygon<Point>,
314}
315
316#[typeshare]
318#[derive(Serialize, Deserialize, ToSchema)]
319pub struct NewMapDto {
320 pub name: String,
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub deletion_date: Option<NaiveDate>,
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub last_visit: Option<NaiveDate>,
328 pub is_inactive: bool,
330 pub zoom_factor: i16,
332 pub privacy: PrivacyAccessControl,
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub description: Option<String>,
337 #[serde(skip_serializing_if = "Option::is_none")]
339 pub location: Option<Coordinates>,
340 #[typeshare(serialized_as = "object")]
344 #[schema(value_type = Object)]
345 pub geometry: Polygon<Point>,
346}
347
348#[typeshare]
350#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
351pub struct UpdateMapDto {
352 #[serde(skip_serializing_if = "Option::is_none")]
354 pub name: Option<String>,
355 #[serde(skip_serializing_if = "Option::is_none")]
357 pub privacy: Option<PrivacyAccessControl>,
358 #[serde(skip_serializing_if = "Option::is_none")]
360 pub description: Option<String>,
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub location: Option<Coordinates>,
364}
365
366#[typeshare]
368#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
369pub struct UpdateMapGeometryDto {
370 #[typeshare(serialized_as = "object")]
374 #[schema(value_type = Object)]
375 pub geometry: Polygon<Point>,
376}
377
378#[typeshare]
380#[derive(Debug, Deserialize, IntoParams)]
381pub struct MapSearchParameters {
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub name: Option<String>,
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 GuidedTourDto {
431 pub completed_steps: Vec<String>,
433 pub paused: bool,
435}
436
437#[typeshare]
438#[derive(Serialize, Deserialize, ToSchema)]
439pub struct CompleteGuidedTourStepDto {
441 pub step_key: String,
443}
444
445#[typeshare]
446#[derive(Serialize, Deserialize, ToSchema)]
447pub struct CompleteGuidedTourStepsDto {
449 pub step_keys: Vec<String>,
451}
452
453#[typeshare]
455#[derive(Serialize, Deserialize, ToSchema)]
456pub struct ApplicationSettingDto {
457 pub id: i32,
459 pub key: String,
461 pub value: String,
463}
464
465#[typeshare]
466#[derive(Debug, Serialize, ToSchema)]
467#[serde(rename_all = "camelCase")]
468pub struct MapCollaboratorDto {
470 pub map_id: i32,
472 pub user_id: Uuid,
474 pub username: String,
476}
477
478#[typeshare]
479#[derive(Debug, Deserialize, ToSchema)]
480#[serde(rename_all = "camelCase")]
481pub struct NewMapCollaboratorDto {
483 pub user_id: Uuid,
485}
486
487#[typeshare]
488#[derive(Debug, Serialize, Deserialize, ToSchema)]
489#[serde(rename_all = "camelCase")]
490pub struct DeleteMapCollaboratorDto {
491 pub user_id: Uuid,
493}
494
495#[typeshare]
496#[derive(Debug, Deserialize, IntoParams)]
497#[serde(rename_all = "camelCase")]
498pub struct MapCollaboratorSearchParameters {
500 pub map_id: i32,
502}
503
504#[typeshare]
505#[derive(Debug, Deserialize, IntoParams)]
506#[serde(rename_all = "camelCase")]
507pub struct UserSearchParameters {
509 pub username: String,
511}