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 pub icon_path: Option<String>,
171}
172
173#[typeshare]
175#[derive(Debug, Deserialize, IntoParams)]
176pub struct PlantsSearchParameters {
177 #[serde(skip_serializing_if = "Option::is_none")]
179 pub name: Option<String>,
180}
181
182#[typeshare]
184#[derive(Debug, Deserialize, IntoParams)]
185pub struct RelationSearchParameters {
186 pub plant_id: i32,
188}
189
190#[typeshare]
192#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
193pub struct RelationsDto {
194 pub id: i32,
196 pub relations: Vec<RelationDto>,
198}
199
200#[typeshare]
202#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
203pub struct RelationDto {
204 pub id: i32,
206 pub relation: SpatialRelationType,
208}
209
210#[typeshare]
212#[derive(Debug, Deserialize, IntoParams)]
213pub struct SeedSearchParameters {
214 #[serde(skip_serializing_if = "Option::is_none")]
216 pub name: Option<String>,
217 #[serde(skip_serializing_if = "Option::is_none")]
219 pub harvest_year: Option<i16>,
220 #[serde(skip_serializing_if = "Option::is_none")]
223 pub archived: Option<IncludeArchivedSeeds>,
224}
225
226#[typeshare]
228#[derive(Debug, Deserialize, IntoParams)]
229pub struct PageParameters {
230 #[serde(skip_serializing_if = "Option::is_none")]
232 pub per_page: Option<i32>,
233 #[serde(skip_serializing_if = "Option::is_none")]
236 pub page: Option<i32>,
237}
238
239#[typeshare]
241#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
242#[aliases(
243 PagePlantsSummaryDto = Page<PlantsSummaryDto>,
244 PageSeedDto = Page<SeedDto>,
245 PageMapDto = Page<MapDto>,
246 PageLayerDto = Page<LayerDto>
247)]
248pub struct Page<T> {
249 pub results: Vec<T>,
251 pub page: i32,
253 pub per_page: i32,
255 pub total_pages: i32,
257}
258
259#[typeshare]
261#[derive(Serialize, Deserialize, ToSchema)]
262pub struct MapDto {
263 pub id: i32,
265 pub name: String,
267 pub created_at: NaiveDateTime,
269 pub modified_at: NaiveDateTime,
271 pub created_by: Uuid,
273 pub modified_by: Uuid,
275 #[serde(skip_serializing_if = "Option::is_none")]
277 pub deletion_date: Option<NaiveDate>,
278 #[serde(skip_serializing_if = "Option::is_none")]
280 pub last_visit: Option<NaiveDate>,
281 pub is_inactive: bool,
283 pub zoom_factor: i16,
285 pub honors: i16,
287 pub visits: i16,
289 pub harvested: i16,
291 pub privacy: PrivacyOption,
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 honors: i16,
325 pub visits: i16,
327 pub harvested: i16,
329 pub privacy: PrivacyOption,
331 #[serde(skip_serializing_if = "Option::is_none")]
333 pub description: Option<String>,
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub location: Option<Coordinates>,
337 #[typeshare(serialized_as = "object")]
341 #[schema(value_type = Object)]
342 pub geometry: Polygon<Point>,
343}
344
345#[typeshare]
347#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
348pub struct UpdateMapDto {
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub name: Option<String>,
352 #[serde(skip_serializing_if = "Option::is_none")]
354 pub privacy: Option<PrivacyOption>,
355 #[serde(skip_serializing_if = "Option::is_none")]
357 pub description: Option<String>,
358 #[serde(skip_serializing_if = "Option::is_none")]
360 pub location: Option<Coordinates>,
361}
362
363#[typeshare]
365#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
366pub struct UpdateMapGeometryDto {
367 #[typeshare(serialized_as = "object")]
371 #[schema(value_type = Object)]
372 pub geometry: Polygon<Point>,
373}
374
375#[typeshare]
377#[derive(Debug, Deserialize, IntoParams)]
378pub struct MapSearchParameters {
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub name: Option<String>,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub is_inactive: Option<bool>,
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub created_by: Option<Uuid>,
388 #[serde(skip_serializing_if = "Option::is_none")]
390 pub privacy: Option<PrivacyOption>,
391}
392
393#[typeshare]
395#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
396pub struct Coordinates {
397 pub latitude: f64,
399 pub longitude: f64,
401}
402
403#[typeshare]
405#[derive(Debug, Deserialize, IntoParams)]
406pub struct ConnectToMapQueryParams {
407 pub map_id: i32,
409 pub user_id: String,
411}
412
413#[typeshare]
415#[derive(Debug, Deserialize, IntoParams)]
416pub struct HeatMapQueryParams {
417 pub plant_layer_id: Uuid,
419 pub shade_layer_id: Uuid,
421 pub hydrology_layer_id: Uuid,
423 pub soil_layer_id: Uuid,
425 pub plant_id: i32,
427 #[serde(skip_serializing_if = "Option::is_none")]
430 pub date: Option<NaiveDate>,
431}
432
433#[typeshare]
434#[derive(Serialize, Deserialize, ToSchema)]
435pub struct UsersDto {
437 pub salutation: Salutation,
439 #[serde(skip_serializing_if = "Option::is_none")]
441 pub title: Option<String>,
442 pub country: String,
444 #[serde(skip_serializing_if = "Option::is_none")]
446 pub phone: Option<String>,
447 #[serde(skip_serializing_if = "Option::is_none")]
449 pub website: Option<String>,
450 #[serde(skip_serializing_if = "Option::is_none")]
452 pub organization: Option<String>,
453 #[serde(skip_serializing_if = "Option::is_none")]
455 pub experience: Option<Experience>,
456 #[serde(skip_serializing_if = "Option::is_none")]
458 pub membership: Option<Membership>,
459 #[serde(skip_serializing_if = "Option::is_none")]
461 pub member_years: Option<Vec<Option<i32>>>,
462 #[serde(skip_serializing_if = "Option::is_none")]
464 pub member_since: Option<NaiveDate>,
465 #[serde(skip_serializing_if = "Option::is_none")]
467 pub permacoins: Option<Vec<Option<i32>>>,
468}
469
470#[typeshare]
471#[derive(Serialize, Deserialize, ToSchema)]
472pub struct GuidedToursDto {
474 pub editor_tour_completed: bool,
476}
477
478#[typeshare]
479#[derive(Serialize, Deserialize, ToSchema)]
480pub struct UpdateGuidedToursDto {
482 #[serde(skip_serializing_if = "Option::is_none")]
484 pub editor_tour_completed: Option<bool>,
485}
486
487#[typeshare]
488#[derive(Serialize, Deserialize, ToSchema)]
489pub struct GainedBlossomsDto {
491 pub blossom: String,
493 pub times_gained: i32,
495 pub gained_date: NaiveDate,
497}
498
499#[typeshare]
501#[derive(Serialize, Deserialize, ToSchema)]
502pub struct ApplicationSettingDto {
503 pub id: i32,
505 pub key: String,
507 pub value: String,
509}
510
511#[typeshare]
512#[derive(Debug, Serialize, ToSchema)]
513#[serde(rename_all = "camelCase")]
514pub struct MapCollaboratorDto {
516 pub map_id: i32,
518 pub user_id: Uuid,
520 pub username: String,
522}
523
524#[typeshare]
525#[derive(Debug, Deserialize, ToSchema)]
526#[serde(rename_all = "camelCase")]
527pub struct NewMapCollaboratorDto {
529 pub user_id: Uuid,
531}
532
533#[typeshare]
534#[derive(Debug, Serialize, Deserialize, ToSchema)]
535#[serde(rename_all = "camelCase")]
536pub struct DeleteMapCollaboratorDto {
537 pub user_id: Uuid,
539}
540
541#[typeshare]
542#[derive(Debug, Deserialize, IntoParams)]
543#[serde(rename_all = "camelCase")]
544pub struct MapCollaboratorSearchParameters {
546 pub map_id: i32,
548}
549
550#[typeshare]
551#[derive(Debug, Deserialize, IntoParams)]
552#[serde(rename_all = "camelCase")]
553pub struct UserSearchParameters {
555 pub username: String,
557}