feat(service): expand service layer with new domain operations
- Add IM service modules: audit, channel roles, custom emojis, forum tags, integrations, invitations, repo links, slash commands, stages, voice, webhooks - Add PR service modules: review requests, templates - Add repo service modules: contributors, release assets, git extras (archive, branch rename, commit extras, diff/merge, tag, tree) - Add user service: social (follow/block) - Add internal auth service - Update existing service modules with expanded functionality - Remove deleted IM modules: articles, delivery trace, drafts, follows, messages, polls, presence, reactions, threads
This commit is contained in:
+19
-39
@@ -2,7 +2,8 @@ use serde::{Deserialize, Serialize};
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::error::AppError;
|
||||
use crate::immediate::{MemberAction, MemberEvent};
|
||||
use crate::service::im::events::{MemberAction, MemberEvent};
|
||||
use crate::models::base_info::UserBaseInfo;
|
||||
use crate::models::channels::ChannelMember;
|
||||
use crate::models::common::Role;
|
||||
use crate::models::workspaces::Workspace;
|
||||
@@ -93,8 +94,7 @@ impl ImService {
|
||||
.begin()
|
||||
.await
|
||||
.map_err(|_| AppError::TxnError)?;
|
||||
sqlx::query("SET LOCAL app.current_user_id = $1")
|
||||
.bind(user_uid)
|
||||
sqlx::query(set_local_user_id(user_uid))
|
||||
.execute(&mut *txn)
|
||||
.await
|
||||
.map_err(AppError::Database)?;
|
||||
@@ -115,13 +115,15 @@ impl ImService {
|
||||
.await
|
||||
.map_err(AppError::Database)?;
|
||||
|
||||
self.update_channel_stats(channel_id, now, &mut txn).await?;
|
||||
self.increment_channel_stat(channel_id, 1, now, &mut txn)
|
||||
.await?;
|
||||
|
||||
txn.commit().await.map_err(|_| AppError::TxnError)?;
|
||||
tracing::info!(channel_id = %channel_id, user_id = %params.user_id, "Member invited");
|
||||
let request_id = Uuid::nil();
|
||||
let event = MemberEvent {
|
||||
channel_id,
|
||||
user: UserBaseInfo::placeholder(member.user_id),
|
||||
user_id: member.user_id,
|
||||
action: MemberAction::Joined,
|
||||
};
|
||||
@@ -184,6 +186,7 @@ impl ImService {
|
||||
let request_id = Uuid::nil();
|
||||
let event = MemberEvent {
|
||||
channel_id,
|
||||
user: UserBaseInfo::placeholder(member.user_id),
|
||||
user_id: member.user_id,
|
||||
action: MemberAction::Updated,
|
||||
};
|
||||
@@ -227,8 +230,7 @@ impl ImService {
|
||||
.begin()
|
||||
.await
|
||||
.map_err(|_| AppError::TxnError)?;
|
||||
sqlx::query("SET LOCAL app.current_user_id = $1")
|
||||
.bind(user_uid)
|
||||
sqlx::query(set_local_user_id(user_uid))
|
||||
.execute(&mut *txn)
|
||||
.await
|
||||
.map_err(AppError::Database)?;
|
||||
@@ -245,13 +247,15 @@ impl ImService {
|
||||
.map_err(AppError::Database)?;
|
||||
ensure_affected(result.rows_affected(), "member not found")?;
|
||||
|
||||
self.update_channel_stats(channel_id, now, &mut txn).await?;
|
||||
self.increment_channel_stat(channel_id, -1, now, &mut txn)
|
||||
.await?;
|
||||
txn.commit().await.map_err(|_| AppError::TxnError)?;
|
||||
|
||||
tracing::info!(channel_id = %channel_id, user_id = %member_user_id, "Member kicked");
|
||||
let request_id = Uuid::nil();
|
||||
let event = MemberEvent {
|
||||
channel_id,
|
||||
user: UserBaseInfo::placeholder(member_user_id),
|
||||
user_id: member_user_id,
|
||||
action: MemberAction::Kicked,
|
||||
};
|
||||
@@ -285,8 +289,7 @@ impl ImService {
|
||||
.begin()
|
||||
.await
|
||||
.map_err(|_| AppError::TxnError)?;
|
||||
sqlx::query("SET LOCAL app.current_user_id = $1")
|
||||
.bind(user_uid)
|
||||
sqlx::query(set_local_user_id(user_uid))
|
||||
.execute(&mut *txn)
|
||||
.await
|
||||
.map_err(AppError::Database)?;
|
||||
@@ -303,11 +306,13 @@ impl ImService {
|
||||
.map_err(AppError::Database)?;
|
||||
ensure_affected(result.rows_affected(), "not a member")?;
|
||||
|
||||
self.update_channel_stats(channel_id, now, &mut txn).await?;
|
||||
self.increment_channel_stat(channel_id, -1, now, &mut txn)
|
||||
.await?;
|
||||
txn.commit().await.map_err(|_| AppError::TxnError)?;
|
||||
let request_id = Uuid::nil();
|
||||
let event = MemberEvent {
|
||||
channel_id,
|
||||
user: UserBaseInfo::placeholder(user_uid),
|
||||
user_id: user_uid,
|
||||
action: MemberAction::Left,
|
||||
};
|
||||
@@ -343,8 +348,7 @@ impl ImService {
|
||||
.begin()
|
||||
.await
|
||||
.map_err(|_| AppError::TxnError)?;
|
||||
sqlx::query("SET LOCAL app.current_user_id = $1")
|
||||
.bind(user_uid)
|
||||
sqlx::query(set_local_user_id(user_uid))
|
||||
.execute(&mut *txn)
|
||||
.await
|
||||
.map_err(AppError::Database)?;
|
||||
@@ -364,11 +368,13 @@ impl ImService {
|
||||
.await
|
||||
.map_err(AppError::Database)?;
|
||||
|
||||
self.update_channel_stats(channel_id, now, &mut txn).await?;
|
||||
self.increment_channel_stat(channel_id, 1, now, &mut txn)
|
||||
.await?;
|
||||
txn.commit().await.map_err(|_| AppError::TxnError)?;
|
||||
let request_id = Uuid::nil();
|
||||
let event = MemberEvent {
|
||||
channel_id,
|
||||
user: UserBaseInfo::placeholder(member.user_id),
|
||||
user_id: member.user_id,
|
||||
action: MemberAction::Joined,
|
||||
};
|
||||
@@ -381,30 +387,4 @@ impl ImService {
|
||||
Ok(member)
|
||||
}
|
||||
|
||||
pub async fn member_update_read(
|
||||
&self,
|
||||
ctx: &ImSession,
|
||||
_wk_name: &str,
|
||||
channel_id: Uuid,
|
||||
message_id: Uuid,
|
||||
) -> Result<ChannelMember, AppError> {
|
||||
let user_uid = ctx.user;
|
||||
let channel = self.resolve_channel(channel_id).await?;
|
||||
self.ensure_channel_readable(user_uid, &channel).await?;
|
||||
|
||||
let now = chrono::Utc::now();
|
||||
sqlx::query_as::<_, ChannelMember>(
|
||||
"UPDATE channel_member SET last_read_message_id = $1, last_read_at = $2, updated_at = $2 \
|
||||
WHERE channel_id = $3 AND user_id = $4 AND status = 'active' \
|
||||
RETURNING id, channel_id, user_id, role, status, muted, pinned, \
|
||||
last_read_message_id, last_read_at, joined_at, left_at, created_at, updated_at",
|
||||
)
|
||||
.bind(message_id)
|
||||
.bind(now)
|
||||
.bind(channel_id)
|
||||
.bind(user_uid)
|
||||
.fetch_one(self.ctx.db.writer())
|
||||
.await
|
||||
.map_err(AppError::Database)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user