mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2024-11-22 21:39:21 +00:00
Can get the list of memberships of a user
This commit is contained in:
parent
59961129c5
commit
b5bcb3e8c7
@ -40,4 +40,6 @@ pub mod posts_targets_api;
|
|||||||
pub mod res_create_comment;
|
pub mod res_create_comment;
|
||||||
pub mod res_number_unread_notifications;
|
pub mod res_number_unread_notifications;
|
||||||
pub mod res_count_all_unreads;
|
pub mod res_count_all_unreads;
|
||||||
pub mod notification_api;
|
pub mod notification_api;
|
||||||
|
pub mod user_membership_api;
|
||||||
|
mod type_container_api;
|
@ -2,24 +2,11 @@
|
|||||||
//!
|
//!
|
||||||
//! @author Pierre Hubert
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
use serde::{Serialize, Serializer};
|
use serde::Serialize;
|
||||||
use serde::ser::SerializeMap;
|
|
||||||
|
|
||||||
|
use crate::api_data::type_container_api::TypeContainerAPI;
|
||||||
use crate::data::notification::Notification;
|
use crate::data::notification::Notification;
|
||||||
|
|
||||||
struct TypeContainer {
|
|
||||||
t: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for TypeContainer {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
|
|
||||||
S: Serializer {
|
|
||||||
let mut map = serializer.serialize_map(Some(1))?;
|
|
||||||
map.serialize_entry("type", &self.t)?;
|
|
||||||
map.end()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
pub struct NotificationAPI {
|
pub struct NotificationAPI {
|
||||||
id: u64,
|
id: u64,
|
||||||
@ -30,7 +17,7 @@ pub struct NotificationAPI {
|
|||||||
on_elem_id: u64,
|
on_elem_id: u64,
|
||||||
on_elem_type: String,
|
on_elem_type: String,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
type_container: TypeContainer,
|
type_container: TypeContainerAPI,
|
||||||
event_visibility: String,
|
event_visibility: String,
|
||||||
from_container_id: Option<u64>,
|
from_container_id: Option<u64>,
|
||||||
from_container_type: Option<String>,
|
from_container_type: Option<String>,
|
||||||
@ -46,7 +33,7 @@ impl NotificationAPI {
|
|||||||
dest_user_id: n.dest_user_id.id(),
|
dest_user_id: n.dest_user_id.id(),
|
||||||
on_elem_id: n.on_elem_id,
|
on_elem_id: n.on_elem_id,
|
||||||
on_elem_type: n.on_elem_type.to_api(),
|
on_elem_type: n.on_elem_type.to_api(),
|
||||||
type_container: TypeContainer { t: n.kind.to_api() },
|
type_container: TypeContainerAPI::new(n.kind.to_api()),
|
||||||
event_visibility: n.visibility.to_api(),
|
event_visibility: n.visibility.to_api(),
|
||||||
from_container_id: n.container_id,
|
from_container_id: n.container_id,
|
||||||
from_container_type: n.container_type.as_ref().map(|f| f.to_api()),
|
from_container_type: n.container_type.as_ref().map(|f| f.to_api()),
|
||||||
|
24
src/api_data/type_container_api.rs
Normal file
24
src/api_data/type_container_api.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
//! Use this structure for all structures that needs a "type" field
|
||||||
|
//!
|
||||||
|
//! @author Pierre Hubert
|
||||||
|
use serde::{Serialize, Serializer};
|
||||||
|
use serde::ser::SerializeMap;
|
||||||
|
|
||||||
|
pub struct TypeContainerAPI {
|
||||||
|
t: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TypeContainerAPI {
|
||||||
|
pub fn new(t: String) -> TypeContainerAPI {
|
||||||
|
TypeContainerAPI { t }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serialize for TypeContainerAPI {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
|
||||||
|
S: Serializer {
|
||||||
|
let mut map = serializer.serialize_map(Some(1))?;
|
||||||
|
map.serialize_entry("type", &self.t)?;
|
||||||
|
map.end()
|
||||||
|
}
|
||||||
|
}
|
54
src/api_data/user_membership_api.rs
Normal file
54
src/api_data/user_membership_api.rs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
//! # User membership API entry
|
||||||
|
//!
|
||||||
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
|
use crate::api_data::conversation_api::ConversationAPI;
|
||||||
|
use crate::api_data::friend_api::FriendAPI;
|
||||||
|
use crate::api_data::type_container_api::TypeContainerAPI;
|
||||||
|
use crate::data::user_membership::UserMembership;
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
pub struct UserMembershipAPI {
|
||||||
|
#[serde(flatten)]
|
||||||
|
membership_type: TypeContainerAPI,
|
||||||
|
id: Option<u64>,
|
||||||
|
friend: Option<FriendAPI>,
|
||||||
|
last_activity: Option<u64>,
|
||||||
|
conv: Option<ConversationAPI>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl UserMembershipAPI {
|
||||||
|
pub fn new(m: &UserMembership) -> UserMembershipAPI {
|
||||||
|
match &m {
|
||||||
|
UserMembership::Group(group_id, last_activity) => UserMembershipAPI {
|
||||||
|
membership_type: TypeContainerAPI::new("group".to_string()),
|
||||||
|
id: Some(group_id.id()),
|
||||||
|
friend: None,
|
||||||
|
last_activity: Some(last_activity.clone()),
|
||||||
|
conv: None,
|
||||||
|
},
|
||||||
|
|
||||||
|
UserMembership::Friend(friend) => UserMembershipAPI {
|
||||||
|
membership_type: TypeContainerAPI::new("friend".to_string()),
|
||||||
|
id: None,
|
||||||
|
friend: Some(FriendAPI::new(friend)),
|
||||||
|
last_activity: None,
|
||||||
|
conv: None,
|
||||||
|
},
|
||||||
|
|
||||||
|
UserMembership::Conversation(conversation) => UserMembershipAPI {
|
||||||
|
membership_type: TypeContainerAPI::new("conversation".to_string()),
|
||||||
|
id: None,
|
||||||
|
friend: None,
|
||||||
|
last_activity: None,
|
||||||
|
conv: Some(ConversationAPI::new(conversation)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn for_list(l: &Vec<UserMembership>) -> Vec<UserMembershipAPI> {
|
||||||
|
l.iter().map(Self::new).collect()
|
||||||
|
}
|
||||||
|
}
|
@ -2,10 +2,14 @@
|
|||||||
//!
|
//!
|
||||||
//! @author Pierre Hubert
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
use crate::api_data::user_membership_api::UserMembershipAPI;
|
||||||
use crate::controllers::routes::RequestResult;
|
use crate::controllers::routes::RequestResult;
|
||||||
use crate::data::http_request_handler::HttpRequestHandler;
|
use crate::data::http_request_handler::HttpRequestHandler;
|
||||||
|
use crate::helpers::webapp_helper;
|
||||||
|
|
||||||
/// Get the list of memberships of a given user
|
/// Get the list of memberships of a given user
|
||||||
pub fn get_memberships(r: &mut HttpRequestHandler) -> RequestResult {
|
pub fn get_memberships(r: &mut HttpRequestHandler) -> RequestResult {
|
||||||
r.success("Implement me")
|
let memberships = webapp_helper::get_user_memberships(r.user_id_ref()?)?;
|
||||||
|
|
||||||
|
r.set_response(UserMembershipAPI::for_list(&memberships))
|
||||||
}
|
}
|
@ -24,4 +24,5 @@ pub mod movie;
|
|||||||
pub mod survey;
|
pub mod survey;
|
||||||
pub mod comment;
|
pub mod comment;
|
||||||
pub mod new_survey;
|
pub mod new_survey;
|
||||||
pub mod notification;
|
pub mod notification;
|
||||||
|
pub mod user_membership;
|
13
src/data/user_membership.rs
Normal file
13
src/data/user_membership.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
//! # User membership
|
||||||
|
//!
|
||||||
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
use crate::data::friend::Friend;
|
||||||
|
use crate::data::conversation::Conversation;
|
||||||
|
use crate::data::group_id::GroupID;
|
||||||
|
|
||||||
|
pub enum UserMembership {
|
||||||
|
Group(GroupID, u64),
|
||||||
|
Friend(Friend),
|
||||||
|
Conversation(Conversation)
|
||||||
|
}
|
@ -9,7 +9,7 @@ use crate::data::group_id::GroupID;
|
|||||||
use crate::data::group_member::{GroupMember, GroupMembershipLevel};
|
use crate::data::group_member::{GroupMember, GroupMembershipLevel};
|
||||||
use crate::data::new_group::NewGroup;
|
use crate::data::new_group::NewGroup;
|
||||||
use crate::data::user::UserID;
|
use crate::data::user::UserID;
|
||||||
use crate::helpers::database;
|
use crate::helpers::{database, posts_helper};
|
||||||
use crate::utils::date_utils::time;
|
use crate::utils::date_utils::time;
|
||||||
|
|
||||||
impl GroupVisibilityLevel {
|
impl GroupVisibilityLevel {
|
||||||
@ -346,6 +346,24 @@ pub fn check_directory_availability(dir: &str, group_id: Option<GroupID>) -> Res
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the last activity time of a group
|
||||||
|
pub fn get_last_activity(user_id: &UserID, group_id: &GroupID) -> ResultBoxError<u64> {
|
||||||
|
let last_post = posts_helper::PostsQuery::new(user_id.as_option())
|
||||||
|
.set_limit(1)
|
||||||
|
.get_group(group_id)?;
|
||||||
|
|
||||||
|
match last_post.first() {
|
||||||
|
None => {
|
||||||
|
// No post was found
|
||||||
|
Ok(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(p) => {
|
||||||
|
Ok(p.time_create)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Set new settings to the group, except group logo
|
/// Set new settings to the group, except group logo
|
||||||
pub fn set_settings(g: &Group) -> ResultBoxError {
|
pub fn set_settings(g: &Group) -> ResultBoxError {
|
||||||
database::UpdateInfo::new(GROUPS_LIST_TABLE)
|
database::UpdateInfo::new(GROUPS_LIST_TABLE)
|
||||||
|
@ -14,4 +14,5 @@ pub mod virtual_directory_helper;
|
|||||||
pub mod movies_helper;
|
pub mod movies_helper;
|
||||||
pub mod survey_helper;
|
pub mod survey_helper;
|
||||||
pub mod comments_helper;
|
pub mod comments_helper;
|
||||||
pub mod notifications_helper;
|
pub mod notifications_helper;
|
||||||
|
pub mod webapp_helper;
|
34
src/helpers/webapp_helper.rs
Normal file
34
src/helpers/webapp_helper.rs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//! # Web Application Helper
|
||||||
|
//!
|
||||||
|
//! Contains methods specific to Comunic Web applications
|
||||||
|
//!
|
||||||
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
use crate::data::error::ResultBoxError;
|
||||||
|
use crate::data::user::UserID;
|
||||||
|
use crate::data::user_membership::UserMembership;
|
||||||
|
use crate::helpers::{conversations_helper, friends_helper, groups_helper};
|
||||||
|
|
||||||
|
/// Get all the memberships of a user
|
||||||
|
pub fn get_user_memberships(user_id: &UserID) -> ResultBoxError<Vec<UserMembership>> {
|
||||||
|
let friends = friends_helper::GetFriendsQuery::new(user_id)
|
||||||
|
.exec()?;
|
||||||
|
let groups = groups_helper::get_list_user(user_id, false)?;
|
||||||
|
let conversations_list = conversations_helper::get_list_user(user_id)?;
|
||||||
|
|
||||||
|
let mut list = Vec::new();
|
||||||
|
|
||||||
|
for friend in friends {
|
||||||
|
list.push(UserMembership::Friend(friend));
|
||||||
|
}
|
||||||
|
|
||||||
|
for group in &groups {
|
||||||
|
list.push(UserMembership::Group(group.clone(), groups_helper::get_last_activity(user_id, group)?));
|
||||||
|
}
|
||||||
|
|
||||||
|
for conv in conversations_list {
|
||||||
|
list.push(UserMembership::Conversation(conv))
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(list)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user