Add an accommodations reservations module (#188)
All checks were successful
continuous-integration/drone/push Build is passing

Add a new module to enable accommodations reservation

![](https://gitea.communiquons.org/attachments/de1f5b12-0a93-40f8-b29d-97665daa6fd5)

Reviewed-on: #188
This commit is contained in:
2024-06-22 21:30:26 +00:00
parent 8ecacbe622
commit 1a890844ef
54 changed files with 4230 additions and 33 deletions

View File

@ -1,6 +1,11 @@
use crate::app_config::AppConfig;
use crate::schema::{couples, families, members, memberships, photos, users};
use crate::constants;
use crate::schema::{
accommodations_list, accommodations_reservations, accommodations_reservations_cals_urls,
couples, families, members, memberships, photos, users,
};
use crate::utils::crypt_utils::sha256;
use crate::utils::time_utils::time;
use diesel::prelude::*;
/// User ID holder
@ -66,6 +71,7 @@ pub struct Family {
pub invitation_code: String,
pub disable_couple_photos: bool,
pub enable_genealogy: bool,
pub enable_accommodations: bool,
}
impl Family {
@ -308,7 +314,7 @@ pub struct NewMember {
pub time_update: i64,
}
/// Member ID holder
/// Couple ID holder
#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, Eq, PartialEq, Hash)]
pub struct CoupleID(pub i32);
@ -441,3 +447,153 @@ pub struct NewCouple {
pub time_create: i64,
pub time_update: i64,
}
/// Accommodation ID holder
#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, Eq, PartialEq, Hash)]
pub struct AccommodationID(pub i32);
#[derive(Queryable, Debug, serde::Serialize)]
pub struct Accommodation {
id: i32,
family_id: i32,
time_create: i64,
pub time_update: i64,
pub name: String,
pub need_validation: bool,
pub description: Option<String>,
pub color: Option<String>,
pub open_to_reservations: bool,
}
impl Accommodation {
pub fn id(&self) -> AccommodationID {
AccommodationID(self.id)
}
pub fn family_id(&self) -> FamilyID {
FamilyID(self.family_id)
}
}
#[derive(Insertable)]
#[diesel(table_name = accommodations_list)]
pub struct NewAccommodation {
pub family_id: i32,
pub name: String,
pub time_create: i64,
pub time_update: i64,
}
/// Accommodation reservation ID holder
#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, Eq, PartialEq, Hash)]
pub struct AccommodationReservationID(pub i32);
pub enum ReservationStatus {
Pending,
Accepted,
Rejected,
}
#[derive(Queryable, Debug, serde::Serialize)]
pub struct AccommodationReservation {
id: i32,
family_id: i32,
accommodation_id: i32,
user_id: i32,
time_create: i64,
pub time_update: i64,
pub reservation_start: i64,
pub reservation_end: i64,
pub validated: Option<bool>,
}
impl AccommodationReservation {
pub fn id(&self) -> AccommodationReservationID {
AccommodationReservationID(self.id)
}
pub fn accommodation_id(&self) -> AccommodationID {
AccommodationID(self.accommodation_id)
}
pub fn family_id(&self) -> FamilyID {
FamilyID(self.family_id)
}
pub fn user_id(&self) -> UserID {
UserID(self.user_id)
}
pub fn status(&self) -> ReservationStatus {
match self.validated {
None => ReservationStatus::Pending,
Some(true) => ReservationStatus::Accepted,
Some(false) => ReservationStatus::Rejected,
}
}
}
#[derive(Insertable)]
#[diesel(table_name = accommodations_reservations)]
pub struct NewAccommodationReservation {
pub family_id: i32,
pub accommodation_id: i32,
pub user_id: i32,
pub time_create: i64,
pub time_update: i64,
pub reservation_start: i64,
pub reservation_end: i64,
}
/// Accommodation reservation calendar ID holder
#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, Eq, PartialEq, Hash)]
pub struct AccommodationReservationCalendarID(pub i32);
#[derive(Queryable, Debug, serde::Serialize)]
pub struct AccommodationReservationCalendar {
id: i32,
family_id: i32,
accommodation_id: Option<i32>,
user_id: i32,
name: String,
token: String,
pub time_create: i64,
pub time_used: i64,
}
impl AccommodationReservationCalendar {
pub fn id(&self) -> AccommodationReservationCalendarID {
AccommodationReservationCalendarID(self.id)
}
pub fn accommodation_id(&self) -> Option<AccommodationID> {
self.accommodation_id.map(AccommodationID)
}
pub fn family_id(&self) -> FamilyID {
FamilyID(self.family_id)
}
pub fn user_id(&self) -> UserID {
UserID(self.user_id)
}
pub fn should_update_last_used(&self) -> bool {
(self.time_used
+ constants::ACCOMMODATIONS_RESERVATIONS_CAL_URL_TIME_USED_UPDATE_MIN_INTERVAL.as_secs()
as i64)
< time() as i64
}
}
#[derive(Insertable)]
#[diesel(table_name = accommodations_reservations_cals_urls)]
pub struct NewAccommodationReservationCalendar {
pub family_id: i32,
pub accommodation_id: Option<i32>,
pub user_id: i32,
pub name: String,
pub token: String,
pub time_create: i64,
pub time_used: i64,
}