diff --git a/crates/data-model/src/compat/session.rs b/crates/data-model/src/compat/session.rs index e07c0fb7d..fc660c3f0 100644 --- a/crates/data-model/src/compat/session.rs +++ b/crates/data-model/src/compat/session.rs @@ -72,6 +72,7 @@ pub struct CompatSession { pub state: CompatSessionState, pub user_id: Ulid, pub device: Option, + pub human_name: Option, pub user_session_id: Option, pub created_at: DateTime, pub is_synapse_admin: bool, diff --git a/crates/storage-pg/.sqlx/query-bb6f55a4cc10bec8ec0fc138485f6b4d308302bb1fa3accb12932d1e5ce457e9.json b/crates/storage-pg/.sqlx/query-9b7363000017fa3dee46441bc0679cb16f9f8df08fa258cc907007fb9bcd0bc7.json similarity index 67% rename from crates/storage-pg/.sqlx/query-bb6f55a4cc10bec8ec0fc138485f6b4d308302bb1fa3accb12932d1e5ce457e9.json rename to crates/storage-pg/.sqlx/query-9b7363000017fa3dee46441bc0679cb16f9f8df08fa258cc907007fb9bcd0bc7.json index 1360f4ba8..e6b0897f7 100644 --- a/crates/storage-pg/.sqlx/query-bb6f55a4cc10bec8ec0fc138485f6b4d308302bb1fa3accb12932d1e5ce457e9.json +++ b/crates/storage-pg/.sqlx/query-9b7363000017fa3dee46441bc0679cb16f9f8df08fa258cc907007fb9bcd0bc7.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT compat_session_id\n , device_id\n , user_id\n , user_session_id\n , created_at\n , finished_at\n , is_synapse_admin\n , user_agent\n , last_active_at\n , last_active_ip as \"last_active_ip: IpAddr\"\n FROM compat_sessions\n WHERE compat_session_id = $1\n ", + "query": "\n SELECT compat_session_id\n , device_id\n , human_name\n , user_id\n , user_session_id\n , created_at\n , finished_at\n , is_synapse_admin\n , user_agent\n , last_active_at\n , last_active_ip as \"last_active_ip: IpAddr\"\n FROM compat_sessions\n WHERE compat_session_id = $1\n ", "describe": { "columns": [ { @@ -15,41 +15,46 @@ }, { "ordinal": 2, + "name": "human_name", + "type_info": "Text" + }, + { + "ordinal": 3, "name": "user_id", "type_info": "Uuid" }, { - "ordinal": 3, + "ordinal": 4, "name": "user_session_id", "type_info": "Uuid" }, { - "ordinal": 4, + "ordinal": 5, "name": "created_at", "type_info": "Timestamptz" }, { - "ordinal": 5, + "ordinal": 6, "name": "finished_at", "type_info": "Timestamptz" }, { - "ordinal": 6, + "ordinal": 7, "name": "is_synapse_admin", "type_info": "Bool" }, { - "ordinal": 7, + "ordinal": 8, "name": "user_agent", "type_info": "Text" }, { - "ordinal": 8, + "ordinal": 9, "name": "last_active_at", "type_info": "Timestamptz" }, { - "ordinal": 9, + "ordinal": 10, "name": "last_active_ip: IpAddr", "type_info": "Inet" } @@ -62,6 +67,7 @@ "nullable": [ false, true, + true, false, true, false, @@ -72,5 +78,5 @@ true ] }, - "hash": "bb6f55a4cc10bec8ec0fc138485f6b4d308302bb1fa3accb12932d1e5ce457e9" + "hash": "9b7363000017fa3dee46441bc0679cb16f9f8df08fa258cc907007fb9bcd0bc7" } diff --git a/crates/storage-pg/migrations/20250129154003_compat_sessions_device_name.sql b/crates/storage-pg/migrations/20250129154003_compat_sessions_device_name.sql new file mode 100644 index 000000000..28294d5db --- /dev/null +++ b/crates/storage-pg/migrations/20250129154003_compat_sessions_device_name.sql @@ -0,0 +1,9 @@ +-- Copyright 2025 New Vector Ltd. +-- +-- SPDX-License-Identifier: AGPL-3.0-only +-- Please see LICENSE in the repository root for full details. + +ALTER TABLE compat_sessions + -- Stores a human-readable name for the device. + -- syn2mas behaviour: Will be populated from the device name in Synapse. + ADD COLUMN human_name TEXT; diff --git a/crates/storage-pg/src/app_session.rs b/crates/storage-pg/src/app_session.rs index 7a71036c9..b812e37e9 100644 --- a/crates/storage-pg/src/app_session.rs +++ b/crates/storage-pg/src/app_session.rs @@ -64,6 +64,7 @@ mod priv_ { pub(super) user_id: Option, pub(super) scope_list: Option>, pub(super) device_id: Option, + pub(super) human_name: Option, pub(super) created_at: DateTime, pub(super) finished_at: Option>, pub(super) is_synapse_admin: Option, @@ -91,6 +92,7 @@ impl TryFrom for AppSession { user_id, scope_list, device_id, + human_name, created_at, finished_at, is_synapse_admin, @@ -141,6 +143,7 @@ impl TryFrom for AppSession { state, user_id: user_id.into(), device, + human_name, user_session_id, created_at, is_synapse_admin, @@ -294,6 +297,7 @@ impl AppSessionRepository for PgAppSessionRepository<'_> { AppSessionLookupIden::ScopeList, ) .expr_as(Expr::cust("NULL"), AppSessionLookupIden::DeviceId) + .expr_as(Expr::cust("NULL"), AppSessionLookupIden::HumanName) .expr_as( Expr::col((OAuth2Sessions::Table, OAuth2Sessions::CreatedAt)), AppSessionLookupIden::CreatedAt, @@ -343,6 +347,10 @@ impl AppSessionRepository for PgAppSessionRepository<'_> { Expr::col((CompatSessions::Table, CompatSessions::DeviceId)), AppSessionLookupIden::DeviceId, ) + .expr_as( + Expr::col((CompatSessions::Table, CompatSessions::HumanName)), + AppSessionLookupIden::HumanName, + ) .expr_as( Expr::col((CompatSessions::Table, CompatSessions::CreatedAt)), AppSessionLookupIden::CreatedAt, diff --git a/crates/storage-pg/src/compat/session.rs b/crates/storage-pg/src/compat/session.rs index de5ea6b2f..7d9fa1264 100644 --- a/crates/storage-pg/src/compat/session.rs +++ b/crates/storage-pg/src/compat/session.rs @@ -48,6 +48,7 @@ impl<'c> PgCompatSessionRepository<'c> { struct CompatSessionLookup { compat_session_id: Uuid, device_id: Option, + human_name: Option, user_id: Uuid, user_session_id: Option, created_at: DateTime, @@ -85,6 +86,7 @@ impl TryFrom for CompatSession { user_id: value.user_id.into(), user_session_id: value.user_session_id.map(Ulid::from), device, + human_name: value.human_name, created_at: value.created_at, is_synapse_admin: value.is_synapse_admin, user_agent: value.user_agent.map(UserAgent::parse), @@ -101,6 +103,7 @@ impl TryFrom for CompatSession { struct CompatSessionAndSsoLoginLookup { compat_session_id: Uuid, device_id: Option, + human_name: Option, user_id: Uuid, user_session_id: Option, created_at: DateTime, @@ -143,6 +146,7 @@ impl TryFrom for (CompatSession, Option { r#" SELECT compat_session_id , device_id + , human_name , user_id , user_session_id , created_at @@ -356,6 +361,7 @@ impl CompatSessionRepository for PgCompatSessionRepository<'_> { state: CompatSessionState::default(), user_id: user.id, device: Some(device), + human_name: None, user_session_id: browser_session.map(|s| s.id), created_at, is_synapse_admin, @@ -453,6 +459,10 @@ impl CompatSessionRepository for PgCompatSessionRepository<'_> { Expr::col((CompatSessions::Table, CompatSessions::DeviceId)), CompatSessionAndSsoLoginLookupIden::DeviceId, ) + .expr_as( + Expr::col((CompatSessions::Table, CompatSessions::HumanName)), + CompatSessionAndSsoLoginLookupIden::HumanName, + ) .expr_as( Expr::col((CompatSessions::Table, CompatSessions::UserId)), CompatSessionAndSsoLoginLookupIden::UserId, diff --git a/crates/storage-pg/src/iden.rs b/crates/storage-pg/src/iden.rs index 8393cb247..951764806 100644 --- a/crates/storage-pg/src/iden.rs +++ b/crates/storage-pg/src/iden.rs @@ -43,6 +43,7 @@ pub enum CompatSessions { CompatSessionId, UserId, DeviceId, + HumanName, UserSessionId, CreatedAt, FinishedAt,