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 experience::Experience, include_archived_seeds::IncludeArchivedSeeds, life_cycle::LifeCycle,
15 membership::Membership, privacy_option::PrivacyOption, quality::Quality, quantity::Quantity,
16 salutation::Salutation, 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 blossoms_impl;
26pub mod coordinates_impl;
27pub mod core;
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;
46pub mod users_impl;
47
48#[typeshare]
50#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
51pub struct ConfigDto {
52 pub issuer_uri: String,
54 pub client_id: String,
56 pub version: String,
58}
59
60#[typeshare]
62#[derive(Serialize, Deserialize, ToSchema)]
63pub struct SeedDto {
64 pub id: i32,
66 pub name: String,
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub plant_id: Option<i32>,
71 pub harvest_year: i16,
73 pub quantity: Quantity,
75 #[serde(skip_serializing_if = "Option::is_none")]
77 pub use_by: Option<NaiveDate>,
78 #[serde(skip_serializing_if = "Option::is_none")]
80 pub origin: Option<String>,
81 #[serde(skip_serializing_if = "Option::is_none")]
83 pub taste: Option<String>,
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub yield_: Option<String>,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub generation: Option<i16>,
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub quality: Option<Quality>,
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub price: Option<i16>,
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub notes: Option<String>,
99 pub created_by: Uuid,
101 #[serde(skip_serializing_if = "Option::is_none")]
104 pub archived_at: Option<String>,
105}
106
107#[allow(clippy::missing_docs_in_private_items)] #[typeshare]
109#[derive(Serialize, Deserialize, ToSchema)]
110pub struct NewSeedDto {
111 pub name: String,
112 #[serde(skip_serializing_if = "Option::is_none")]
113 pub plant_id: Option<i32>,
114 pub harvest_year: i16,
115 pub quantity: Quantity,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub use_by: Option<NaiveDate>,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub origin: Option<String>,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub taste: Option<String>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub yield_: Option<String>,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub generation: Option<i16>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub quality: Option<Quality>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub price: Option<i16>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub notes: Option<String>,
132}
133
134#[typeshare]
136#[derive(Serialize, Deserialize, ToSchema)]
137pub struct ArchiveSeedDto {
138 pub archived: bool,
140}
141
142#[typeshare]
144#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
145pub struct PlantsSummaryDto {
146 pub id: i32,
148 pub unique_name: String,
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub common_name_en: Option<Vec<Option<String>>>,
153 #[serde(skip_serializing_if = "Option::is_none")]
155 pub common_name_de: Option<Vec<Option<String>>>,
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub spread: Option<i32>,
159 pub life_cycle: Vec<LifeCycle>,
161 #[serde(skip_serializing_if = "Option::is_none")]
162 pub functions: Option<String>,
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub edible: Option<bool>,
165 pub edible_parts: Vec<Option<String>>,
166 #[serde(skip_serializing_if = "Option::is_none")]
167 pub warning: Option<String>,
168 pub sowing_outdoors: Vec<Option<i16>>,
169 pub harvest_time: Vec<Option<i16>>,
170}
171
172#[typeshare]
174#[derive(Debug, Deserialize, IntoParams)]
175pub struct PlantsSearchParameters {
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub name: Option<String>,
179}
180
181#[typeshare]
183#[derive(Debug, Deserialize, IntoParams)]
184pub struct RelationSearchParameters {
185 pub plant_id: i32,
187}
188
189#[typeshare]
191#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
192pub struct RelationsDto {
193 pub id: i32,
195 pub relations: Vec<RelationDto>,
197}
198
199#[typeshare]
201#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
202pub struct RelationDto {
203 pub id: i32,
205 pub relation: SpatialRelationType,
207}
208
209#[typeshare]
211#[derive(Debug, Deserialize, IntoParams)]
212pub struct SeedSearchParameters {
213 #[serde(skip_serializing_if = "Option::is_none")]
215 pub name: Option<String>,
216 #[serde(skip_serializing_if = "Option::is_none")]
218 pub harvest_year: Option<i16>,
219 #[serde(skip_serializing_if = "Option::is_none")]
222 pub archived: Option<IncludeArchivedSeeds>,
223}
224
225#[typeshare]
227#[derive(Debug, Deserialize, IntoParams)]
228pub struct PageParameters {
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub per_page: Option<i32>,
232 #[serde(skip_serializing_if = "Option::is_none")]
235 pub page: Option<i32>,
236}
237
238#[typeshare]
240#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
241#[aliases(
242 PagePlantsSummaryDto = Page<PlantsSummaryDto>,
243 PageSeedDto = Page<SeedDto>,
244 PageMapDto = Page<MapDto>,
245 PageLayerDto = Page<LayerDto>
246)]
247pub struct Page<T> {
248 pub results: Vec<T>,
250 pub page: i32,
252 pub per_page: i32,
254 pub total_pages: i32,
256}
257
258#[typeshare]
260#[derive(Serialize, Deserialize, ToSchema)]
261pub struct MapDto {
262 pub id: i32,
264 pub name: String,
266 pub created_at: NaiveDateTime,
268 pub modified_at: NaiveDateTime,
270 pub created_by: Uuid,
272 pub modified_by: Uuid,
274 #[serde(skip_serializing_if = "Option::is_none")]
276 pub deletion_date: Option<NaiveDate>,
277 #[serde(skip_serializing_if = "Option::is_none")]
279 pub last_visit: Option<NaiveDate>,
280 pub is_inactive: bool,
282 pub zoom_factor: i16,
284 pub honors: i16,
286 pub visits: i16,
288 pub harvested: i16,
290 pub privacy: PrivacyOption,
292 #[serde(skip_serializing_if = "Option::is_none")]
294 pub description: Option<String>,
295 #[serde(skip_serializing_if = "Option::is_none")]
297 pub location: Option<Coordinates>,
298 #[typeshare(serialized_as = "object")]
302 #[schema(value_type = Object)]
303 pub geometry: Polygon<Point>,
304}
305
306#[typeshare]
308#[derive(Serialize, Deserialize, ToSchema)]
309pub struct NewMapDto {
310 pub name: String,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub deletion_date: Option<NaiveDate>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub last_visit: Option<NaiveDate>,
318 pub is_inactive: bool,
320 pub zoom_factor: i16,
322 pub honors: i16,
324 pub visits: i16,
326 pub harvested: i16,
328 pub privacy: PrivacyOption,
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub description: Option<String>,
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub location: Option<Coordinates>,
336 #[typeshare(serialized_as = "object")]
340 #[schema(value_type = Object)]
341 pub geometry: Polygon<Point>,
342}
343
344#[typeshare]
346#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
347pub struct UpdateMapDto {
348 #[serde(skip_serializing_if = "Option::is_none")]
350 pub name: Option<String>,
351 #[serde(skip_serializing_if = "Option::is_none")]
353 pub privacy: Option<PrivacyOption>,
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub description: Option<String>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub location: Option<Coordinates>,
360}
361
362#[typeshare]
364#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
365pub struct UpdateMapGeometryDto {
366 #[typeshare(serialized_as = "object")]
370 #[schema(value_type = Object)]
371 pub geometry: Polygon<Point>,
372}
373
374#[typeshare]
376#[derive(Debug, Deserialize, IntoParams)]
377pub struct MapSearchParameters {
378 #[serde(skip_serializing_if = "Option::is_none")]
380 pub name: Option<String>,
381 #[serde(skip_serializing_if = "Option::is_none")]
383 pub is_inactive: Option<bool>,
384 #[serde(skip_serializing_if = "Option::is_none")]
386 pub created_by: Option<Uuid>,
387 #[serde(skip_serializing_if = "Option::is_none")]
389 pub privacy: Option<PrivacyOption>,
390}
391
392#[typeshare]
394#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
395pub struct Coordinates {
396 pub latitude: f64,
398 pub longitude: f64,
400}
401
402#[typeshare]
404#[derive(Debug, Deserialize, IntoParams)]
405pub struct ConnectToMapQueryParams {
406 pub map_id: i32,
408 pub user_id: String,
410}
411
412#[typeshare]
414#[derive(Debug, Deserialize, IntoParams)]
415pub struct HeatMapQueryParams {
416 pub plant_layer_id: Uuid,
418 pub shade_layer_id: Uuid,
420 pub hydrology_layer_id: Uuid,
422 pub soil_layer_id: Uuid,
424 pub plant_id: i32,
426 #[serde(skip_serializing_if = "Option::is_none")]
429 pub date: Option<NaiveDate>,
430}
431
432#[typeshare]
433#[derive(Serialize, Deserialize, ToSchema)]
434pub struct UsersDto {
436 pub salutation: Salutation,
438 #[serde(skip_serializing_if = "Option::is_none")]
440 pub title: Option<String>,
441 pub country: String,
443 #[serde(skip_serializing_if = "Option::is_none")]
445 pub phone: Option<String>,
446 #[serde(skip_serializing_if = "Option::is_none")]
448 pub website: Option<String>,
449 #[serde(skip_serializing_if = "Option::is_none")]
451 pub organization: Option<String>,
452 #[serde(skip_serializing_if = "Option::is_none")]
454 pub experience: Option<Experience>,
455 #[serde(skip_serializing_if = "Option::is_none")]
457 pub membership: Option<Membership>,
458 #[serde(skip_serializing_if = "Option::is_none")]
460 pub member_years: Option<Vec<Option<i32>>>,
461 #[serde(skip_serializing_if = "Option::is_none")]
463 pub member_since: Option<NaiveDate>,
464 #[serde(skip_serializing_if = "Option::is_none")]
466 pub permacoins: Option<Vec<Option<i32>>>,
467}
468
469#[typeshare]
470#[derive(Serialize, Deserialize, ToSchema)]
471pub struct GuidedToursDto {
473 pub editor_tour_completed: bool,
475}
476
477#[typeshare]
478#[derive(Serialize, Deserialize, ToSchema)]
479pub struct UpdateGuidedToursDto {
481 #[serde(skip_serializing_if = "Option::is_none")]
483 pub editor_tour_completed: Option<bool>,
484}
485
486#[typeshare]
487#[derive(Serialize, Deserialize, ToSchema)]
488pub struct GainedBlossomsDto {
490 pub blossom: String,
492 pub times_gained: i32,
494 pub gained_date: NaiveDate,
496}
497
498#[typeshare]
500#[derive(Serialize, Deserialize, ToSchema)]
501pub struct ApplicationSettingDto {
502 pub id: i32,
504 pub key: String,
506 pub value: String,
508}
509
510#[typeshare]
511#[derive(Debug, Serialize, ToSchema)]
512#[serde(rename_all = "camelCase")]
513pub struct MapCollaboratorDto {
515 pub map_id: i32,
517 pub user_id: Uuid,
519 pub username: String,
521}
522
523#[typeshare]
524#[derive(Debug, Deserialize, ToSchema)]
525#[serde(rename_all = "camelCase")]
526pub struct NewMapCollaboratorDto {
528 pub user_id: Uuid,
530}
531
532#[typeshare]
533#[derive(Debug, Serialize, Deserialize, ToSchema)]
534#[serde(rename_all = "camelCase")]
535pub struct DeleteMapCollaboratorDto {
536 pub user_id: Uuid,
538}
539
540#[typeshare]
541#[derive(Debug, Deserialize, IntoParams)]
542#[serde(rename_all = "camelCase")]
543pub struct MapCollaboratorSearchParameters {
545 pub map_id: i32,
547}
548
549#[typeshare]
550#[derive(Debug, Deserialize, IntoParams)]
551#[serde(rename_all = "camelCase")]
552pub struct UserSearchParameters {
554 pub username: String,
556}