1use chrono::NaiveDate;
5use postgis_diesel::types::{Point, Polygon};
6use serde::{Deserialize, Serialize};
7use typeshare::typeshare;
8use utoipa::{IntoParams, ToSchema};
9use uuid::Uuid;
10
11use crate::model::r#enum::{
12 shade::Shade, soil_texture::SoilTextureEnum, water_requirement::WaterRequirementEnum,
13};
14
15#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, Eq, PartialEq)]
16#[serde(rename_all = "camelCase")]
17#[typeshare]
18#[serde(tag = "areaKind", content = "area")]
19pub enum AreaType {
20 Shade(Shade),
21 Hydrology(WaterRequirementEnum),
22 SoilTexture(SoilTextureEnum),
23}
24
25#[typeshare]
26#[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema, Eq, PartialEq)]
27#[serde(rename_all = "camelCase")]
28pub enum AreaKind {
29 Shade,
30 Hydrology,
31 SoilTexture,
32}
33
34#[typeshare]
36#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
37#[serde(rename_all = "camelCase")]
38pub struct AreaDto {
39 pub id: Uuid,
41 pub layer_id: Uuid,
43 pub area_type: AreaType,
45 #[schema(value_type = Object)]
49 pub geometry: Polygon<Point>,
50 pub add_date: Option<NaiveDate>,
53 pub remove_date: Option<NaiveDate>,
56 pub notes: String,
58}
59
60#[typeshare]
62#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
63#[serde(rename_all = "camelCase")]
64pub struct NewAreaDto {
65 pub id: Uuid,
67 pub layer_id: Uuid,
69 pub area_type: AreaType,
71 #[schema(value_type = Object)]
75 pub geometry: Polygon<Point>,
76 pub add_date: Option<NaiveDate>,
79}
80
81#[typeshare]
82#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
83#[serde(tag = "type", content = "content")]
84pub enum AreaUpdate {
85 UpdateValue(Vec<UpdateAreaValueDto>),
87 UpdateAddDate(Vec<UpdateAddDateAreaDto>),
89 UpdateRemoveDate(Vec<UpdateRemoveDateAreaDto>),
91 UpdateNotes(Vec<UpdateNotesAreaDto>),
93}
94
95#[typeshare]
101#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
102#[serde(rename_all = "camelCase")]
103pub struct UpdateAreaDto {
104 pub area_kind: AreaKind,
105 pub update: AreaUpdate,
106}
107
108#[typeshare]
110#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
111#[serde(rename_all = "camelCase")]
112pub struct UpdateAreaValueDto {
113 pub id: Uuid,
115 pub area_type: AreaType,
117}
118
119#[typeshare]
121#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
122#[serde(rename_all = "camelCase")]
123pub struct UpdateAddDateAreaDto {
124 pub id: Uuid,
126 pub add_date: Option<NaiveDate>,
129}
130
131#[typeshare]
133#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
134#[serde(rename_all = "camelCase")]
135pub struct UpdateRemoveDateAreaDto {
136 pub id: Uuid,
138 pub remove_date: Option<NaiveDate>,
141}
142
143#[typeshare]
145#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
146#[serde(rename_all = "camelCase")]
147pub struct UpdateNotesAreaDto {
148 pub id: Uuid,
150 pub notes: String,
152}
153
154#[typeshare]
156#[derive(Debug, Deserialize, IntoParams)]
157pub struct AreaSearchParameters {
158 pub layer_id: Option<Uuid>,
160 pub relative_to_date: NaiveDate,
162 pub kind: AreaKind,
164}