add: order dms by last message time
This commit is contained in:
parent
0af95e517d
commit
9443bfb58d
6 changed files with 29 additions and 6 deletions
|
@ -21,6 +21,7 @@ impl DataManager {
|
||||||
position: get!(x->6(i32)) as usize,
|
position: get!(x->6(i32)) as usize,
|
||||||
members: serde_json::from_str(&get!(x->7(String))).unwrap(),
|
members: serde_json::from_str(&get!(x->7(String))).unwrap(),
|
||||||
title: get!(x->8(String)),
|
title: get!(x->8(String)),
|
||||||
|
last_message: get!(x->9(i64)) as usize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +82,7 @@ impl DataManager {
|
||||||
|
|
||||||
let res = query_rows!(
|
let res = query_rows!(
|
||||||
&conn,
|
&conn,
|
||||||
"SELECT * FROM channels WHERE (owner = $1 OR members LIKE $2) AND community = 0 ORDER BY created DESC",
|
"SELECT * FROM channels WHERE (owner = $1 OR members LIKE $2) AND community = 0 ORDER BY last_message DESC",
|
||||||
params![&(user as i64), &format!("%{user}%")],
|
params![&(user as i64), &format!("%{user}%")],
|
||||||
|x| { Self::get_channel_from_row(x) }
|
|x| { Self::get_channel_from_row(x) }
|
||||||
);
|
);
|
||||||
|
@ -162,7 +163,7 @@ impl DataManager {
|
||||||
|
|
||||||
let res = execute!(
|
let res = execute!(
|
||||||
&conn,
|
&conn,
|
||||||
"INSERT INTO channels VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
|
"INSERT INTO channels VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
|
||||||
params![
|
params![
|
||||||
&(data.id as i64),
|
&(data.id as i64),
|
||||||
&(data.community as i64),
|
&(data.community as i64),
|
||||||
|
@ -172,7 +173,8 @@ impl DataManager {
|
||||||
&(data.minimum_role_write as i32),
|
&(data.minimum_role_write as i32),
|
||||||
&(data.position as i32),
|
&(data.position as i32),
|
||||||
&serde_json::to_string(&data.members).unwrap(),
|
&serde_json::to_string(&data.members).unwrap(),
|
||||||
&data.title
|
&data.title,
|
||||||
|
&(data.last_message as i64)
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -320,4 +322,5 @@ impl DataManager {
|
||||||
auto_method!(update_channel_minimum_role_read(i32)@get_channel_by_id:MANAGE_CHANNELS -> "UPDATE channels SET minimum_role_read = $1 WHERE id = $2" --cache-key-tmpl="atto.channel:{}");
|
auto_method!(update_channel_minimum_role_read(i32)@get_channel_by_id:MANAGE_CHANNELS -> "UPDATE channels SET minimum_role_read = $1 WHERE id = $2" --cache-key-tmpl="atto.channel:{}");
|
||||||
auto_method!(update_channel_minimum_role_write(i32)@get_channel_by_id:MANAGE_CHANNELS -> "UPDATE channels SET minimum_role_write = $1 WHERE id = $2" --cache-key-tmpl="atto.channel:{}");
|
auto_method!(update_channel_minimum_role_write(i32)@get_channel_by_id:MANAGE_CHANNELS -> "UPDATE channels SET minimum_role_write = $1 WHERE id = $2" --cache-key-tmpl="atto.channel:{}");
|
||||||
auto_method!(update_channel_members(Vec<usize>)@get_channel_by_id:MANAGE_CHANNELS -> "UPDATE channels SET members = $1 WHERE id = $2" --serde --cache-key-tmpl="atto.channel:{}");
|
auto_method!(update_channel_members(Vec<usize>)@get_channel_by_id:MANAGE_CHANNELS -> "UPDATE channels SET members = $1 WHERE id = $2" --serde --cache-key-tmpl="atto.channel:{}");
|
||||||
|
auto_method!(update_channel_last_message(i64) -> "UPDATE channels SET last_message = $1 WHERE id = $2" --cache-key-tmpl="atto.channel:{}");
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,7 +164,15 @@ macro_rules! auto_method {
|
||||||
.get(format!($cache_key_tmpl, selector.to_string()))
|
.get(format!($cache_key_tmpl, selector.to_string()))
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
return Ok(serde_json::from_str(&cached).unwrap());
|
match serde_json::from_str(&cached) {
|
||||||
|
Ok(x) => return Ok(x),
|
||||||
|
Err(_) => {
|
||||||
|
self.0
|
||||||
|
.1
|
||||||
|
.remove(format!($cache_key_tmpl, selector.to_string()))
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let conn = match self.0.connect().await {
|
let conn = match self.0.connect().await {
|
||||||
|
|
|
@ -7,5 +7,6 @@ CREATE TABLE IF NOT EXISTS channels (
|
||||||
minimum_role_write INT NOT NULL,
|
minimum_role_write INT NOT NULL,
|
||||||
position INT NOT NULL,
|
position INT NOT NULL,
|
||||||
members TEXT NOT NULL,
|
members TEXT NOT NULL,
|
||||||
title TEXT NOT NULL
|
title TEXT NOT NULL,
|
||||||
|
last_message BIGINT NOT NULL
|
||||||
)
|
)
|
||||||
|
|
|
@ -254,6 +254,10 @@ impl DataManager {
|
||||||
return Err(Error::MiscError(e.to_string()));
|
return Err(Error::MiscError(e.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update channel position
|
||||||
|
self.update_channel_last_message(channel.id, unix_epoch_timestamp() as i64)
|
||||||
|
.await?;
|
||||||
|
|
||||||
// ...
|
// ...
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,21 +24,26 @@ pub struct Channel {
|
||||||
pub members: Vec<usize>,
|
pub members: Vec<usize>,
|
||||||
/// The title of the channel.
|
/// The title of the channel.
|
||||||
pub title: String,
|
pub title: String,
|
||||||
|
/// The timestamp of the last message in the channel.
|
||||||
|
pub last_message: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Channel {
|
impl Channel {
|
||||||
/// Create a new [`Channel`].
|
/// Create a new [`Channel`].
|
||||||
pub fn new(community: usize, owner: usize, position: usize, title: String) -> Self {
|
pub fn new(community: usize, owner: usize, position: usize, title: String) -> Self {
|
||||||
|
let created = unix_epoch_timestamp();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
id: Snowflake::new().to_string().parse::<usize>().unwrap(),
|
id: Snowflake::new().to_string().parse::<usize>().unwrap(),
|
||||||
community,
|
community,
|
||||||
owner,
|
owner,
|
||||||
created: unix_epoch_timestamp(),
|
created,
|
||||||
minimum_role_read: (CommunityPermission::DEFAULT | CommunityPermission::MEMBER).bits(),
|
minimum_role_read: (CommunityPermission::DEFAULT | CommunityPermission::MEMBER).bits(),
|
||||||
minimum_role_write: (CommunityPermission::DEFAULT | CommunityPermission::MEMBER).bits(),
|
minimum_role_write: (CommunityPermission::DEFAULT | CommunityPermission::MEMBER).bits(),
|
||||||
position,
|
position,
|
||||||
members: Vec::new(),
|
members: Vec::new(),
|
||||||
title,
|
title,
|
||||||
|
last_message: created,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
sql_changes/channels_last_message.sql
Normal file
2
sql_changes/channels_last_message.sql
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE channels
|
||||||
|
ADD COLUMN last_message BIGINT NOT NULL DEFAULT '0';
|
Loading…
Add table
Add a link
Reference in a new issue