Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 15 additions & 16 deletions packages/api/src/routes/events.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
#[cfg(feature = "server")]
use crate::server;
#[cfg(feature = "server")]
use dioxus::server::axum::Extension;
use dioxus::{fullstack::NoContent, prelude::*};
use entity::event::PartialEventModel;
use entity::links::EventUserMembers;
use entity::prelude::*;

pub mod invitations;

#[get("/api/events?mindate&maxdate", ext: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
Expand All @@ -15,6 +13,7 @@ pub async fn list_events(
) -> Result<Vec<entity::event::FullEvent>, ServerFnError> {
use entity::event::Column as EventColumn;
use entity::group::Column as GroupColumn;
use entity::group::Entity as Group;
use entity::invitation::Column as InvitationColumn;
use entity::shared_group_event::Column as GroupEventColumn;
use sea_orm::{
Expand Down Expand Up @@ -113,7 +112,7 @@ pub async fn retrieve_event(event_id: i32) -> Result<entity::event::Model, Serve
.one(&ext.database)
.await
.or_internal_server_error("Error loading user from database")?
.or_not_found("event not found")?;
.or_not_found("Event not found")?;
Ok(event)
}

Expand All @@ -131,7 +130,7 @@ pub async fn delete_event(event_id: i32) -> Result<NoContent, ServerFnError> {
.one(&ext.database)
.await
.or_internal_server_error("Error loading event from database")?
.or_not_found("event not found")?;
.or_not_found("Event not found")?;

(event.owner_id == user_id).or_unauthorized("Unauthorized to delete this event")?;

Expand Down Expand Up @@ -231,7 +230,7 @@ pub async fn update_event(
.one(&ext.database)
.await
.or_internal_server_error("Failed to load event")?
.or_not_found("event somehow not found")?;
.or_not_found("Event not found")?;

let owner = event.owner_id;

Expand Down Expand Up @@ -265,6 +264,7 @@ pub async fn update_event(
#[get("/api/events/{event_id}/groups", ext: Extension<server::AppState>)]
pub async fn list_event_groups(event_id: i32) -> Result<Vec<entity::group::Model>, ServerFnError> {
use entity::event::Entity as Event;
use entity::group::Entity as Group;
use sea_orm::{EntityTrait, ModelTrait};

let event = Event::find_by_id(event_id)
Expand Down Expand Up @@ -345,33 +345,32 @@ pub async fn remove_event_from_group(
"Failed to remove event {event_id} from group {group_id}"
))?;

//delete_event(event_id).await?;

Ok(NoContent)
}

#[get("/api/events/{event_id}/members", ext: Extension<server::AppState>)]
pub async fn list_event_members(event_id: i32) -> Result<Vec<entity::user::Model>, ServerFnError> {
use entity::links::EventUserMembers;
use sea_orm::EntityTrait;
use sea_orm::ModelTrait;

let event = entity::event::Entity::find_by_id(event_id)
.one(&ext.database)
.await
.or_internal_server_error("could not load event")?
.or_not_found("could not find event")?;
.or_internal_server_error("Error loading event from database")?
.or_not_found("Event not found")?;

let owner = entity::user::Entity::find_by_id(event.owner_id)
.one(&ext.database)
.await
.or_internal_server_error("could not load event")?
.or_not_found("could not find event")?;
.or_internal_server_error("Error loading owner from database")?
.or_not_found("Owner not found")?;

let mut shares = event
.find_linked(EventUserMembers)
.all(&ext.database)
.await
.or_internal_server_error("failed to retrieve other members")?;
.or_internal_server_error("Error retrieving members")?;

shares.push(owner);

Expand All @@ -389,13 +388,13 @@ pub async fn leave_event(event_id: i32) -> Result<NoContent, ServerFnError> {
.filter(entity::shared_friend_event::Column::UserId.eq(user.id))
.one(&ext.database)
.await
.or_internal_server_error("Failed to retrieve info from server")?
.or_not_found("user is not in this event")?;
.or_internal_server_error("Error loading event from database")?
.or_not_found("User is not in this event")?;

shared_event
.delete(&ext.database)
.await
.or_internal_server_error("could not leave event")?;
.or_internal_server_error("Error leaving event")?;

Ok(NoContent)
}
13 changes: 10 additions & 3 deletions packages/api/src/routes/events/invitations.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
#[cfg(feature = "server")]
use crate::server;
use dioxus::{fullstack::NoContent, prelude::*};
use entity::{links::FriendEvents, prelude::*};

#[cfg(feature = "server")]
use dioxus::server::axum::Extension;
use entity::invitation::InvitationStatus;

//TODO maybe optimize with joined queries, to not load event and user seperatley
#[get("/api/events/invitations", ext: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn list_received_invites() -> Result<Vec<entity::invitation::Model>, ServerFnError> {
use entity::invitation::Entity as Invitation;
use entity::invitation::InvitationStatus;
use sea_orm::{ColumnTrait, ModelTrait, QueryFilter};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;

let invites = user
Expand All @@ -28,6 +29,7 @@ pub async fn send_invite(
event_id: i32,
) -> Result<entity::invitation::Model, ServerFnError> {
use crate::server::events::can_invite_user_to_event;
use entity::invitation::InvitationStatus;
use sea_orm::{ActiveModelTrait, EntityTrait, Set, TryIntoModel};
use server::auth::find_user_by_email;

Expand Down Expand Up @@ -72,6 +74,8 @@ pub async fn send_invite(

#[post("/api/events/invitations/{invitation_id}/accept", ext: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn accept_invite(invitation_id: i32) -> Result<NoContent, ServerFnError> {
use entity::invitation::Entity as Invitation;
use entity::invitation::InvitationStatus;
use sea_orm::{ActiveModelTrait, EntityTrait, IntoActiveModel, Set};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand Down Expand Up @@ -109,6 +113,8 @@ pub async fn accept_invite(invitation_id: i32) -> Result<NoContent, ServerFnErro

#[post("/api/events/invitations/{invitation_id}/delete", ext: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn decline_invite(invitation_id: i32) -> Result<NoContent, ServerFnError> {
use entity::invitation::Entity as Invitation;
use entity::invitation::InvitationStatus;
use sea_orm::{ActiveModelTrait, EntityTrait, IntoActiveModel, Set};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand Down Expand Up @@ -136,6 +142,7 @@ pub async fn decline_invite(invitation_id: i32) -> Result<NoContent, ServerFnErr

#[get("/api/events/invitations/events", ext: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn list_shared_friend_events() -> Result<Vec<entity::event::Model>, ServerFnError> {
use entity::links::FriendEvents;
use sea_orm::ModelTrait;
let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;

Expand Down
22 changes: 15 additions & 7 deletions packages/api/src/routes/groups.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use crate::dioxus_fullstack::NoContent;
use crate::routes::users::UserInfo;
#[cfg(feature = "server")]
use crate::server;
use dioxus::prelude::*;
use entity::prelude::*;
use serde::{Deserialize, Serialize};

#[cfg(feature = "server")]
Expand Down Expand Up @@ -36,7 +36,7 @@ pub async fn create_group(group_name: String) -> Result<entity::group::Model, Se
pair.insert(txn)
.await
.inspect_err(|error| error!("{error:?}"))
.or_internal_server_error("Error creating group")?;
.or_internal_server_error("Error adding creator to group")?;

Ok(group)
})
Expand All @@ -57,6 +57,7 @@ pub async fn create_group(group_name: String) -> Result<entity::group::Model, Se

#[get("/api/groups", ext: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn list_groups() -> Result<Vec<entity::group::Model>, ServerFnError> {
use entity::group::Entity as Group;
use sea_orm::ModelTrait;

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand Down Expand Up @@ -90,7 +91,7 @@ pub async fn add_user_to_group(group_id: i32, email: String) -> Result<NoContent

let checker = is_user_in_group(&ext.database, group_id, new_user.id).await?;

(!checker).or_bad_request("User already in group")?;
(!checker).or_bad_request("User is already in group")?;

let pair = is_in_group::ActiveModel {
user_id: Set(new_user.id),
Expand Down Expand Up @@ -137,9 +138,7 @@ pub async fn remove_user_from_group(
.await
.or_internal_server_error("Error deleting relation")?;

(result.rows_affected > 0).or_not_found(format!(
"Failed to remove user {user_id} from group {group_id}"
))?;
(result.rows_affected > 0).or_not_found("Failed to remove user from group")?;

Ok(NoContent)
} else {
Expand All @@ -155,6 +154,12 @@ pub async fn remove_user_from_group(
}
}

#[post("/api/groups/{group_id}/leave-group", auth: Extension<server::AuthenticationState>)]
pub async fn leave_group(group_id: i32) -> Result<NoContent, ServerFnError> {
let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
remove_user_from_group(group_id, user.id).await
}

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct GroupDetailData {
pub name: String,
Expand All @@ -165,6 +170,9 @@ pub struct GroupDetailData {
///returns default struct of GroupDetailData when trying to call a group which does not exist
#[get("/api/groups/{group_id}", ext: Extension<server::AppState>)]
pub async fn retrieve_group(group_id: i32) -> Result<GroupDetailData, ServerFnError> {
use entity::event::Entity as Event;
use entity::group::Entity as Group;
use entity::user::Entity as User;
use sea_orm::EntityTrait;
use sea_orm::ModelTrait;

Expand Down Expand Up @@ -210,7 +218,7 @@ pub async fn change_group_name(
let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
is_user_in_group(&ext.database, group_id, user.id)
.await?
.or_forbidden("user is not part of this group")?;
.or_forbidden("User is not part of this group")?;

let group = Group::find_by_id(group_id)
.one(&ext.database)
Expand Down
8 changes: 7 additions & 1 deletion packages/api/src/routes/todo_list.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#[cfg(feature = "server")]
use crate::server;
use dioxus::fullstack::NoContent;
use dioxus::prelude::*;
#[cfg(feature = "server")]
use dioxus::server::axum::Extension;
use entity::prelude::*;
use entity::todo_list::{CreateTodoList, UpdateTodoList};

pub mod invite;
Expand All @@ -12,7 +12,9 @@ pub mod invite;
pub async fn list_todo_lists()
-> Result<Vec<entity::todo_list::TodoListWithPermission>, ServerFnError> {
use entity::todo_list::Column as TodoListColumn;
use entity::todo_list::Entity as TodoList;
use entity::todo_list_invitation::Column as InvitationColumn;
use entity::todo_list_invitation::Entity as TodoListInvitation;
use sea_orm::ColumnTrait;
use sea_orm::Condition;
use sea_orm::EntityTrait;
Expand Down Expand Up @@ -42,7 +44,9 @@ pub async fn list_todo_lists()
pub async fn retrieve_todo_list(
todo_list_id: i32,
) -> Result<entity::todo_list::TodoListWithPermission, ServerFnError> {
use entity::todo_list::Entity as TodoList;
use entity::todo_list_invitation::Column as InvitationColumn;
use entity::todo_list_invitation::Entity as TodoListInvitation;
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand All @@ -64,6 +68,7 @@ pub async fn retrieve_todo_list(
pub async fn list_todo_list_members(
todo_list_id: i32,
) -> Result<Vec<entity::user::UserWithTodoListInvitation>, ServerFnError> {
use entity::user::Entity as User;
use sea_orm::EntityTrait;
use sea_orm::JoinType;
use sea_orm::{ColumnTrait, QueryFilter, QuerySelect, RelationTrait};
Expand Down Expand Up @@ -175,6 +180,7 @@ pub async fn update_todo_list(

#[delete("/api/todolists/{todo_list_id}", state: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn delete_todo_list(todo_list_id: i32) -> Result<NoContent, ServerFnError> {
use entity::todo_list::Entity as TodoList;
use sea_orm::EntityTrait;
let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;

Expand Down
12 changes: 11 additions & 1 deletion packages/api/src/routes/todo_list/invite.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#[cfg(feature = "server")]
use crate::server;
use dioxus::fullstack::NoContent;
use dioxus::prelude::*;
#[cfg(feature = "server")]
use dioxus::server::axum::Extension;
use entity::prelude::*;
use entity::todo_list_invitation::{UpdateMyTodoListInvitation, UpdateTodoListInvitation};
use entity::user::UserWithTodoListInvitation;
use serde::{Deserialize, Serialize};
Expand All @@ -21,6 +21,9 @@ pub async fn invite_to_todo_list(
data: InviteToTodoListData,
) -> Result<NoContent, ServerFnError> {
use crate::routes::users::EMAIL_REGEX;
use entity::todo_list::Entity as TodoList;
use entity::todo_list_invitation::Entity as TodoListInvitation;
use entity::user::Entity as User;
use regex::Regex;
use sea_orm::ColumnTrait;
use sea_orm::EntityTrait;
Expand Down Expand Up @@ -124,7 +127,9 @@ pub async fn decline_todo_list_invite(todo_list_id: i32) -> Result<NoContent, Se

#[post("/api/todolists/{todo_list_id}/invite/leave", state: Extension<server::AppState>, auth: Extension<server::AuthenticationState> )]
pub async fn leave_todo_list(todo_list_id: i32) -> Result<NoContent, ServerFnError> {
use entity::todo_list::Entity as TodoList;
use entity::todo_list_invitation::Column as InviteColum;
use entity::todo_list_invitation::Entity as TodoListInvitation;
use sea_orm::{ColumnTrait, EntityTrait, ModelTrait, PaginatorTrait, QueryFilter};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand Down Expand Up @@ -199,6 +204,8 @@ pub async fn update_todo_list_invitation(
data: UpdateTodoListInvitation,
) -> Result<UserWithTodoListInvitation, ServerFnError> {
use entity::todo_list_invitation::Column as InviteColum;
use entity::todo_list_invitation::Entity as TodoListInvitation;
use entity::user::Entity as User;
use sea_orm::{
ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, PaginatorTrait, QueryFilter,
QuerySelect, RelationTrait,
Expand Down Expand Up @@ -265,6 +272,8 @@ pub async fn update_my_todo_list_invitation(
data: UpdateMyTodoListInvitation,
) -> Result<UserWithTodoListInvitation, ServerFnError> {
use entity::todo_list_invitation::Column as InviteColum;
use entity::todo_list_invitation::Entity as TodoListInvitation;
use entity::user::Entity as User;
use sea_orm::{
ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, QueryFilter, QuerySelect,
RelationTrait,
Expand Down Expand Up @@ -314,6 +323,7 @@ pub async fn list_todo_invites(
accepted: Option<bool>,
) -> Result<Vec<entity::todo_list_invitation::Model>, ServerFnError> {
use entity::todo_list_invitation::Column as InviteColum;
use entity::todo_list_invitation::Entity as TodoListInvitation;
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter, QueryTrait};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand Down
9 changes: 7 additions & 2 deletions packages/api/src/routes/todos.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
#[cfg(feature = "server")]
use crate::server;
use dioxus::fullstack::NoContent;
use dioxus::prelude::*;
#[cfg(feature = "server")]
use dioxus::server::axum::Extension;
use entity::prelude::TodoList;
use entity::prelude::*;
use entity::todo::{CreateToDo, UpdateToDo};

#[get("/api/todolists/{todo_list_id}/todos", state: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn list_todo(todo_list_id: i32) -> Result<Vec<entity::todo::Model>, ServerFnError> {
use entity::todo::Entity as Todo;
use entity::todo_list::Entity as TodoList;
use sea_orm::ColumnTrait;
use sea_orm::EntityTrait;
use sea_orm::QueryFilter;
Expand Down Expand Up @@ -42,6 +43,7 @@ pub async fn list_todos(
completed: Option<bool>,
favorite: Option<bool>,
) -> Result<Vec<entity::todo::TodoWithPermission>, ServerFnError> {
use entity::todo::Entity as Todo;
use sea_orm::ColumnTrait;
use sea_orm::EntityTrait;
use sea_orm::JoinType;
Expand Down Expand Up @@ -85,6 +87,7 @@ pub async fn create_todo(
todo_list_id: i32,
data: CreateToDo,
) -> Result<entity::todo::Model, ServerFnError> {
use entity::todo_list::Entity as TodoList;
use sea_orm::{ActiveModelTrait, EntityTrait, IntoActiveModel, Set};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand Down Expand Up @@ -120,6 +123,7 @@ pub async fn update_todo(
todo_id: i32,
data: UpdateToDo,
) -> Result<entity::todo::Model, ServerFnError> {
use entity::todo::Entity as Todo;
use sea_orm::{ActiveModelTrait, EntityTrait, IntoActiveModel, TryIntoModel};
let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
let todo = Todo::find_by_id(todo_id)
Expand Down Expand Up @@ -157,6 +161,7 @@ pub async fn update_todo(

#[delete("/api/todos/{todo_id}", state: Extension<server::AppState>, auth: Extension<server::AuthenticationState>)]
pub async fn delete_todo(todo_id: i32) -> Result<NoContent, ServerFnError> {
use entity::todo::Entity as Todo;
use sea_orm::{EntityTrait, ModelTrait};

let user = auth.user.as_ref().or_unauthorized("Not authenticated")?;
Expand Down
Loading