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, herbaceous_or_woody::HerbaceousOrWoody,
15 include_archived_seeds::IncludeArchivedSeeds, life_cycle::LifeCycle, membership::Membership,
16 privacy_option::PrivacyOption, quality::Quality, quantity::Quantity, salutation::Salutation,
17 spatial_relation_type::SpatialRelationType,
18};
19
20pub mod actions;
21pub mod application_settings_impl;
22pub mod areas;
23pub mod areas_impl;
24pub mod base_layer_images;
25pub mod base_layer_images_impl;
26pub mod blossoms_impl;
27pub mod coordinates_impl;
28pub mod core;
29pub mod drawings;
30pub mod drawings_impl;
31pub mod guided_tours_impl;
32pub mod layer_impl;
33pub mod layers;
34pub mod map_collaborator_impl;
35pub mod map_impl;
36pub mod new_map_collaborator_impl;
37pub mod new_map_impl;
38pub mod new_seed_impl;
39pub mod page_impl;
40pub mod plantings;
41pub mod plantings_impl;
42pub mod plants_impl;
43pub mod seed_impl;
44pub mod timeline;
45pub mod update_map_geometry_impl;
46pub mod update_map_impl;
47pub mod users_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 spread: Option<i32>,
160 pub life_cycle: Vec<LifeCycle>,
162 #[serde(skip_serializing_if = "Option::is_none")]
164 pub herbaceous_or_woody: Option<HerbaceousOrWoody>,
165 #[serde(skip_serializing_if = "Option::is_none")]
166 pub has_drought_tolerance: Option<bool>,
167 #[serde(skip_serializing_if = "Option::is_none")]
168 pub hardiness_zone: Option<String>,
169 #[serde(skip_serializing_if = "Option::is_none")]
170 pub functions: Option<String>,
171 #[serde(skip_serializing_if = "Option::is_none")]
172 pub edible: Option<bool>,
173 pub edible_parts: Vec<Option<String>>,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 pub warning: Option<String>,
176 pub sowing_outdoors: Vec<Option<i16>>,
177 pub harvest_time: Vec<Option<i16>>,
178 pub icon_path: Option<String>,
179}
180
181#[typeshare]
183#[derive(Debug, Deserialize, IntoParams)]
184pub struct PlantsSearchParameters {
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub name: Option<String>,
188}
189
190#[typeshare]
192#[derive(Debug, Deserialize, IntoParams)]
193pub struct RelationSearchParameters {
194 pub plant_id: i32,
196}
197
198#[typeshare]
200#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
201pub struct RelationsDto {
202 pub id: i32,
204 pub relations: Vec<RelationDto>,
206}
207
208#[typeshare]
210#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
211pub struct RelationDto {
212 pub id: i32,
214 pub relation: SpatialRelationType,
216}
217
218#[typeshare]
220#[derive(Debug, Deserialize, IntoParams)]
221pub struct SeedSearchParameters {
222 #[serde(skip_serializing_if = "Option::is_none")]
224 pub name: Option<String>,
225 #[serde(skip_serializing_if = "Option::is_none")]
227 pub harvest_year: Option<i16>,
228 #[serde(skip_serializing_if = "Option::is_none")]
231 pub archived: Option<IncludeArchivedSeeds>,
232}
233
234#[typeshare]
236#[derive(Debug, Deserialize, IntoParams)]
237pub struct PageParameters {
238 #[serde(skip_serializing_if = "Option::is_none")]
240 pub per_page: Option<i32>,
241 #[serde(skip_serializing_if = "Option::is_none")]
244 pub page: Option<i32>,
245}
246
247#[typeshare]
249#[derive(Debug, Serialize, PartialEq, Eq, Deserialize, ToSchema)]
250#[aliases(
251 PagePlantsSummaryDto = Page<PlantsSummaryDto>,
252 PageSeedDto = Page<SeedDto>,
253 PageMapDto = Page<MapDto>,
254 PageLayerDto = Page<LayerDto>
255)]
256pub struct Page<T> {
257 pub results: Vec<T>,
259 pub page: i32,
261 pub per_page: i32,
263 pub total_pages: i32,
265}
266
267#[typeshare]
269#[derive(Serialize, Deserialize, ToSchema)]
270pub struct MapDto {
271 pub id: i32,
273 pub name: String,
275 pub created_at: NaiveDateTime,
277 pub modified_at: NaiveDateTime,
279 pub created_by: Uuid,
281 pub modified_by: Uuid,
283 #[serde(skip_serializing_if = "Option::is_none")]
285 pub deletion_date: Option<NaiveDate>,
286 #[serde(skip_serializing_if = "Option::is_none")]
288 pub last_visit: Option<NaiveDate>,
289 pub is_inactive: bool,
291 pub zoom_factor: i16,
293 pub honors: i16,
295 pub visits: i16,
297 pub harvested: i16,
299 pub privacy: PrivacyOption,
301 #[serde(skip_serializing_if = "Option::is_none")]
303 pub description: Option<String>,
304 #[serde(skip_serializing_if = "Option::is_none")]
306 pub location: Option<Coordinates>,
307 #[typeshare(serialized_as = "object")]
311 #[schema(value_type = Object)]
312 pub geometry: Polygon<Point>,
313}
314
315#[typeshare]
317#[derive(Serialize, Deserialize, ToSchema)]
318pub struct NewMapDto {
319 pub name: String,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub deletion_date: Option<NaiveDate>,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub last_visit: Option<NaiveDate>,
327 pub is_inactive: bool,
329 pub zoom_factor: i16,
331 pub honors: i16,
333 pub visits: i16,
335 pub harvested: i16,
337 pub privacy: PrivacyOption,
339 #[serde(skip_serializing_if = "Option::is_none")]
341 pub description: Option<String>,
342 #[serde(skip_serializing_if = "Option::is_none")]
344 pub location: Option<Coordinates>,
345 #[typeshare(serialized_as = "object")]
349 #[schema(value_type = Object)]
350 pub geometry: Polygon<Point>,
351}
352
353#[typeshare]
355#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
356pub struct UpdateMapDto {
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub name: Option<String>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub privacy: Option<PrivacyOption>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub description: Option<String>,
366 #[serde(skip_serializing_if = "Option::is_none")]
368 pub location: Option<Coordinates>,
369}
370
371#[typeshare]
373#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
374pub struct UpdateMapGeometryDto {
375 #[typeshare(serialized_as = "object")]
379 #[schema(value_type = Object)]
380 pub geometry: Polygon<Point>,
381}
382
383#[typeshare]
385#[derive(Debug, Deserialize, IntoParams)]
386pub struct MapSearchParameters {
387 #[serde(skip_serializing_if = "Option::is_none")]
389 pub name: Option<String>,
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub is_inactive: Option<bool>,
393 #[serde(skip_serializing_if = "Option::is_none")]
395 pub created_by: Option<Uuid>,
396 #[serde(skip_serializing_if = "Option::is_none")]
398 pub privacy: Option<PrivacyOption>,
399}
400
401#[typeshare]
403#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
404pub struct Coordinates {
405 pub latitude: f64,
407 pub longitude: f64,
409}
410
411#[typeshare]
413#[derive(Debug, Deserialize, IntoParams)]
414pub struct ConnectToMapQueryParams {
415 pub map_id: i32,
417 pub user_id: String,
419}
420
421#[typeshare]
423#[derive(Debug, Deserialize, IntoParams)]
424pub struct HeatMapQueryParams {
425 pub plant_layer_id: Uuid,
427 pub shade_layer_id: Uuid,
429 pub hydrology_layer_id: Uuid,
431 pub soil_layer_id: Uuid,
433 pub plant_id: i32,
435 #[serde(skip_serializing_if = "Option::is_none")]
438 pub date: Option<NaiveDate>,
439}
440
441#[typeshare]
442#[derive(Serialize, Deserialize, ToSchema)]
443pub struct UsersDto {
445 pub salutation: Salutation,
447 #[serde(skip_serializing_if = "Option::is_none")]
449 pub title: Option<String>,
450 pub country: String,
452 #[serde(skip_serializing_if = "Option::is_none")]
454 pub phone: Option<String>,
455 #[serde(skip_serializing_if = "Option::is_none")]
457 pub website: Option<String>,
458 #[serde(skip_serializing_if = "Option::is_none")]
460 pub organization: Option<String>,
461 #[serde(skip_serializing_if = "Option::is_none")]
463 pub experience: Option<Experience>,
464 #[serde(skip_serializing_if = "Option::is_none")]
466 pub membership: Option<Membership>,
467 #[serde(skip_serializing_if = "Option::is_none")]
469 pub member_years: Option<Vec<Option<i32>>>,
470 #[serde(skip_serializing_if = "Option::is_none")]
472 pub member_since: Option<NaiveDate>,
473 #[serde(skip_serializing_if = "Option::is_none")]
475 pub permacoins: Option<Vec<Option<i32>>>,
476}
477
478#[typeshare]
479#[derive(Serialize, Deserialize, ToSchema)]
480pub struct GuidedToursDto {
482 pub editor_tour_completed: bool,
484}
485
486#[typeshare]
487#[derive(Serialize, Deserialize, ToSchema)]
488pub struct UpdateGuidedToursDto {
490 #[serde(skip_serializing_if = "Option::is_none")]
492 pub editor_tour_completed: Option<bool>,
493}
494
495#[typeshare]
496#[derive(Serialize, Deserialize, ToSchema)]
497pub struct GainedBlossomsDto {
499 pub blossom: String,
501 pub times_gained: i32,
503 pub gained_date: NaiveDate,
505}
506
507#[typeshare]
509#[derive(Serialize, Deserialize, ToSchema)]
510pub struct ApplicationSettingDto {
511 pub id: i32,
513 pub key: String,
515 pub value: String,
517}
518
519#[typeshare]
520#[derive(Debug, Serialize, ToSchema)]
521#[serde(rename_all = "camelCase")]
522pub struct MapCollaboratorDto {
524 pub map_id: i32,
526 pub user_id: Uuid,
528 pub username: String,
530}
531
532#[typeshare]
533#[derive(Debug, Deserialize, ToSchema)]
534#[serde(rename_all = "camelCase")]
535pub struct NewMapCollaboratorDto {
537 pub user_id: Uuid,
539}
540
541#[typeshare]
542#[derive(Debug, Serialize, Deserialize, ToSchema)]
543#[serde(rename_all = "camelCase")]
544pub struct DeleteMapCollaboratorDto {
545 pub user_id: Uuid,
547}
548
549#[typeshare]
550#[derive(Debug, Deserialize, IntoParams)]
551#[serde(rename_all = "camelCase")]
552pub struct MapCollaboratorSearchParameters {
554 pub map_id: i32,
556}
557
558#[typeshare]
559#[derive(Debug, Deserialize, IntoParams)]
560#[serde(rename_all = "camelCase")]
561pub struct UserSearchParameters {
563 pub username: String,
565}