refactor: rename files and modules for improved organization
ZhenYi committed
This change is very large, so some diffs are not shown. Clone the repository to see the full change.
Modified app/src/main.rs app/src/main.rs +2 −1 View app/src/main.rs
@@ -27,7 +27,8 @@
2727 use tokio_util::sync::CancellationToken;
2828 use tracing::{info, warn};
2929 use utoipa_swagger_ui::SwaggerUi;
30 use webapi::{openapi::api_doc, router};
30 use webapi::openapi::api_doc;
31 use webapi::router;
3132
3233 export::telemetry::init_tracing();
3334
Modified lib/auth/src/handlers/accept_agreement.rs lib/auth/src/handlers/accept_agreement.rs +3 −3 View lib/auth/src/handlers/accept_agreement.rs
@@ -2,14 +2,14 @@
22use axum::extract::{Path, State};
33
44use export::rest::{AppResponseData, NoData};
5use jwt::Session;
56use serde::{Deserialize, Serialize};
6use jwt::Session;
77use utoipa::ToSchema;
88
99use crate::errors::ApiError;
1010use crate::services::AuthService;
1111use crate::services::agreements::AcceptAgreementResp;
12use jwt::share::session::require_uid;
12use jwt::share::session;
1313
1414#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1515pub struct AcceptAgreementCmd {
@@ -37,7 +37,7 @@
3737 Path(key): Path<String>,
3838 Json(cmd): Json<AcceptAgreementCmd>,
3939) -> Result<AppResponseData<AcceptAgreementResp>, ApiError> {
40 let uid = require_uid(&session)?;
40 let uid = session::require_uid(&session)?;
4141 let resp = service
4242 .accept_agreement(uid, &key, &cmd.version)
4343 .await
Modified lib/auth/src/handlers/account_deletion.rs lib/auth/src/handlers/account_deletion.rs +8 −11 View lib/auth/src/handlers/account_deletion.rs
@@ -1,7 +1,7 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use serde::Serialize;
66use time::OffsetDateTime;
77use utoipa::ToSchema;
@@ -42,7 +42,7 @@
4242 State(service): State<AuthService>,
4343 session: Session,
4444) -> Result<AppResponseData<Option<AccountDeletionDto>>, ApiError> {
45 let uid = require_uid(&session)?;
45 let uid = session::require_uid(&session)?;
4646 let status = deletion::account_deletion_status(&service.state, uid)
4747 .await
4848 .map_err(AuthError::from)?;
@@ -64,14 +64,11 @@
6464 State(service): State<AuthService>,
6565 session: Session,
6666) -> Result<AppResponseData<AccountDeletionDto>, ApiError> {
67 let uid = require_uid(&session)?;
68 let status = deletion::request_account_deletion(
69 &service.state,
70 uid,
71 "user requested account deletion",
72 )
73 .await
74 .map_err(AuthError::from)?;
67 let uid = session::require_uid(&session)?;
68 let status =
69 deletion::request_account_deletion(&service.state, uid, "user requested account deletion")
70 .await
71 .map_err(AuthError::from)?;
7572 Ok(AppResponseData::ok(status.into()))
7673}
7774
@@ -90,7 +87,7 @@
9087 State(service): State<AuthService>,
9188 session: Session,
9289) -> Result<AppResponseData<NoData>, ApiError> {
93 let uid = require_uid(&session)?;
90 let uid = session::require_uid(&session)?;
9491 deletion::cancel_account_deletion(&service.state, uid)
9592 .await
9693 .map_err(AuthError::from)?;
Modified lib/auth/src/handlers/create_report.rs lib/auth/src/handlers/create_report.rs +2 −2 View lib/auth/src/handlers/create_report.rs
@@ -7,7 +7,7 @@
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::reports::{CreateReportCmd, ReportDto};
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[utoipa::path(
1313 post,
@@ -27,7 +27,7 @@
2727 session: Session,
2828 Json(cmd): Json<CreateReportCmd>,
2929) -> Result<AppResponseData<ReportDto>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 let resp = service
3232 .create_report(uid, cmd)
3333 .await
Modified lib/auth/src/handlers/delete_notification.rs lib/auth/src/handlers/delete_notification.rs +2 −2 View lib/auth/src/handlers/delete_notification.rs
@@ -5,7 +5,7 @@
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(notification_id): Path<Uuid>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service
3030 .delete_notification(uid, notification_id)
3131 .await
Modified lib/auth/src/handlers/devices.rs lib/auth/src/handlers/devices.rs +3 −3 View lib/auth/src/handlers/devices.rs
@@ -3,7 +3,7 @@
33use export::pagination::PageQuery;
44use export::rest::AppResponseData;
55use jwt::Session;
6use jwt::share::session::require_uid;
6use jwt::share::session;
77use kenauth::proto::common::v1::PageRequest;
88use serde::{Deserialize, Serialize};
99use sha2::{Digest, Sha256};
@@ -120,7 +120,7 @@
120120 session: Session,
121121 Query(query): Query<PageQuery>,
122122) -> Result<Json<AppResponseData<Vec<DeviceDto>>>, ApiError> {
123 let uid = require_uid(&session)?;
123 let uid = session::require_uid(&session)?;
124124 let client = rpc::client(&service.state)?;
125125 let listed = client
126126 .list_user_sessions(
@@ -181,4 +181,4 @@
181181 })
182182 .collect();
183183 Ok(Json(AppResponseData::ok(devices)))
184}
No newline at end of file
184}
Modified lib/auth/src/handlers/get_preferences.rs lib/auth/src/handlers/get_preferences.rs +2 −2 View lib/auth/src/handlers/get_preferences.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::AuthService;
77use crate::services::preferences::UserPreferencesDto;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 get,
@@ -22,7 +22,7 @@
2222 State(service): State<AuthService>,
2323 session: Session,
2424) -> Result<AppResponseData<UserPreferencesDto>, ApiError> {
25 let uid = require_uid(&session)?;
25 let uid = session::require_uid(&session)?;
2626 let resp = service.preferences(uid).await.map_err(ApiError::from)?;
2727 Ok(AppResponseData::ok(resp))
2828}
Modified lib/auth/src/handlers/get_user.rs lib/auth/src/handlers/get_user.rs +2 −2 View lib/auth/src/handlers/get_user.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55
66use crate::errors::ApiError;
77use crate::services::AuthService;
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(user_id): Path<i64>,
2727) -> Result<AppResponseData<UserPublic>, ApiError> {
28 let caller = require_uid(&session)?;
28 let caller = session::require_uid(&session)?;
2929 let user = service
3030 .public_user(caller, user_id)
3131 .await
Modified lib/auth/src/handlers/jwt_request.rs lib/auth/src/handlers/jwt_request.rs +5 −11 View lib/auth/src/handlers/jwt_request.rs
@@ -3,10 +3,10 @@
33use utoipa::ToSchema;
44
55use crate::errors::ApiError;
6use crate::services::AuthService;
67use export::rest::{AppResponseData, NoData};
7use crate::services::AuthService;
88use jwt::Session;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[derive(Debug, Deserialize, utoipa::ToSchema, utoipa::IntoParams)]
1212pub struct JwtRequestQuery {
@@ -36,7 +36,7 @@
3636 session: Session,
3737 Query(query): Query<JwtRequestQuery>,
3838) -> Result<AppResponseData<JwtRequestResp>, ApiError> {
39 let uid = require_uid(&session)?;
39 let uid = session::require_uid(&session)?;
4040 if query.appid != "chat" {
4141 return Err(ApiError::bad_request("unsupported appid"));
4242 }
@@ -46,17 +46,11 @@
4646 .as_ref()
4747 .ok_or_else(|| ApiError::internal("kenoauth client is not configured"))?;
4848 let issued = client
49 .issue_service_token(
50 uid,
51 2,
52 vec![8, 9],
53 900,
54 &uuid::Uuid::now_v7().to_string(),
55 )
49 .issue_service_token(uid, 2, vec![8, 9], 900, &uuid::Uuid::now_v7().to_string())
5650 .await
5751 .map_err(|error| ApiError::internal(error.to_string()))?;
5852 Ok(AppResponseData::ok(JwtRequestResp {
5953 jwt: issued.service_token,
6054 expires_in_secs: 900,
6155 }))
62}
No newline at end of file
56}
Modified lib/auth/src/handlers/list_notifications.rs lib/auth/src/handlers/list_notifications.rs +3 −3 View lib/auth/src/handlers/list_notifications.rs
@@ -1,13 +1,13 @@
11use axum::extract::{Query, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55use utoipa::IntoParams;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::notifications::NotificationDto;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[derive(Debug, Clone, Copy, Default, Deserialize, IntoParams)]
1313pub struct ListNotificationsQuery {
@@ -35,7 +35,7 @@
3535 session: Session,
3636 Query(query): Query<ListNotificationsQuery>,
3737) -> Result<AppResponseData<export::pagination::Page<NotificationDto>>, ApiError> {
38 let uid = require_uid(&session)?;
38 let uid = session::require_uid(&session)?;
3939 let notifications = service
4040 .list_notifications(
4141 uid,
Modified lib/auth/src/handlers/mark_notifications_read.rs lib/auth/src/handlers/mark_notifications_read.rs +3 −3 View lib/auth/src/handlers/mark_notifications_read.rs
@@ -1,13 +1,13 @@
11use axum::Json;
22use axum::extract::State;
33use export::rest::{AppResponseData, NoData};
4use jwt::Session;
45use serde::Deserialize;
5use jwt::Session;
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::AuthService;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[derive(Debug, Deserialize, utoipa::ToSchema)]
1313pub struct MarkNotificationsReadCmd {
@@ -39,7 +39,7 @@
3939 session: Session,
4040 Json(cmd): Json<MarkNotificationsReadCmd>,
4141) -> Result<AppResponseData<MarkedCountResp>, ApiError> {
42 let uid = require_uid(&session)?;
42 let uid = session::require_uid(&session)?;
4343 let marked = if cmd.all {
4444 service
4545 .mark_all_notifications_read(uid)
Modified lib/auth/src/handlers/me.rs lib/auth/src/handlers/me.rs +3 −3 View lib/auth/src/handlers/me.rs
@@ -7,7 +7,7 @@
77use crate::services::AuthService;
88use crate::services::profile::{ProfileDto, UserMeDto};
99use jwt::Session;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[derive(Debug, Clone, Serialize, ToSchema)]
1313pub struct MeResp {
@@ -30,7 +30,7 @@
3030 State(service): State<AuthService>,
3131 session: Session,
3232) -> Result<AppResponseData<MeResp>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let (user, profile) = service.me(uid).await.map_err(ApiError::from)?;
3535 Ok(AppResponseData::ok(MeResp { user, profile }))
36}
No newline at end of file
36}
Modified lib/auth/src/handlers/mod.rs lib/auth/src/handlers/mod.rs +4 −4 View lib/auth/src/handlers/mod.rs
@@ -4,17 +4,17 @@
44pub mod create_report;
55pub mod delete_notification;
66pub mod devices;
7pub mod password;
87pub mod get_preferences;
98pub mod get_user;
109pub mod jwt_request;
1110pub mod list_agreements;
1211pub mod list_notifications;
1312pub mod mark_notifications_read;
13pub mod me;
14pub mod password;
1415pub mod sessions;
15pub mod me;
16pub mod two_factor;
1617pub mod unread_notifications_count;
1718pub mod update_preferences;
18pub mod two_factor;
1919pub mod update_profile;
20pub mod users;
No newline at end of file
20pub mod users;
Modified lib/auth/src/handlers/password.rs lib/auth/src/handlers/password.rs +3 −3 View lib/auth/src/handlers/password.rs
@@ -3,7 +3,7 @@
33use axum::http::HeaderMap;
44use export::rest::{AppResponseData, NoData};
55use jwt::Session;
6use jwt::share::session::require_uid;
6use jwt::share::session;
77use serde::Deserialize;
88use utoipa::ToSchema;
99
@@ -35,7 +35,7 @@
3535 headers: HeaderMap,
3636 Json(cmd): Json<ChangePasswordCmd>,
3737) -> Result<AppResponseData<NoData>, ApiError> {
38 let uid = require_uid(&session)?;
38 let uid = session::require_uid(&session)?;
3939 let client = rpc::client(&service.state)?;
4040 let keep = session.session_id().unwrap_or_default();
4141 client
@@ -49,4 +49,4 @@
4949 .await
5050 .map_err(|error| ApiError::bad_request(error.to_string()))?;
5151 Ok(AppResponseData::empty())
52}
No newline at end of file
52}
Modified lib/auth/src/handlers/sessions.rs lib/auth/src/handlers/sessions.rs +11 −6 View lib/auth/src/handlers/sessions.rs
@@ -2,7 +2,7 @@
22use export::pagination::{Page, PageQuery, paginate};
33use export::rest::{AppResponseData, NoData};
44use jwt::Session;
5use jwt::share::session::require_uid;
5use jwt::share::session;
66use kenauth::proto::common::v1::{PageRequest, SessionInfo};
77use kenauth::proto::v1::ListUserSessionsResponse;
88use serde::{Deserialize, Serialize};
@@ -126,7 +126,7 @@
126126 session: Session,
127127 Query(query): Query<SessionQuery>,
128128) -> Result<AppResponseData<Page<SessionDto>>, ApiError> {
129 let uid = require_uid(&session)?;
129 let uid = session::require_uid(&session)?;
130130 let client = rpc::client(&service.state)?;
131131 let listed = client
132132 .list_user_sessions(
@@ -158,10 +158,15 @@
158158 State(service): State<AuthService>,
159159 session: Session,
160160) -> Result<AppResponseData<CountResp>, ApiError> {
161 let uid = require_uid(&session)?;
161 let uid = session::require_uid(&session)?;
162162 let client = rpc::client(&service.state)?;
163163 let revoked = client
164 .revoke_user_sessions(uid, session.session_id().unwrap_or_default(), "user_logout", false)
164 .revoke_user_sessions(
165 uid,
166 session.session_id().unwrap_or_default(),
167 "user_logout",
168 false,
169 )
165170 .await
166171 .map_err(|error| ApiError::internal(error.to_string()))?;
167172 Ok(AppResponseData::ok(CountResp {
@@ -186,7 +191,7 @@
186191 session: Session,
187192 Path(session_id): Path<Uuid>,
188193) -> Result<AppResponseData<NoData>, ApiError> {
189 let uid = require_uid(&session)?;
194 let uid = session::require_uid(&session)?;
190195 let client = rpc::client(&service.state)?;
191196 let revoked = client
192197 .revoke_session(uid, &session_id.to_string(), "user_revoked")
@@ -194,4 +199,4 @@
194199 .map_err(|error| ApiError::internal(error.to_string()))?;
195200 let _ = revoked;
196201 Ok(AppResponseData::empty())
197}
No newline at end of file
202}
Modified lib/auth/src/handlers/two_factor.rs lib/auth/src/handlers/two_factor.rs +8 −8 View lib/auth/src/handlers/two_factor.rs
@@ -3,7 +3,7 @@
33use axum::http::HeaderMap;
44use export::rest::{AppResponseData, NoData};
55use jwt::Session;
6use jwt::share::session::require_uid;
6use jwt::share::session;
77use kenauth::proto::common::v1::MfaStatus;
88use serde::{Deserialize, Serialize};
99use utoipa::ToSchema;
@@ -60,7 +60,7 @@
6060 State(service): State<AuthService>,
6161 session: Session,
6262) -> Result<AppResponseData<TotpStatusResp>, ApiError> {
63 let uid = require_uid(&session)?;
63 let uid = session::require_uid(&session)?;
6464 let client = rpc::client(&service.state)?;
6565 let status = client
6666 .get_mfa_status(uid)
@@ -89,7 +89,7 @@
8989 session: Session,
9090 headers: HeaderMap,
9191) -> Result<AppResponseData<TotpSetupResp>, ApiError> {
92 let uid = require_uid(&session)?;
92 let uid = session::require_uid(&session)?;
9393 let client = rpc::client(&service.state)?;
9494 let configured = client
9595 .configure_totp(uid, "TOTP", &rpc::client_ip(&headers))
@@ -119,7 +119,7 @@
119119 headers: HeaderMap,
120120 Json(cmd): Json<TotpEnableCmd>,
121121) -> Result<AppResponseData<RecoveryCodesResp>, ApiError> {
122 let uid = require_uid(&session)?;
122 let uid = session::require_uid(&session)?;
123123 let client = rpc::client(&service.state)?;
124124 let enabled = client
125125 .enable_totp(
@@ -156,7 +156,7 @@
156156 headers: HeaderMap,
157157 Json(cmd): Json<TotpCodeCmd>,
158158) -> Result<AppResponseData<NoData>, ApiError> {
159 let uid = require_uid(&session)?;
159 let uid = session::require_uid(&session)?;
160160 let client = rpc::client(&service.state)?;
161161 client
162162 .disable_totp(uid, cmd.code.trim(), &rpc::client_ip(&headers))
@@ -179,7 +179,7 @@
179179 State(service): State<AuthService>,
180180 session: Session,
181181) -> Result<AppResponseData<RecoveryCodesResp>, ApiError> {
182 let uid = require_uid(&session)?;
182 let uid = session::require_uid(&session)?;
183183 let client = rpc::client(&service.state)?;
184184 let status = client
185185 .get_mfa_status(uid)
@@ -210,7 +210,7 @@
210210 headers: HeaderMap,
211211 Json(cmd): Json<RegenerateRecoveryCodesCmd>,
212212) -> Result<AppResponseData<RecoveryCodesResp>, ApiError> {
213 let uid = require_uid(&session)?;
213 let uid = session::require_uid(&session)?;
214214 let client = rpc::client(&service.state)?;
215215 let regenerated = client
216216 .regenerate_recovery_codes(uid, &rpc::digest(&cmd.password), &rpc::client_ip(&headers))
@@ -222,4 +222,4 @@
222222 used: 0,
223223 codes: regenerated.recovery_codes,
224224 }))
225}
No newline at end of file
225}
Modified lib/auth/src/handlers/unread_notifications_count.rs lib/auth/src/handlers/unread_notifications_count.rs +3 −3 View lib/auth/src/handlers/unread_notifications_count.rs
@@ -1,12 +1,12 @@
11use axum::extract::State;
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Serialize;
4use jwt::Session;
55use utoipa::ToSchema;
66
77use crate::errors::ApiError;
88use crate::services::AuthService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[derive(Debug, Clone, Serialize, ToSchema)]
1212pub struct UnreadCountResp {
@@ -28,7 +28,7 @@
2828 State(service): State<AuthService>,
2929 session: Session,
3030) -> Result<AppResponseData<UnreadCountResp>, ApiError> {
31 let uid = require_uid(&session)?;
31 let uid = session::require_uid(&session)?;
3232 let count = service
3333 .unread_notifications_count(uid)
3434 .await
Modified lib/auth/src/handlers/update_preferences.rs lib/auth/src/handlers/update_preferences.rs +2 −2 View lib/auth/src/handlers/update_preferences.rs
@@ -7,7 +7,7 @@
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::preferences::{UpdatePreferencesCmd, UserPreferencesDto};
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[utoipa::path(
1313 patch,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Json(cmd): Json<UpdatePreferencesCmd>,
2828) -> Result<AppResponseData<UserPreferencesDto>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let prefs = service
3131 .update_preferences(uid, cmd)
3232 .await
Modified lib/auth/src/handlers/update_profile.rs lib/auth/src/handlers/update_profile.rs +2 −2 View lib/auth/src/handlers/update_profile.rs
@@ -7,7 +7,7 @@
77use crate::errors::ApiError;
88use crate::services::AuthService;
99use crate::services::profile::UpdateProfileCmd;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[utoipa::path(
1313 patch,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Json(cmd): Json<UpdateProfileCmd>,
2828) -> Result<AppResponseData<NoData>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 service
3131 .update_profile(uid, cmd)
3232 .await
Modified lib/auth/src/handlers/users.rs lib/auth/src/handlers/users.rs +4 −4 View lib/auth/src/handlers/users.rs
@@ -2,7 +2,7 @@
22use axum::extract::{Path, Query, State};
33use export::rest::{AppResponseData, NoData};
44use jwt::Session;
5use jwt::share::session::require_uid;
5use jwt::share::session;
66use serde::Deserialize;
77use utoipa::IntoParams;
88
@@ -32,7 +32,7 @@
3232 session: Session,
3333 Query(query): Query<UsersBatchQuery>,
3434) -> Result<AppResponseData<Vec<UserPublic>>, ApiError> {
35 let caller = require_uid(&session)?;
35 let caller = session::require_uid(&session)?;
3636 let users = service
3737 .public_users(caller, query.ids)
3838 .await
@@ -57,7 +57,7 @@
5757 session: Session,
5858 Path(username): Path<String>,
5959) -> Result<AppResponseData<UserPublic>, ApiError> {
60 let caller = require_uid(&session)?;
60 let caller = session::require_uid(&session)?;
6161 let user = service
6262 .public_user_by_name(caller, &username)
6363 .await
@@ -87,7 +87,7 @@
8787 session: Session,
8888 Json(cmd): Json<UpdateUsernameCmd>,
8989) -> Result<AppResponseData<UserPublic>, ApiError> {
90 let uid = require_uid(&session)?;
90 let uid = session::require_uid(&session)?;
9191 let user = service
9292 .update_username(uid, &cmd.username)
9393 .await
Modified lib/auth/src/oauth/callback.rs lib/auth/src/oauth/callback.rs +4 −2 View lib/auth/src/oauth/callback.rs
@@ -42,7 +42,9 @@
4242 .await
4343 .map_err(ApiError::from)?
4444 else {
45 return Err(ApiError::bad_request("authorization state is unknown or expired"));
45 return Err(ApiError::bad_request(
46 "authorization state is unknown or expired",
47 ));
4648 };
4749
4850 let redirect_uri = login_state
@@ -98,4 +100,4 @@
98100 cookies.push(jwt::refresh_cookie(&config.oauth, &refresh));
99101 }
100102 Ok(redirect_with_cookies(&login_state.redirect, &cookies))
101}
No newline at end of file
103}
Modified lib/auth/src/oauth/login.rs lib/auth/src/oauth/login.rs +14 −3 View lib/auth/src/oauth/login.rs
@@ -59,7 +59,14 @@
5959 .map_err(ApiError::from)?;
6060
6161 // 注册后直接拿授权码,省掉一次「请再点一次登录」。
62 let authorization = authorize_url(config, &redirect_uri, &state_token, &verifier, &nonce, false);
62 let authorization = authorize_url(
63 config,
64 &redirect_uri,
65 &state_token,
66 &verifier,
67 &nonce,
68 false,
69 );
6370
6471 let mut serializer = form_urlencoded::Serializer::new(String::new());
6572 serializer.append_pair("callback_url", &authorization);
@@ -132,7 +139,11 @@
132139 if silent {
133140 serializer.append_pair("prompt", "none");
134141 }
135 format!("{}?{}", config.authorization_endpoint(), serializer.finish())
142 format!(
143 "{}?{}",
144 config.authorization_endpoint(),
145 serializer.finish()
146 )
136147}
137148
138149/// 未指定去向时的落点:登录/注册完成直接进工作区。
@@ -144,4 +155,4 @@
144155 Some(value) if value.starts_with('/') && !value.starts_with("//") => value.to_string(),
145156 _ => DEFAULT_REDIRECT.to_string(),
146157 }
147}
No newline at end of file
158}
Modified lib/auth/src/oauth/logout.rs lib/auth/src/oauth/logout.rs +1 −1 View lib/auth/src/oauth/logout.rs
@@ -30,4 +30,4 @@
3030 append_cookie(&mut response, &jwt::clear_session_cookie(&config.oauth));
3131 append_cookie(&mut response, &jwt::clear_refresh_cookie(&config.oauth));
3232 Ok(response)
33}
No newline at end of file
33}
Modified lib/auth/src/oauth/mod.rs lib/auth/src/oauth/mod.rs +2 −174 View lib/auth/src/oauth/mod.rs
@@ -1,13 +1,3 @@
1use axum::http::header::SET_COOKIE;
2use axum::http::{HeaderMap, HeaderValue};
3use axum::response::{IntoResponse, Redirect, Response};
4use serde::{Deserialize, Serialize};
5
6use config::oauth::OAuthConfig;
7
8use crate::errors::AuthError;
9use crate::services::AuthService;
10
111pub mod callback;
122pub mod login;
133pub mod logout;
@@ -16,168 +6,6 @@
166pub mod revalidate;
177pub mod state;
188
19pub const STATE_TTL_SECS: u64 = 600;
20pub const REFRESH_LOCK_TTL_SECS: u64 = 10;
9mod flow;
2110
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct LoginState {
24 pub redirect: String,
25 pub verifier: String,
26 pub nonce: String,
27 /// 本次握手实际发给 KenOAuth 的 redirect_uri。
28 ///
29 /// 换码时必须原样回传(OAuth 要求两者完全一致),所以随 state 一起存。
30 /// `#[serde(default)]` 保证旧 state 仍能解析。
31 #[serde(default)]
32 pub redirect_uri: Option<String>,
33}
34
35#[derive(Debug, Deserialize)]
36pub struct TokenResponse {
37 pub access_token: String,
38 #[serde(default)]
39 pub refresh_token: Option<String>,
40 #[serde(default)]
41 pub id_token: Option<String>,
42 #[serde(default)]
43 pub expires_in: i64,
44}
45
46pub fn random_token(bytes: usize) -> String {
47 use base64::Engine as _;
48 let mut buffer = vec![0u8; bytes];
49 rand::Rng::fill(&mut rand::thread_rng(), buffer.as_mut_slice());
50 base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(buffer)
51}
52
53pub fn pkce_challenge(verifier: &str) -> String {
54 use base64::Engine as _;
55 use sha2::{Digest, Sha256};
56 let digest = Sha256::digest(verifier.as_bytes());
57 base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(digest)
58}
59
60pub fn read_cookie_header<'a>(headers: &'a HeaderMap, name: &str) -> Option<&'a str> {
61 let value = headers.get(axum::http::header::COOKIE)?.to_str().ok()?;
62 jwt::read_cookie(value, name)
63}
64
65pub fn append_cookie(response: &mut Response, cookie: &str) {
66 if let Ok(value) = HeaderValue::from_str(cookie) {
67 response.headers_mut().append(SET_COOKIE, value);
68 }
69}
70
71pub fn redirect_with_cookies(location: &str, cookies: &[String]) -> Response {
72 let mut response = Redirect::to(location).into_response();
73 for cookie in cookies {
74 append_cookie(&mut response, cookie);
75 }
76 response
77}
78
79pub async fn exchange_code(
80 service: &AuthService,
81 code: &str,
82 verifier: &str,
83 redirect_uri: &str,
84) -> Result<TokenResponse, AuthError> {
85 let config = &service.config().oauth;
86 local_grant(
87 service,
88 kenoauth::auth::protocol::TokenRequest {
89 grant_type: "authorization_code".to_owned(),
90 code: Some(code.to_owned()),
91 redirect_uri: Some(redirect_uri.to_owned()),
92 code_verifier: Some(verifier.to_owned()),
93 refresh_token: None,
94 client_id: Some(config.client_id.clone()),
95 client_secret: (!config.client_secret.is_empty()).then(|| config.client_secret.clone()),
96 scope: None,
97 },
98 )
99 .await
100}
101
102pub async fn refresh_grant(
103 service: &AuthService,
104 refresh_token: &str,
105) -> Result<TokenResponse, AuthError> {
106 let config = &service.config().oauth;
107 local_grant(
108 service,
109 kenoauth::auth::protocol::TokenRequest {
110 grant_type: "refresh_token".to_owned(),
111 code: None,
112 redirect_uri: None,
113 code_verifier: None,
114 refresh_token: Some(refresh_token.to_owned()),
115 client_id: Some(config.client_id.clone()),
116 client_secret: (!config.client_secret.is_empty()).then(|| config.client_secret.clone()),
117 scope: None,
118 },
119 )
120 .await
121}
122
123async fn local_grant(
124 service: &AuthService,
125 form: kenoauth::auth::protocol::TokenRequest,
126) -> Result<TokenResponse, AuthError> {
127 let client = service
128 .state
129 .kenauth
130 .as_ref()
131 .ok_or_else(|| AuthError::Internal("identity service is unavailable".to_owned()))?;
132 let value = kenoauth::auth::protocol::exchange_local(client.service(), &form)
133 .await
134 .map_err(|error| {
135 if error.status >= 500 {
136 AuthError::Internal(error.message)
137 } else {
138 AuthError::BadRequest(error.message)
139 }
140 })?;
141 serde_json::from_value(value)
142 .map_err(|error| AuthError::Internal(format!("invalid token response: {error}")))
143}
144/// 本次请求应该用哪个 `redirect_uri`。
145///
146/// 取 `x-forwarded-host`(vite / 网关都会带),退化为 `host`;
147/// 只有命中 `oauth.redirect_uri_hosts` 白名单才按该主机改写,路径沿用配置里的。
148pub fn resolve_redirect_uri(config: &OAuthConfig, headers: &HeaderMap) -> String {
149 let host = headers
150 .get("x-forwarded-host")
151 .and_then(|value| value.to_str().ok())
152 .or_else(|| {
153 headers
154 .get(axum::http::header::HOST)
155 .and_then(|value| value.to_str().ok())
156 })
157 // 代理链可能给逗号分隔的列表,取第一跳。
158 .map(|value| {
159 value
160 .split(',')
161 .next()
162 .unwrap_or(value)
163 .trim()
164 .to_ascii_lowercase()
165 });
166
167 let Some(host) = host else {
168 return config.redirect_uri.clone();
169 };
170 if host.is_empty()
171 || !config
172 .redirect_uri_hosts
173 .iter()
174 .any(|allowed| allowed.trim().eq_ignore_ascii_case(&host))
175 {
176 return config.redirect_uri.clone();
177 }
178
179 let path = url::Url::parse(&config.redirect_uri)
180 .map(|url| url.path().to_string())
181 .unwrap_or_else(|_| "/api/v1/auth/callback".to_string());
182 format!("http://{host}{path}")
183}
11pub use flow::*;
Modified lib/auth/src/oauth/refresh.rs lib/auth/src/oauth/refresh.rs +17 −6 View lib/auth/src/oauth/refresh.rs
@@ -2,8 +2,7 @@
22
33use axum::Extension;
44use axum::extract::State;
5use axum::http::HeaderMap;
6use axum::http::StatusCode;
5use axum::http::{HeaderMap, StatusCode};
76use axum::response::{IntoResponse, Response};
87
98use crate::errors::ApiError;
@@ -21,10 +20,18 @@
2120 .ok_or_else(ApiError::unauthorized)?;
2221
2322 let lock_key = format!("oauth:refresh:{}", token_fingerprint(&refresh_token));
24 let mut acquired = service.state.redis.set_nx_ex(&lock_key, REFRESH_LOCK_TTL_SECS).await;
23 let mut acquired = service
24 .state
25 .redis
26 .set_nx_ex(&lock_key, REFRESH_LOCK_TTL_SECS)
27 .await;
2528 if !acquired {
2629 tokio::time::sleep(std::time::Duration::from_millis(200)).await;
27 acquired = service.state.redis.set_nx_ex(&lock_key, REFRESH_LOCK_TTL_SECS).await;
30 acquired = service
31 .state
32 .redis
33 .set_nx_ex(&lock_key, REFRESH_LOCK_TTL_SECS)
34 .await;
2835 }
2936 if !acquired {
3037 return Err(ApiError::conflict("another refresh is already in flight"));
@@ -50,7 +57,11 @@
5057 let mut response = StatusCode::NO_CONTENT.into_response();
5158 append_cookie(
5259 &mut response,
53 &jwt::session_cookie(&config.oauth, &tokens.access_token, tokens.expires_in.max(60)),
60 &jwt::session_cookie(
61 &config.oauth,
62 &tokens.access_token,
63 tokens.expires_in.max(60),
64 ),
5465 );
5566 if let Some(refresh) = tokens.refresh_token {
5667 append_cookie(&mut response, &jwt::refresh_cookie(&config.oauth, &refresh));
@@ -63,4 +74,4 @@
6374 use sha2::{Digest, Sha256};
6475 let digest = Sha256::digest(token.as_bytes());
6576 base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(digest)
66}
No newline at end of file
77}
Modified lib/auth/src/oauth/revalidate.rs lib/auth/src/oauth/revalidate.rs +8 −9 View lib/auth/src/oauth/revalidate.rs
@@ -61,13 +61,9 @@
6161 .await
6262 {
6363 Ok(_) => {
64 let _ = export::redis::set_string(
65 &state.redis,
66 &key,
67 "1",
68 state.config.oauth.recheck_secs,
69 )
70 .await;
64 let _ =
65 export::redis::set_string(&state.redis, &key, "1", state.config.oauth.recheck_secs)
66 .await;
7167 next.run(request).await
7268 }
7369 Err(kenauth::KenAuthError::Unauthenticated) | Err(kenauth::KenAuthError::NotFound) => {
@@ -84,9 +80,12 @@
8480 })),
8581 )
8682 .into_response();
87 append_cookie(&mut response, &jwt::clear_session_cookie(&state.config.oauth));
83 append_cookie(
84 &mut response,
85 &jwt::clear_session_cookie(&state.config.oauth),
86 );
8887 response
8988 }
9089 Err(_) => next.run(request).await,
9190 }
92}
No newline at end of file
91}
Modified lib/auth/src/oauth/state.rs lib/auth/src/oauth/state.rs +1 −1 View lib/auth/src/oauth/state.rs
@@ -23,4 +23,4 @@
2323 return Ok(None);
2424 };
2525 Ok(serde_json::from_str(&raw).ok())
26}
No newline at end of file
26}
Modified lib/auth/src/services/mod.rs lib/auth/src/services/mod.rs +2 −72 View lib/auth/src/services/mod.rs
@@ -1,12 +1,5 @@
1use std::sync::Arc;
2
3use config::AppConfig;
4use export::{AppDatabase, AppRedis, AppState};
5use models::users::access_scope::AccessKeyScope;
6
7use crate::errors::AuthError;
8
91pub mod agreements;
2mod auth_service;
103pub mod notifications;
114pub mod preferences;
125pub mod profile;
@@ -14,67 +7,4 @@
147pub mod suspensions;
158pub mod users;
169
17pub struct VerifiedAccessKey {
18 pub user_id: i64,
19 pub scope: AccessKeyScope,
20}
21
22#[derive(Clone)]
23pub struct AuthService {
24 pub state: AppState,
25}
26
27impl AuthService {
28 pub fn new(state: AppState) -> Self {
29 Self { state }
30 }
31
32 pub fn config(&self) -> &AppConfig {
33 &self.state.config
34 }
35
36 pub fn db(&self) -> &Arc<AppDatabase> {
37 &self.state.database
38 }
39
40 pub fn redis(&self) -> &AppRedis {
41 &self.state.redis
42 }
43
44 /// Pick the mail language for one recipient.
45 pub async fn mail_locale(
46 &self,
47 uid: Option<i64>,
48 accept_language: Option<&str>,
49 ) -> i18n::UiLocale {
50 let fallback = i18n::UiLocale::parse(self.config().email.default_locale())
51 .unwrap_or(i18n::UiLocale::En);
52 match uid {
53 Some(uid) => i18n::resolve_user_locale(self.db().read(), uid, fallback).await,
54 None => i18n::negotiate_accept_language(accept_language, fallback),
55 }
56 }
57
58 pub async fn verify_access_token(
59 &self,
60 token: &str,
61 ) -> Result<Option<VerifiedAccessKey>, AuthError> {
62 let Some(client) = self.state.kenauth.as_ref() else {
63 return Ok(None);
64 };
65 let principal = match client.verify_access_key(token, Vec::new()).await {
66 Ok(Some(principal)) => principal,
67 Ok(None) => return Ok(None),
68 Err(error) => return Err(AuthError::Internal(error.to_string())),
69 };
70 let write = principal.scopes.iter().any(|scope| *scope == 12);
71 Ok(Some(VerifiedAccessKey {
72 user_id: principal.user_id,
73 scope: if write {
74 AccessKeyScope::Write
75 } else {
76 AccessKeyScope::Read
77 },
78 }))
79 }
80}
10pub use auth_service::{AuthService, VerifiedAccessKey};
Modified lib/auth/src/services/profile.rs lib/auth/src/services/profile.rs +3 −5 View lib/auth/src/services/profile.rs
@@ -1,15 +1,13 @@
11use models::users::user::ProfileVisibility;
22use models::users::{user, user_profiles};
3use sea_orm::{
4 ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, QueryFilter, Set, TransactionTrait,
5};
3use sea_orm::{ActiveModelTrait, EntityTrait, IntoActiveModel, Set, TransactionTrait};
64use serde::{Deserialize, Serialize};
75use time::{Date, OffsetDateTime};
86
97use super::AuthService;
108use crate::errors::AuthError;
119use crate::share::types::UserPublic;
12use crate::share::validate::validate_age;
10use crate::share::validate;
1311
1412#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
1513pub struct UserMeDto {
@@ -188,7 +186,7 @@
188186 user_active.timezone = Set(Some(timezone));
189187 }
190188 if let Some(dob) = cmd.date_of_birth {
191 validate_age(Some(dob), self.config().auth.min_age)?;
189 validate::validate_age(Some(dob), self.config().auth.min_age)?;
192190 }
193191 if let Some(visibility) = cmd.visibility {
194192 user_active.visibility = Set(visibility);
Modified lib/auth/src/share/guard.rs lib/auth/src/share/guard.rs +1 −1 View lib/auth/src/share/guard.rs
@@ -13,4 +13,4 @@
1313 next: Next,
1414) -> Response {
1515 session_guard::<AuthService>(State(service), session, request, next).await
16}
No newline at end of file
16}
Modified lib/auth/src/share/rpc.rs lib/auth/src/share/rpc.rs +4 −2 View lib/auth/src/share/rpc.rs
@@ -41,6 +41,8 @@
4141 out
4242}
4343pub fn datetime(seconds: i64, nanos: i32) -> Option<OffsetDateTime> {
44 OffsetDateTime::from_unix_timestamp_nanos(i128::from(seconds) * 1_000_000_000 + i128::from(nanos))
45 .ok()
44 OffsetDateTime::from_unix_timestamp_nanos(
45 i128::from(seconds) * 1_000_000_000 + i128::from(nanos),
46 )
47 .ok()
4648}
Modified lib/auth/src/templates/page.rs lib/auth/src/templates/page.rs +4 −4 View lib/auth/src/templates/page.rs
@@ -4,7 +4,7 @@
44
55use crate::share::types::AgreementDoc;
66
7use super::common::page_shell;
7use super::common;
88
99pub fn page_agreement(doc: &AgreementDoc, html_content: &str, locale: UiLocale) -> Html<String> {
1010 let body = html! {
@@ -23,7 +23,7 @@
2323 }
2424 }
2525 };
26 page_shell(&doc.title, body, locale)
26 common::page_shell(&doc.title, body, locale)
2727}
2828
2929pub fn page_verify_result(ok: bool, locale: UiLocale) -> Html<String> {
@@ -52,7 +52,7 @@
5252 }
5353 }
5454 };
55 page_shell(title, body, locale)
55 common::page_shell(title, body, locale)
5656}
5757
5858pub fn page_message(ok: bool, title: &str, message: &str, locale: UiLocale) -> Html<String> {
@@ -72,7 +72,7 @@
7272 }
7373 }
7474 };
75 page_shell(title, body, locale)
75 common::page_shell(title, body, locale)
7676}
7777
7878pub fn render_markdown(input: &str) -> String {
Modified lib/auth/src/errors.rs lib/auth/src/errors.rs +0 −3 View lib/auth/src/errors.rs
@@ -1,6 +1,5 @@
11use std::fmt;
22
3
43#[derive(Debug)]
54pub enum AuthError {
65 BadRequest(String),
@@ -58,13 +57,11 @@
5857 }
5958 }
6059}
61
6260
6361export::db_error_conversions!(AuthError);
6462export::redis_error_conversion!(AuthError);
6563export::export_error_conversion!(AuthError);
6664export::json_payload_conversion!(AuthError);
67
6865
6966export::api_error! {
7067 log: "auth",
Modified lib/auth/src/openapi.rs lib/auth/src/openapi.rs +1 −1 View lib/auth/src/openapi.rs
@@ -86,4 +86,4 @@
8686 handlers::devices::DeviceDto,
8787 ))
8888)]
89pub struct AuthApiDoc;
No newline at end of file
89pub struct AuthApiDoc;
Modified lib/auth/src/routes.rs lib/auth/src/routes.rs +26 −13 View lib/auth/src/routes.rs
@@ -1,9 +1,10 @@
1use axum::Router;
2use axum::middleware;
31use axum::routing::{delete, get, post, put};
2use axum::{Router, middleware};
43
54use crate::handlers::accept_agreement::accept_agreement;
6use crate::handlers::account_deletion::{account_deletion_status, cancel_account_deletion, request_account_deletion};
5use crate::handlers::account_deletion::{
6 account_deletion_status, cancel_account_deletion, request_account_deletion,
7};
78use crate::handlers::agreement_page::agreement_page;
89use crate::handlers::create_report::create_report;
910use crate::handlers::delete_notification::delete_notification;
@@ -43,7 +44,10 @@
4344 .post(request_account_deletion)
4445 .delete(cancel_account_deletion),
4546 )
46 .route("/auth/jwt-request", get(crate::handlers::jwt_request::jwt_request))
47 .route(
48 "/auth/jwt-request",
49 get(crate::handlers::jwt_request::jwt_request),
50 )
4751 .route("/me/username", put(users::update_username))
4852 .route(
4953 "/me/preferences",
@@ -68,11 +72,23 @@
6872 "/auth/password/change",
6973 post(crate::handlers::password::change_password),
7074 )
71 .route("/auth/2fa/status", get(crate::handlers::two_factor::totp_status))
72 .route("/auth/2fa/setup", post(crate::handlers::two_factor::totp_setup))
73 .route("/auth/2fa/enable", post(crate::handlers::two_factor::totp_enable))
74 .route("/auth/2fa/disable", post(crate::handlers::two_factor::totp_disable))
7575 .route(
76 "/auth/2fa/status",
77 get(crate::handlers::two_factor::totp_status),
78 )
79 .route(
80 "/auth/2fa/setup",
81 post(crate::handlers::two_factor::totp_setup),
82 )
83 .route(
84 "/auth/2fa/enable",
85 post(crate::handlers::two_factor::totp_enable),
86 )
87 .route(
88 "/auth/2fa/disable",
89 post(crate::handlers::two_factor::totp_disable),
90 )
91 .route(
7692 "/auth/2fa/recovery-codes",
7793 get(crate::handlers::two_factor::recovery_codes)
7894 .put(crate::handlers::two_factor::regenerate_recovery_codes),
@@ -86,10 +102,7 @@
86102 "/me/sessions/{session_id}",
87103 delete(crate::handlers::sessions::revoke_session),
88104 )
89 .route(
90 "/me/devices",
91 get(crate::handlers::devices::list_devices),
92 )
105 .route("/me/devices", get(crate::handlers::devices::list_devices))
93106 .route_layer(middleware::from_fn_with_state(service, auth_guard));
94107
95108 public.merge(authed)
@@ -99,4 +112,4 @@
99112 Router::new()
100113 .route("/agreements/{key}", get(agreement_page))
101114 .with_state(service)
102}
No newline at end of file
115}
Modified lib/chat/src/handlers/attachments.rs lib/chat/src/handlers/attachments.rs +6 −6 View lib/chat/src/handlers/attachments.rs
@@ -3,9 +3,9 @@
33use axum::response::{IntoResponse, Response};
44use export::rest::{AppResponseData, NoData};
55use imaging::layout::ImageVariant;
6use serde::Deserialize;
76use jwt::Session;
8use jwt::share::session::require_uid;
7use jwt::share::session;
8use serde::Deserialize;
99use utoipa::{IntoParams, ToSchema};
1010use uuid::Uuid;
1111
@@ -33,7 +33,7 @@
3333 session: Session,
3434 Json(cmd): Json<CreateAttachmentCmd>,
3535) -> Result<AppResponseData<UploadIntentDto>, ApiError> {
36 let uid = require_uid(&session)?;
36 let uid = session::require_uid(&session)?;
3737 let intent = service.create_attachment(uid, cmd).await?;
3838 Ok(AppResponseData::ok(intent))
3939}
@@ -58,7 +58,7 @@
5858 Path(attachment_id): Path<Uuid>,
5959 Json(cmd): Json<FinalizeAttachmentCmd>,
6060) -> Result<AppResponseData<AttachmentDto>, ApiError> {
61 let uid = require_uid(&session)?;
61 let uid = session::require_uid(&session)?;
6262 let dto = service.finalize_attachment(uid, attachment_id, cmd).await?;
6363 Ok(AppResponseData::ok(dto))
6464}
@@ -80,7 +80,7 @@
8080 session: Session,
8181 Path(attachment_id): Path<Uuid>,
8282) -> Result<AppResponseData<AttachmentDto>, ApiError> {
83 let uid = require_uid(&session)?;
83 let uid = session::require_uid(&session)?;
8484 let dto = service.get_attachment_meta(uid, attachment_id).await?;
8585 Ok(AppResponseData::ok(dto))
8686}
@@ -112,7 +112,7 @@
112112 Path(attachment_id): Path<Uuid>,
113113 Query(query): Query<AttachmentVariantQuery>,
114114) -> Result<Response, ApiError> {
115 let uid = require_uid(&session)?;
115 let uid = session::require_uid(&session)?;
116116 let (row, body, content_type) = service
117117 .download_attachment(
118118 uid,
Modified lib/chat/src/handlers/bookmarks.rs lib/chat/src/handlers/bookmarks.rs +5 −5 View lib/chat/src/handlers/bookmarks.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -26,7 +26,7 @@
2626 Path(room_id): Path<Uuid>,
2727 Query(page): Query<export::pagination::PageQuery>,
2828) -> Result<AppResponseData<export::pagination::Page<BookmarkDto>>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let bookmarks = service.list_bookmarks(uid, room_id).await?;
3131 Ok(AppResponseData::ok(export::pagination::paginate(
3232 bookmarks, &page,
@@ -53,7 +53,7 @@
5353 Path(room_id): Path<Uuid>,
5454 Json(cmd): Json<CreateBookmarkCmd>,
5555) -> Result<AppResponseData<BookmarkDto>, ApiError> {
56 let uid = require_uid(&session)?;
56 let uid = session::require_uid(&session)?;
5757 let dto = service.create_bookmark(uid, room_id, cmd).await?;
5858 Ok(AppResponseData::ok(dto))
5959}
@@ -81,7 +81,7 @@
8181 Path((room_id, bookmark_id)): Path<(Uuid, Uuid)>,
8282 Json(cmd): Json<UpdateBookmarkCmd>,
8383) -> Result<AppResponseData<BookmarkDto>, ApiError> {
84 let uid = require_uid(&session)?;
84 let uid = session::require_uid(&session)?;
8585 let dto = service
8686 .update_bookmark(uid, room_id, bookmark_id, cmd)
8787 .await?;
@@ -108,7 +108,7 @@
108108 session: Session,
109109 Path((room_id, bookmark_id)): Path<(Uuid, Uuid)>,
110110) -> Result<AppResponseData<NoData>, ApiError> {
111 let uid = require_uid(&session)?;
111 let uid = session::require_uid(&session)?;
112112 service.delete_bookmark(uid, room_id, bookmark_id).await?;
113113 Ok(AppResponseData::empty())
114114}
Modified lib/chat/src/handlers/dms.rs lib/chat/src/handlers/dms.rs +4 −4 View lib/chat/src/handlers/dms.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -29,7 +29,7 @@
2929 session: Session,
3030 Json(cmd): Json<OpenDmCmd>,
3131) -> Result<AppResponseData<DmDto>, ApiError> {
32 let uid = require_uid(&session)?;
32 let uid = session::require_uid(&session)?;
3333 let dto = service.open_dm(uid, cmd).await?;
3434 Ok(AppResponseData::ok(dto))
3535}
@@ -51,7 +51,7 @@
5151 session: Session,
5252 Query(page): Query<export::pagination::PageQuery>,
5353) -> Result<AppResponseData<export::pagination::Page<DmDto>>, ApiError> {
54 let uid = require_uid(&session)?;
54 let uid = session::require_uid(&session)?;
5555 let dms = service.list_dms(uid).await?;
5656 Ok(AppResponseData::ok(export::pagination::paginate(
5757 dms, &page,
@@ -75,7 +75,7 @@
7575 session: Session,
7676 Path(room_id): Path<Uuid>,
7777) -> Result<AppResponseData<NoData>, ApiError> {
78 let uid = require_uid(&session)?;
78 let uid = session::require_uid(&session)?;
7979 service.close_dm(uid, room_id).await?;
8080 Ok(AppResponseData::empty())
8181}
Modified lib/chat/src/handlers/drafts.rs lib/chat/src/handlers/drafts.rs +5 −5 View lib/chat/src/handlers/drafts.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -32,7 +32,7 @@
3232 Path(room_id): Path<Uuid>,
3333 Json(cmd): Json<UpsertDraftCmd>,
3434) -> Result<AppResponseData<DraftDto>, ApiError> {
35 let uid = require_uid(&session)?;
35 let uid = session::require_uid(&session)?;
3636 let dto = service.upsert_draft(uid, room_id, cmd).await?;
3737 Ok(AppResponseData::ok(dto))
3838}
@@ -55,7 +55,7 @@
5555 Path(room_id): Path<Uuid>,
5656 Query(q): Query<DraftQuery>,
5757) -> Result<AppResponseData<Option<DraftDto>>, ApiError> {
58 let uid = require_uid(&session)?;
58 let uid = session::require_uid(&session)?;
5959 let dto = service.get_draft(uid, room_id, q.thread_id).await?;
6060 Ok(AppResponseData::ok(dto))
6161}
@@ -76,7 +76,7 @@
7676 session: Session,
7777 Query(page): Query<export::pagination::PageQuery>,
7878) -> Result<AppResponseData<export::pagination::Page<DraftDto>>, ApiError> {
79 let uid = require_uid(&session)?;
79 let uid = session::require_uid(&session)?;
8080 let drafts = service.list_my_drafts(uid).await?;
8181 Ok(AppResponseData::ok(export::pagination::paginate(
8282 drafts, &page,
@@ -101,7 +101,7 @@
101101 Path(room_id): Path<Uuid>,
102102 Query(q): Query<DraftQuery>,
103103) -> Result<AppResponseData<NoData>, ApiError> {
104 let uid = require_uid(&session)?;
104 let uid = session::require_uid(&session)?;
105105 service.delete_draft(uid, room_id, q.thread_id).await?;
106106 Ok(AppResponseData::empty())
107107}
Modified lib/chat/src/handlers/emojis.rs lib/chat/src/handlers/emojis.rs +6 −6 View lib/chat/src/handlers/emojis.rs
@@ -3,7 +3,7 @@
33use axum::response::{IntoResponse, Response};
44use export::rest::{AppResponseData, NoData};
55use jwt::Session;
6use jwt::share::session::require_uid;
6use jwt::share::session;
77use uuid::Uuid;
88
99use crate::errors::ApiError;
@@ -28,7 +28,7 @@
2828 session: Session,
2929 Path(space_name): Path<String>,
3030) -> Result<AppResponseData<Vec<EmojiDto>>, ApiError> {
31 let uid = require_uid(&session)?;
31 let uid = session::require_uid(&session)?;
3232 let emojis = service.list_emojis(uid, &space_name).await?;
3333 Ok(AppResponseData::ok(emojis))
3434}
@@ -54,7 +54,7 @@
5454 Path(space_name): Path<String>,
5555 Json(cmd): Json<UploadEmojiCmd>,
5656) -> Result<AppResponseData<EmojiDto>, ApiError> {
57 let uid = require_uid(&session)?;
57 let uid = session::require_uid(&session)?;
5858 let dto = service.upload_emoji(uid, &space_name, cmd).await?;
5959 Ok(AppResponseData::ok(dto))
6060}
@@ -79,7 +79,7 @@
7979 session: Session,
8080 Path((space_name, emoji_id)): Path<(String, Uuid)>,
8181) -> Result<AppResponseData<NoData>, ApiError> {
82 let uid = require_uid(&session)?;
82 let uid = session::require_uid(&session)?;
8383 service.delete_emoji(uid, &space_name, emoji_id).await?;
8484 Ok(AppResponseData::empty())
8585}
@@ -104,7 +104,7 @@
104104 session: Session,
105105 Path((space_name, emoji_id)): Path<(String, Uuid)>,
106106) -> Result<Response, ApiError> {
107 let uid = require_uid(&session)?;
107 let uid = session::require_uid(&session)?;
108108 let space = lookup_space_by_name(&service, &space_name).await?;
109109 require_space_member(&service, &space, uid).await?;
110110 let bytes = service.emoji_image(&space, emoji_id).await?;
@@ -128,7 +128,7 @@
128128 session: Session,
129129 Path((space_name, emoji_id)): Path<(String, Uuid)>,
130130) -> Result<AppResponseData<EmojiDto>, ApiError> {
131 let uid = require_uid(&session)?;
131 let uid = session::require_uid(&session)?;
132132 let dto = service.get_emoji(uid, &space_name, emoji_id).await?;
133133 Ok(AppResponseData::ok(dto))
134134}
Modified lib/chat/src/handlers/messages.rs lib/chat/src/handlers/messages.rs +11 −11 View lib/chat/src/handlers/messages.rs
@@ -2,7 +2,7 @@
22use axum::response::IntoResponse;
33use export::rest::{AppResponseData, NoData};
44use jwt::Session;
5use jwt::share::session::require_uid;
5use jwt::share::session;
66use uuid::Uuid;
77
88use crate::errors::ApiError;
@@ -33,7 +33,7 @@
3333 Path(room_id): Path<Uuid>,
3434 Json(cmd): Json<SendMessageCmd>,
3535) -> Result<axum::response::Response, ApiError> {
36 let uid = require_uid(&session)?;
36 let uid = session::require_uid(&session)?;
3737 let dto = service.send_message(uid, room_id, cmd).await?;
3838 Ok(AppResponseData::ok(dto).into_response())
3939}
@@ -56,7 +56,7 @@
5656 Path(room_id): Path<Uuid>,
5757 Query(q): Query<ListMessageQuery>,
5858) -> Result<AppResponseData<MessagePage>, ApiError> {
59 let uid = require_uid(&session)?;
59 let uid = session::require_uid(&session)?;
6060 let page = service.list_messages(uid, room_id, q).await?;
6161 Ok(AppResponseData::ok(page))
6262}
@@ -78,7 +78,7 @@
7878 session: Session,
7979 Path(path): Path<MessagePath>,
8080) -> Result<AppResponseData<MessageDto>, ApiError> {
81 let uid = require_uid(&session)?;
81 let uid = session::require_uid(&session)?;
8282 let dto = service
8383 .get_message(uid, path.room_id, path.message_id)
8484 .await?;
@@ -105,7 +105,7 @@
105105 Path(path): Path<MessagePath>,
106106 Json(cmd): Json<UpdateMessageCmd>,
107107) -> Result<AppResponseData<MessageDto>, ApiError> {
108 let uid = require_uid(&session)?;
108 let uid = session::require_uid(&session)?;
109109 let dto = service
110110 .update_message(uid, path.room_id, path.message_id, cmd)
111111 .await?;
@@ -129,7 +129,7 @@
129129 session: Session,
130130 Path(path): Path<MessagePath>,
131131) -> Result<AppResponseData<NoData>, ApiError> {
132 let uid = require_uid(&session)?;
132 let uid = session::require_uid(&session)?;
133133 service
134134 .delete_message(uid, path.room_id, path.message_id)
135135 .await?;
@@ -157,7 +157,7 @@
157157 Path(room_id): Path<Uuid>,
158158 Json(cmd): Json<BulkDeleteCmd>,
159159) -> Result<AppResponseData<NoData>, ApiError> {
160 let uid = require_uid(&session)?;
160 let uid = session::require_uid(&session)?;
161161 service.bulk_delete_messages(uid, room_id, cmd).await?;
162162 Ok(AppResponseData::empty())
163163}
@@ -182,7 +182,7 @@
182182 Path(path): Path<MessagePath>,
183183 Json(cmd): Json<PinCmd>,
184184) -> Result<AppResponseData<MessageDto>, ApiError> {
185 let uid = require_uid(&session)?;
185 let uid = session::require_uid(&session)?;
186186 let dto = service
187187 .set_message_pin(uid, path.room_id, path.message_id, cmd)
188188 .await?;
@@ -206,7 +206,7 @@
206206 session: Session,
207207 Path(room_id): Path<Uuid>,
208208) -> Result<AppResponseData<Vec<MessageDto>>, ApiError> {
209 let uid = require_uid(&session)?;
209 let uid = session::require_uid(&session)?;
210210 let pins = service.list_pins(uid, room_id).await?;
211211 Ok(AppResponseData::ok(pins))
212212}
@@ -232,7 +232,7 @@
232232 Path(path): Path<MessagePath>,
233233 Json(cmd): Json<ForwardMessageCmd>,
234234) -> Result<AppResponseData<MessageDto>, ApiError> {
235 let uid = require_uid(&session)?;
235 let uid = session::require_uid(&session)?;
236236 let dto = service
237237 .forward_message(uid, path.room_id, path.message_id, cmd)
238238 .await?;
@@ -256,7 +256,7 @@
256256 session: Session,
257257 Path(path): Path<MessagePath>,
258258) -> Result<AppResponseData<Vec<MessageEditDto>>, ApiError> {
259 let uid = require_uid(&session)?;
259 let uid = session::require_uid(&session)?;
260260 let history = service
261261 .list_message_history(uid, path.room_id, path.message_id)
262262 .await?;
Modified lib/chat/src/handlers/presence.rs lib/chat/src/handlers/presence.rs +4 −4 View lib/chat/src/handlers/presence.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55
66use crate::errors::ApiError;
77use crate::services::presence::{PresenceDto, SetPresenceCmd};
@@ -24,7 +24,7 @@
2424 session: Session,
2525 Json(cmd): Json<SetPresenceCmd>,
2626) -> Result<AppResponseData<PresenceDto>, ApiError> {
27 let uid = require_uid(&session)?;
27 let uid = session::require_uid(&session)?;
2828 let dto = service.set_presence(uid, cmd).await?;
2929 Ok(AppResponseData::ok(dto))
3030}
@@ -45,7 +45,7 @@
4545 session: Session,
4646 Path(user_id): Path<i64>,
4747) -> Result<AppResponseData<PresenceDto>, ApiError> {
48 let uid = require_uid(&session)?;
48 let uid = session::require_uid(&session)?;
4949 let dto = service.get_presence_for(uid, user_id).await?;
5050 Ok(AppResponseData::ok(dto))
5151}
@@ -67,7 +67,7 @@
6767 session: Session,
6868 Path(space_name): Path<String>,
6969) -> Result<AppResponseData<Vec<PresenceDto>>, ApiError> {
70 let uid = require_uid(&session)?;
70 let uid = session::require_uid(&session)?;
7171 let presences = service.list_space_presences(uid, &space_name).await?;
7272 Ok(AppResponseData::ok(presences))
7373}
Modified lib/chat/src/handlers/reactions.rs lib/chat/src/handlers/reactions.rs +4 −4 View lib/chat/src/handlers/reactions.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -31,7 +31,7 @@
3131 Path((room_id, message_id)): Path<(Uuid, Uuid)>,
3232 Json(cmd): Json<ReactionCmd>,
3333) -> Result<AppResponseData<Vec<ReactionAggDto>>, ApiError> {
34 let uid = require_uid(&session)?;
34 let uid = session::require_uid(&session)?;
3535 let agg = service.add_reaction(uid, room_id, message_id, cmd).await?;
3636 Ok(AppResponseData::ok(agg))
3737}
@@ -59,7 +59,7 @@
5959 Path((room_id, message_id)): Path<(Uuid, Uuid)>,
6060 Json(cmd): Json<ReactionCmd>,
6161) -> Result<AppResponseData<Vec<ReactionAggDto>>, ApiError> {
62 let uid = require_uid(&session)?;
62 let uid = session::require_uid(&session)?;
6363 let agg = service
6464 .remove_reaction(uid, room_id, message_id, cmd)
6565 .await?;
@@ -86,7 +86,7 @@
8686 session: Session,
8787 Path((room_id, message_id)): Path<(Uuid, Uuid)>,
8888) -> Result<AppResponseData<Vec<ReactionUserDto>>, ApiError> {
89 let uid = require_uid(&session)?;
89 let uid = session::require_uid(&session)?;
9090 let rows = service
9191 .list_message_reactions(uid, room_id, message_id)
9292 .await?;
Modified lib/chat/src/handlers/read_state.rs lib/chat/src/handlers/read_state.rs +5 −5 View lib/chat/src/handlers/read_state.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -28,7 +28,7 @@
2828 Path(room_id): Path<Uuid>,
2929 Json(cmd): Json<MarkReadCmd>,
3030) -> Result<AppResponseData<ReadStateDto>, ApiError> {
31 let uid = require_uid(&session)?;
31 let uid = session::require_uid(&session)?;
3232 let dto = service.mark_read(uid, room_id, cmd).await?;
3333 Ok(AppResponseData::ok(dto))
3434}
@@ -50,7 +50,7 @@
5050 session: Session,
5151 Path(room_id): Path<Uuid>,
5252) -> Result<AppResponseData<ReadStateDto>, ApiError> {
53 let uid = require_uid(&session)?;
53 let uid = session::require_uid(&session)?;
5454 let dto = service.get_read_state(uid, room_id).await?;
5555 Ok(AppResponseData::ok(dto))
5656}
@@ -72,7 +72,7 @@
7272 session: Session,
7373 Path(space_name): Path<String>,
7474) -> Result<AppResponseData<SpaceReadStatePage>, ApiError> {
75 let uid = require_uid(&session)?;
75 let uid = session::require_uid(&session)?;
7676 let page = service.list_space_read_states(uid, &space_name).await?;
7777 Ok(AppResponseData::ok(page))
7878}
@@ -103,7 +103,7 @@
103103 Path(thread_id): Path<Uuid>,
104104 Json(q): Json<MarkThreadReadCmd>,
105105) -> Result<AppResponseData<NoData>, ApiError> {
106 let uid = require_uid(&session)?;
106 let uid = session::require_uid(&session)?;
107107 service
108108 .mark_thread_read(uid, thread_id, q.message_id)
109109 .await?;
Modified lib/chat/src/handlers/reminders.rs lib/chat/src/handlers/reminders.rs +5 −5 View lib/chat/src/handlers/reminders.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -32,7 +32,7 @@
3232 Path((room_id, message_id)): Path<(Uuid, Uuid)>,
3333 Json(cmd): Json<CreateReminderCmd>,
3434) -> Result<AppResponseData<ReminderDto>, ApiError> {
35 let uid = require_uid(&session)?;
35 let uid = session::require_uid(&session)?;
3636 let dto = service
3737 .create_reminder(uid, room_id, message_id, cmd)
3838 .await?;
@@ -54,7 +54,7 @@
5454 State(service): State<ChatService>,
5555 session: Session,
5656) -> Result<AppResponseData<Vec<ReminderDto>>, ApiError> {
57 let uid = require_uid(&session)?;
57 let uid = session::require_uid(&session)?;
5858 let reminders = service.list_reminders(uid).await?;
5959 Ok(AppResponseData::ok(reminders))
6060}
@@ -76,7 +76,7 @@
7676 session: Session,
7777 Path(reminder_id): Path<Uuid>,
7878) -> Result<AppResponseData<NoData>, ApiError> {
79 let uid = require_uid(&session)?;
79 let uid = session::require_uid(&session)?;
8080 service.cancel_reminder(uid, reminder_id).await?;
8181 Ok(AppResponseData::empty())
8282}
@@ -101,7 +101,7 @@
101101 Path(reminder_id): Path<Uuid>,
102102 Json(cmd): Json<UpdateReminderCmd>,
103103) -> Result<AppResponseData<ReminderDto>, ApiError> {
104 let uid = require_uid(&session)?;
104 let uid = session::require_uid(&session)?;
105105 let dto = service.update_reminder(uid, reminder_id, cmd).await?;
106106 Ok(AppResponseData::ok(dto))
107107}
Modified lib/chat/src/handlers/room_admin.rs lib/chat/src/handlers/room_admin.rs +8 −8 View lib/chat/src/handlers/room_admin.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Path((room_id, user_id)): Path<(Uuid, i64)>,
2828) -> Result<AppResponseData<RoomMemberDto>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let member = service.get_room_member(uid, room_id, user_id).await?;
3131 Ok(AppResponseData::ok(member))
3232}
@@ -51,7 +51,7 @@
5151 Path((room_id, user_id)): Path<(Uuid, i64)>,
5252 Json(cmd): Json<UpdateRoomMemberCmd>,
5353) -> Result<AppResponseData<RoomMemberDto>, ApiError> {
54 let uid = require_uid(&session)?;
54 let uid = session::require_uid(&session)?;
5555 let member = service
5656 .update_room_member(uid, room_id, user_id, cmd)
5757 .await?;
@@ -75,7 +75,7 @@
7575 session: Session,
7676 Path((room_id, user_id)): Path<(Uuid, i64)>,
7777) -> Result<AppResponseData<NoData>, ApiError> {
78 let uid = require_uid(&session)?;
78 let uid = session::require_uid(&session)?;
7979 service.kick_room_member(uid, room_id, user_id).await?;
8080 Ok(AppResponseData::empty())
8181}
@@ -97,7 +97,7 @@
9797 Path(room_id): Path<Uuid>,
9898 Query(page): Query<export::pagination::PageQuery>,
9999) -> Result<AppResponseData<export::pagination::Page<RoomBanDto>>, ApiError> {
100 let uid = require_uid(&session)?;
100 let uid = session::require_uid(&session)?;
101101 let bans = service.list_room_bans(uid, room_id).await?;
102102 Ok(AppResponseData::ok(export::pagination::paginate(
103103 bans, &page,
@@ -124,7 +124,7 @@
124124 Path(room_id): Path<Uuid>,
125125 Json(cmd): Json<BanRoomMemberCmd>,
126126) -> Result<AppResponseData<RoomBanDto>, ApiError> {
127 let uid = require_uid(&session)?;
127 let uid = session::require_uid(&session)?;
128128 let ban = service.ban_room_member(uid, room_id, cmd).await?;
129129 Ok(AppResponseData::ok(ban))
130130}
@@ -146,7 +146,7 @@
146146 session: Session,
147147 Path((room_id, user_id)): Path<(Uuid, i64)>,
148148) -> Result<AppResponseData<NoData>, ApiError> {
149 let uid = require_uid(&session)?;
149 let uid = session::require_uid(&session)?;
150150 service.unban_room_member(uid, room_id, user_id).await?;
151151 Ok(AppResponseData::empty())
152152}
@@ -176,7 +176,7 @@
176176 Path(room_id): Path<Uuid>,
177177 Json(cmd): Json<TransferOwnerCmd>,
178178) -> Result<AppResponseData<NoData>, ApiError> {
179 let uid = require_uid(&session)?;
179 let uid = session::require_uid(&session)?;
180180 service
181181 .transfer_room_owner(uid, room_id, cmd.user_id)
182182 .await?;
Modified lib/chat/src/handlers/rooms.rs lib/chat/src/handlers/rooms.rs +13 −13 View lib/chat/src/handlers/rooms.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -28,7 +28,7 @@
2828 session: Session,
2929 Path(space_name): Path<String>,
3030) -> Result<AppResponseData<Vec<RoomBriefDto>>, ApiError> {
31 let uid = require_uid(&session)?;
31 let uid = session::require_uid(&session)?;
3232 let rooms = service.list_space_rooms(uid, &space_name).await?;
3333 Ok(AppResponseData::ok(rooms))
3434}
@@ -50,7 +50,7 @@
5050 session: Session,
5151 Path(room_id): Path<Uuid>,
5252) -> Result<AppResponseData<RoomBriefDto>, ApiError> {
53 let uid = require_uid(&session)?;
53 let uid = session::require_uid(&session)?;
5454 let room = service.get_room(uid, room_id).await?;
5555 Ok(AppResponseData::ok(room))
5656}
@@ -75,7 +75,7 @@
7575 Path(room_id): Path<Uuid>,
7676 Json(cmd): Json<UpdateRoomCmd>,
7777) -> Result<AppResponseData<RoomBriefDto>, ApiError> {
78 let uid = require_uid(&session)?;
78 let uid = session::require_uid(&session)?;
7979 let room = service.update_room(uid, room_id, cmd).await?;
8080 Ok(AppResponseData::ok(room))
8181}
@@ -97,7 +97,7 @@
9797 session: Session,
9898 Path(room_id): Path<Uuid>,
9999) -> Result<AppResponseData<NoData>, ApiError> {
100 let uid = require_uid(&session)?;
100 let uid = session::require_uid(&session)?;
101101 service.join_room(uid, room_id).await?;
102102 Ok(AppResponseData::empty())
103103}
@@ -119,7 +119,7 @@
119119 session: Session,
120120 Path(room_id): Path<Uuid>,
121121) -> Result<AppResponseData<NoData>, ApiError> {
122 let uid = require_uid(&session)?;
122 let uid = session::require_uid(&session)?;
123123 service.leave_room(uid, room_id).await?;
124124 Ok(AppResponseData::empty())
125125}
@@ -145,7 +145,7 @@
145145 Path(room_id): Path<Uuid>,
146146 Json(cmd): Json<AddMembersCmd>,
147147) -> Result<AppResponseData<NoData>, ApiError> {
148 let uid = require_uid(&session)?;
148 let uid = session::require_uid(&session)?;
149149 service.add_room_members(uid, room_id, cmd).await?;
150150 Ok(AppResponseData::empty())
151151}
@@ -168,7 +168,7 @@
168168 Path(room_id): Path<Uuid>,
169169 Query(q): Query<RoomMemberQuery>,
170170) -> Result<AppResponseData<Vec<RoomMemberDto>>, ApiError> {
171 let uid = require_uid(&session)?;
171 let uid = session::require_uid(&session)?;
172172 let members = service.list_room_members(uid, room_id, q).await?;
173173 Ok(AppResponseData::ok(members))
174174}
@@ -194,7 +194,7 @@
194194 Path(room_id): Path<Uuid>,
195195 Json(cmd): Json<CreateRoomInviteCmd>,
196196) -> Result<AppResponseData<RoomInviteDto>, ApiError> {
197 let uid = require_uid(&session)?;
197 let uid = session::require_uid(&session)?;
198198 let invite = service.create_room_invite(uid, room_id, cmd).await?;
199199 Ok(AppResponseData::ok(invite))
200200}
@@ -219,7 +219,7 @@
219219 session: Session,
220220 Json(cmd): Json<AcceptRoomInviteCmd>,
221221) -> Result<AppResponseData<RoomBriefDto>, ApiError> {
222 let uid = require_uid(&session)?;
222 let uid = session::require_uid(&session)?;
223223 let room = service.accept_room_invite(uid, &cmd.code).await?;
224224 Ok(AppResponseData::ok(room))
225225}
@@ -244,7 +244,7 @@
244244 session: Session,
245245 Json(cmd): Json<AcceptRoomInviteCmd>,
246246) -> Result<AppResponseData<NoData>, ApiError> {
247 let uid = require_uid(&session)?;
247 let uid = session::require_uid(&session)?;
248248 service.reject_room_invite(uid, &cmd.code).await?;
249249 Ok(AppResponseData::empty())
250250}
@@ -265,7 +265,7 @@
265265 session: Session,
266266 Path(room_id): Path<Uuid>,
267267) -> Result<AppResponseData<Vec<RoomInviteListItemDto>>, ApiError> {
268 let uid = require_uid(&session)?;
268 let uid = session::require_uid(&session)?;
269269 let invites = service.list_room_invites(uid, room_id).await?;
270270 Ok(AppResponseData::ok(invites))
271271}
@@ -287,7 +287,7 @@
287287 session: Session,
288288 Path((room_id, invite_id)): Path<(Uuid, Uuid)>,
289289) -> Result<AppResponseData<NoData>, ApiError> {
290 let uid = require_uid(&session)?;
290 let uid = session::require_uid(&session)?;
291291 service.revoke_room_invite(uid, room_id, invite_id).await?;
292292 Ok(AppResponseData::empty())
293293}
Modified lib/chat/src/handlers/settings.rs lib/chat/src/handlers/settings.rs +3 −3 View lib/chat/src/handlers/settings.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(room_id): Path<Uuid>,
2727) -> Result<AppResponseData<RoomSettingDto>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 let dto = service.get_room_setting(uid, room_id).await?;
3030 Ok(AppResponseData::ok(dto))
3131}
@@ -50,7 +50,7 @@
5050 Path(room_id): Path<Uuid>,
5151 Json(cmd): Json<UpdateRoomSettingCmd>,
5252) -> Result<AppResponseData<RoomSettingDto>, ApiError> {
53 let uid = require_uid(&session)?;
53 let uid = session::require_uid(&session)?;
5454 let dto = service.update_room_setting(uid, room_id, cmd).await?;
5555 Ok(AppResponseData::ok(dto))
5656}
Modified lib/chat/src/handlers/threads.rs lib/chat/src/handlers/threads.rs +8 −8 View lib/chat/src/handlers/threads.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -34,7 +34,7 @@
3434 Path((room_id, message_id)): Path<(Uuid, Uuid)>,
3535 Json(cmd): Json<CreateThreadCmd>,
3636) -> Result<AppResponseData<ThreadDto>, ApiError> {
37 let uid = require_uid(&session)?;
37 let uid = session::require_uid(&session)?;
3838 let dto = service.create_thread(uid, room_id, message_id, cmd).await?;
3939 Ok(AppResponseData::ok(dto))
4040}
@@ -57,7 +57,7 @@
5757 Path(room_id): Path<Uuid>,
5858 Query(q): Query<ListThreadQuery>,
5959) -> Result<AppResponseData<ThreadPage>, ApiError> {
60 let uid = require_uid(&session)?;
60 let uid = session::require_uid(&session)?;
6161 let page = service.list_threads(uid, room_id, q).await?;
6262 Ok(AppResponseData::ok(page))
6363}
@@ -79,7 +79,7 @@
7979 session: Session,
8080 Query(page): Query<export::pagination::PageQuery>,
8181) -> Result<AppResponseData<export::pagination::Page<ThreadDto>>, ApiError> {
82 let uid = require_uid(&session)?;
82 let uid = session::require_uid(&session)?;
8383 let threads = service.list_my_threads(uid).await?;
8484 Ok(AppResponseData::ok(export::pagination::paginate(
8585 threads, &page,
@@ -103,7 +103,7 @@
103103 session: Session,
104104 Path(thread_id): Path<Uuid>,
105105) -> Result<AppResponseData<ThreadDto>, ApiError> {
106 let uid = require_uid(&session)?;
106 let uid = session::require_uid(&session)?;
107107 let dto = service.get_thread(uid, thread_id).await?;
108108 Ok(AppResponseData::ok(dto))
109109}
@@ -128,7 +128,7 @@
128128 Path(thread_id): Path<Uuid>,
129129 Json(cmd): Json<UpdateThreadCmd>,
130130) -> Result<AppResponseData<ThreadDto>, ApiError> {
131 let uid = require_uid(&session)?;
131 let uid = session::require_uid(&session)?;
132132 let dto = service.update_thread(uid, thread_id, cmd).await?;
133133 Ok(AppResponseData::ok(dto))
134134}
@@ -153,7 +153,7 @@
153153 Path(thread_id): Path<Uuid>,
154154 Json(cmd): Json<ThreadMemberCmd>,
155155) -> Result<AppResponseData<NoData>, ApiError> {
156 let uid = require_uid(&session)?;
156 let uid = session::require_uid(&session)?;
157157 service.set_thread_membership(uid, thread_id, cmd).await?;
158158 Ok(AppResponseData::empty())
159159}
@@ -175,7 +175,7 @@
175175 session: Session,
176176 Path(thread_id): Path<Uuid>,
177177) -> Result<AppResponseData<NoData>, ApiError> {
178 let uid = require_uid(&session)?;
178 let uid = session::require_uid(&session)?;
179179 service.leave_thread(uid, thread_id).await?;
180180 Ok(AppResponseData::empty())
181181}
Modified lib/chat/src/handlers/voice.rs lib/chat/src/handlers/voice.rs +18 −18 View lib/chat/src/handlers/voice.rs
@@ -2,11 +2,11 @@
22use axum::extract::{Path, Query, State};
33use axum::http::HeaderMap;
44use export::rest::{AppResponseData, NoData};
5use jwt::Session;
6use jwt::share::session;
57use livekit_api::access_token::TokenVerifier;
68use livekit_api::webhooks::WebhookReceiver;
79use serde::Deserialize;
8use jwt::Session;
9use jwt::share::session::require_uid;
1010use uuid::Uuid;
1111
1212use crate::errors::ApiError;
@@ -31,7 +31,7 @@
3131 State(service): State<ChatService>,
3232 session: Session,
3333) -> Result<AppResponseData<VoiceConfigDto>, ApiError> {
34 let _uid = require_uid(&session)?;
34 let _uid = session::require_uid(&session)?;
3535 Ok(AppResponseData::ok(service.voice_config()))
3636}
3737
@@ -54,7 +54,7 @@
5454 session: Session,
5555 Path(room_id): Path<Uuid>,
5656) -> Result<AppResponseData<VoiceTokenDto>, ApiError> {
57 let uid = require_uid(&session)?;
57 let uid = session::require_uid(&session)?;
5858 Ok(AppResponseData::ok(
5959 service.voice_token(uid, room_id).await?,
6060 ))
@@ -77,7 +77,7 @@
7777 session: Session,
7878 Path(room_id): Path<Uuid>,
7979) -> Result<AppResponseData<Vec<VoiceParticipantDto>>, ApiError> {
80 let uid = require_uid(&session)?;
80 let uid = session::require_uid(&session)?;
8181 Ok(AppResponseData::ok(
8282 service.voice_participants(uid, room_id).await?,
8383 ))
@@ -99,7 +99,7 @@
9999 session: Session,
100100 Path(space_name): Path<String>,
101101) -> Result<AppResponseData<VoiceSpaceStatesDto>, ApiError> {
102 let uid = require_uid(&session)?;
102 let uid = session::require_uid(&session)?;
103103 Ok(AppResponseData::ok(
104104 service.voice_space_states(uid, &space_name).await?,
105105 ))
@@ -121,7 +121,7 @@
121121 session: Session,
122122 Path(room_id): Path<Uuid>,
123123) -> Result<AppResponseData<VoiceHandsDto>, ApiError> {
124 let uid = require_uid(&session)?;
124 let uid = session::require_uid(&session)?;
125125 Ok(AppResponseData::ok(service.list_hands(uid, room_id).await?))
126126}
127127
@@ -142,7 +142,7 @@
142142 session: Session,
143143 Path(room_id): Path<Uuid>,
144144) -> Result<AppResponseData<VoiceLayoutDto>, ApiError> {
145 let uid = require_uid(&session)?;
145 let uid = session::require_uid(&session)?;
146146 Ok(AppResponseData::ok(
147147 service.voice_layout(uid, room_id).await?,
148148 ))
@@ -168,7 +168,7 @@
168168 Path(room_id): Path<Uuid>,
169169 Json(patch): Json<VoiceLayoutPatchDto>,
170170) -> Result<AppResponseData<VoiceLayoutSavedDto>, ApiError> {
171 let uid = require_uid(&session)?;
171 let uid = session::require_uid(&session)?;
172172 Ok(AppResponseData::ok(
173173 service.save_voice_layout(uid, room_id, patch).await?,
174174 ))
@@ -191,7 +191,7 @@
191191 session: Session,
192192 Path(room_id): Path<Uuid>,
193193) -> Result<AppResponseData<HandDto>, ApiError> {
194 let uid = require_uid(&session)?;
194 let uid = session::require_uid(&session)?;
195195 Ok(AppResponseData::ok(service.raise_hand(uid, room_id).await?))
196196}
197197
@@ -212,7 +212,7 @@
212212 session: Session,
213213 Path(room_id): Path<Uuid>,
214214) -> Result<AppResponseData<NoData>, ApiError> {
215 let uid = require_uid(&session)?;
215 let uid = session::require_uid(&session)?;
216216 service.cancel_hand(uid, room_id).await?;
217217 Ok(AppResponseData::empty())
218218}
@@ -237,7 +237,7 @@
237237 session: Session,
238238 Path((room_id, user_id)): Path<(Uuid, i64)>,
239239) -> Result<AppResponseData<VoiceModerationDto>, ApiError> {
240 let uid = require_uid(&session)?;
240 let uid = session::require_uid(&session)?;
241241 Ok(AppResponseData::ok(
242242 service.approve_hand(uid, room_id, user_id).await?,
243243 ))
@@ -262,7 +262,7 @@
262262 session: Session,
263263 Path((room_id, user_id)): Path<(Uuid, i64)>,
264264) -> Result<AppResponseData<VoiceModerationDto>, ApiError> {
265 let uid = require_uid(&session)?;
265 let uid = session::require_uid(&session)?;
266266 Ok(AppResponseData::ok(
267267 service.deny_hand(uid, room_id, user_id).await?,
268268 ))
@@ -287,7 +287,7 @@
287287 session: Session,
288288 Path((room_id, user_id)): Path<(Uuid, i64)>,
289289) -> Result<AppResponseData<VoiceModerationDto>, ApiError> {
290 let uid = require_uid(&session)?;
290 let uid = session::require_uid(&session)?;
291291 Ok(AppResponseData::ok(
292292 service.revoke_hand(uid, room_id, user_id).await?,
293293 ))
@@ -320,7 +320,7 @@
320320 Path((room_id, user_id)): Path<(Uuid, i64)>,
321321 Query(query): Query<ModerateQuery>,
322322) -> Result<AppResponseData<VoiceModerationDto>, ApiError> {
323 let uid = require_uid(&session)?;
323 let uid = session::require_uid(&session)?;
324324 Ok(AppResponseData::ok(
325325 service
326326 .moderate_mute(uid, room_id, user_id, query.muted)
@@ -347,7 +347,7 @@
347347 session: Session,
348348 Path((room_id, user_id)): Path<(Uuid, i64)>,
349349) -> Result<AppResponseData<VoiceModerationDto>, ApiError> {
350 let uid = require_uid(&session)?;
350 let uid = session::require_uid(&session)?;
351351 Ok(AppResponseData::ok(
352352 service.kick_participant(uid, room_id, user_id).await?,
353353 ))
@@ -370,7 +370,7 @@
370370 session: Session,
371371 Path(room_id): Path<Uuid>,
372372) -> Result<AppResponseData<VoiceRecordingDto>, ApiError> {
373 let uid = require_uid(&session)?;
373 let uid = session::require_uid(&session)?;
374374 Ok(AppResponseData::ok(
375375 service.start_recording(uid, room_id).await?,
376376 ))
@@ -393,7 +393,7 @@
393393 session: Session,
394394 Path(room_id): Path<Uuid>,
395395) -> Result<AppResponseData<VoiceRecordingDto>, ApiError> {
396 let uid = require_uid(&session)?;
396 let uid = session::require_uid(&session)?;
397397 Ok(AppResponseData::ok(
398398 service.stop_recording(uid, room_id).await?,
399399 ))
Modified lib/chat/src/handlers/webhooks.rs lib/chat/src/handlers/webhooks.rs +9 −9 View lib/chat/src/handlers/webhooks.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Json, Path, Query, State};
22use export::rest::{AppResponseData, NoData};
33use jwt::Session;
4use jwt::share::session::require_uid;
4use jwt::share::session;
55use uuid::Uuid;
66
77use crate::errors::ApiError;
@@ -32,7 +32,7 @@
3232 Path(room_id): Path<Uuid>,
3333 Json(cmd): Json<CreateWebhookCmd>,
3434) -> Result<AppResponseData<WebhookSecretDto>, ApiError> {
35 let uid = require_uid(&session)?;
35 let uid = session::require_uid(&session)?;
3636 let dto = service.create_webhook(uid, room_id, cmd).await?;
3737 Ok(AppResponseData::ok(dto))
3838}
@@ -55,7 +55,7 @@
5555 Path(room_id): Path<Uuid>,
5656 Query(page): Query<export::pagination::PageQuery>,
5757) -> Result<AppResponseData<export::pagination::Page<WebhookDto>>, ApiError> {
58 let uid = require_uid(&session)?;
58 let uid = session::require_uid(&session)?;
5959 let rows = service.list_webhooks(uid, room_id).await?;
6060 Ok(AppResponseData::ok(export::pagination::paginate(
6161 rows, &page,
@@ -82,7 +82,7 @@
8282 session: Session,
8383 Path((room_id, webhook_id)): Path<(Uuid, Uuid)>,
8484) -> Result<AppResponseData<NoData>, ApiError> {
85 let uid = require_uid(&session)?;
85 let uid = session::require_uid(&session)?;
8686 service.delete_webhook(uid, room_id, webhook_id).await?;
8787 Ok(AppResponseData::empty())
8888}
@@ -130,7 +130,7 @@
130130 Path((room_id, webhook_id)): Path<(Uuid, Uuid)>,
131131 Json(cmd): Json<UpdateWebhookCmd>,
132132) -> Result<AppResponseData<WebhookDto>, ApiError> {
133 let uid = require_uid(&session)?;
133 let uid = session::require_uid(&session)?;
134134 let dto = service
135135 .update_webhook(uid, room_id, webhook_id, cmd)
136136 .await?;
@@ -162,7 +162,7 @@
162162 Path(room_id): Path<Uuid>,
163163 Json(cmd): Json<CreateOutboundWebhookCmd>,
164164) -> Result<AppResponseData<OutboundWebhookSecretDto>, ApiError> {
165 let uid = require_uid(&session)?;
165 let uid = session::require_uid(&session)?;
166166 let dto = service.create_outbound_webhook(uid, room_id, cmd).await?;
167167 Ok(AppResponseData::ok(dto))
168168}
@@ -184,7 +184,7 @@
184184 session: Session,
185185 Path(room_id): Path<Uuid>,
186186) -> Result<AppResponseData<Vec<OutboundWebhookDto>>, ApiError> {
187 let uid = require_uid(&session)?;
187 let uid = session::require_uid(&session)?;
188188 let rows = service.list_outbound_webhooks(uid, room_id).await?;
189189 Ok(AppResponseData::ok(rows))
190190}
@@ -209,7 +209,7 @@
209209 Path((room_id, webhook_id)): Path<(Uuid, Uuid)>,
210210 Json(cmd): Json<UpdateOutboundWebhookCmd>,
211211) -> Result<AppResponseData<OutboundWebhookDto>, ApiError> {
212 let uid = require_uid(&session)?;
212 let uid = session::require_uid(&session)?;
213213 let dto = service
214214 .update_outbound_webhook(uid, room_id, webhook_id, cmd)
215215 .await?;
@@ -233,7 +233,7 @@
233233 session: Session,
234234 Path((room_id, webhook_id)): Path<(Uuid, Uuid)>,
235235) -> Result<AppResponseData<NoData>, ApiError> {
236 let uid = require_uid(&session)?;
236 let uid = session::require_uid(&session)?;
237237 service
238238 .delete_outbound_webhook(uid, room_id, webhook_id)
239239 .await?;
Modified lib/chat/src/services/bookmarks.rs lib/chat/src/services/bookmarks.rs +5 −5 View lib/chat/src/services/bookmarks.rs
@@ -11,7 +11,7 @@
1111
1212use crate::errors::ChatError;
1313use crate::services::service::ChatService;
14use crate::share::lookup::require_room_readable;
14use crate::share::lookup;
1515
1616#[derive(Debug, Clone, Serialize, ToSchema)]
1717pub struct BookmarkDto {
@@ -67,7 +67,7 @@
6767 caller: i64,
6868 room_id: Uuid,
6969 ) -> Result<Vec<BookmarkDto>, ChatError> {
70 let _ctx = require_room_readable(self, room_id, caller).await?;
70 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
7171 let rows = room_bookmarks::Entity::find()
7272 .filter(room_bookmarks::Column::RoomId.eq(room_id))
7373 .order_by_asc(room_bookmarks::Column::Position)
@@ -83,7 +83,7 @@
8383 room_id: Uuid,
8484 cmd: CreateBookmarkCmd,
8585 ) -> Result<BookmarkDto, ChatError> {
86 let _ctx = require_room_readable(self, room_id, caller).await?;
86 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
8787 let title = cmd.title.trim().to_string();
8888 if title.is_empty() || title.chars().count() > self.config().chat.max_bookmark_title_len {
8989 return Err(ChatError::BadRequest("invalid bookmark title".to_string()));
@@ -128,7 +128,7 @@
128128 bookmark_id: Uuid,
129129 cmd: UpdateBookmarkCmd,
130130 ) -> Result<BookmarkDto, ChatError> {
131 let ctx = require_room_readable(self, room_id, caller).await?;
131 let ctx = lookup::require_room_readable(self, room_id, caller).await?;
132132 let row = room_bookmarks::Entity::find_by_id(bookmark_id)
133133 .filter(room_bookmarks::Column::RoomId.eq(room_id))
134134 .one(self.db().write())
@@ -166,7 +166,7 @@
166166 room_id: Uuid,
167167 bookmark_id: Uuid,
168168 ) -> Result<(), ChatError> {
169 let ctx = require_room_readable(self, room_id, caller).await?;
169 let ctx = lookup::require_room_readable(self, room_id, caller).await?;
170170 let row = room_bookmarks::Entity::find_by_id(bookmark_id)
171171 .filter(room_bookmarks::Column::RoomId.eq(room_id))
172172 .one(self.db().write())
Modified lib/chat/src/services/dms.rs lib/chat/src/services/dms.rs +1 −3 View lib/chat/src/services/dms.rs
@@ -1,8 +1,6 @@
1use models::chat::read_states;
2use models::chat::room_seq;
1use models::chat::{read_states, room_seq};
32use models::room::room_members;
43use models::room::rooms::{self, RoomKind};
5use models::users::user;
64use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set};
75use serde::{Deserialize, Serialize};
86use sha2::{Digest, Sha256};
Modified lib/chat/src/services/drafts.rs lib/chat/src/services/drafts.rs +4 −4 View lib/chat/src/services/drafts.rs
@@ -7,7 +7,7 @@
77
88use crate::errors::ChatError;
99use crate::services::service::ChatService;
10use crate::share::lookup::require_room_readable;
10use crate::share::lookup;
1111
1212#[derive(Debug, Clone, Serialize, ToSchema)]
1313pub struct DraftDto {
@@ -31,7 +31,7 @@
3131 room_id: Uuid,
3232 cmd: UpsertDraftCmd,
3333 ) -> Result<DraftDto, ChatError> {
34 let _ctx = require_room_readable(self, room_id, caller).await?;
34 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
3535 if cmd.content.chars().count() > self.config().chat.max_message_len {
3636 return Err(ChatError::BadRequest("draft too long".to_string()));
3737 }
@@ -99,7 +99,7 @@
9999 room_id: Uuid,
100100 thread_id: Option<Uuid>,
101101 ) -> Result<Option<DraftDto>, ChatError> {
102 let _ctx = require_room_readable(self, room_id, caller).await?;
102 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
103103 let rows = user_drafts::Entity::find()
104104 .filter(user_drafts::Column::UserId.eq(caller))
105105 .filter(user_drafts::Column::RoomId.eq(room_id))
@@ -122,7 +122,7 @@
122122 room_id: Uuid,
123123 thread_id: Option<Uuid>,
124124 ) -> Result<(), ChatError> {
125 let _ctx = require_room_readable(self, room_id, caller).await?;
125 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
126126 let mut q = user_drafts::Entity::delete_many()
127127 .filter(user_drafts::Column::UserId.eq(caller))
128128 .filter(user_drafts::Column::RoomId.eq(room_id));
Modified lib/chat/src/services/emojis.rs lib/chat/src/services/emojis.rs +3 −3 View lib/chat/src/services/emojis.rs
@@ -8,7 +8,7 @@
88
99use crate::errors::ChatError;
1010use crate::services::service::ChatService;
11use crate::share::authz::require_space_manager;
11use crate::share::authz;
1212use crate::share::lookup::{lookup_space_by_name, require_space_member};
1313
1414pub const EMOJI_PREFIX: &str = "chat/emojis";
@@ -91,7 +91,7 @@
9191 ) -> Result<EmojiDto, ChatError> {
9292 let space = lookup_space_by_name(self, space_name).await?;
9393 require_space_member(self, &space, caller).await?;
94 require_space_manager(self, &space, caller).await?;
94 authz::require_space_manager(self, &space, caller).await?;
9595
9696 let name = cmd.name.trim().to_string();
9797 let lower = name.to_lowercase();
@@ -179,7 +179,7 @@
179179 ) -> Result<(), ChatError> {
180180 let space = lookup_space_by_name(self, space_name).await?;
181181 require_space_member(self, &space, caller).await?;
182 require_space_manager(self, &space, caller).await?;
182 authz::require_space_manager(self, &space, caller).await?;
183183 let row = emojis::Entity::find_by_id(emoji_id)
184184 .filter(emojis::Column::SpaceId.eq(space.id))
185185 .one(self.db().write())
Modified lib/chat/src/services/messages.rs lib/chat/src/services/messages.rs +14 −15 View lib/chat/src/services/messages.rs
@@ -1,9 +1,7 @@
11use models::chat::attachments::{self as attachment_rows};
2use models::chat::message_edits;
32use models::chat::messages::{self, AuthorType, ChatMessageType};
4use models::chat::reactions;
53use models::chat::thread_members::{self, ThreadNotifyLevel};
6use models::chat::threads;
4use models::chat::{message_edits, reactions, threads};
75use models::room::rooms::{self, RoomKind};
86use models::users::user_notifications::NotificationType;
97use sea_orm::sea_query::Expr;
@@ -33,18 +31,16 @@
3331}
3432use crate::services::reactions::ReactionAggDto;
3533use crate::services::service::ChatService;
36use crate::services::threads::maintain_thread_on_reply;
37use crate::share::authz::can_manage_space;
3834use crate::share::lookup::{
3935 RoomContext, require_room_readable, require_room_writable, space_slug_for,
4036};
41use crate::share::mention::parse_mentions;
4237use crate::share::notify::{
4338 NotifyDecision, advance_read_state, current_room_seq, fanout_everyone_mentions,
4439 mention_email_allowed, next_room_seq, notification_decision, notify_user,
4540 publish_message_event, record_mentions,
4641};
4742use crate::share::realtime::RoomEvent;
43use crate::share::{authz, mention};
4844
4945const NONCE_CONFLICT: &str = "chat-nonce-conflict";
5046
@@ -348,7 +344,7 @@
348344 return Ok(());
349345 }
350346 if let Some(space) = &ctx.space
351 && can_manage_space(self, space, caller).await?
347 && authz::can_manage_space(self, space, caller).await?
352348 {
353349 return Ok(());
354350 }
@@ -465,7 +461,7 @@
465461 None
466462 };
467463
468 let parsed = parse_mentions(self, &ctx, &cmd.content, caller).await?;
464 let parsed = mention::parse_mentions(self, &ctx, &cmd.content, caller).await?;
469465 let mention_uids = parsed.users.clone();
470466 // Resolve every mentioned recipient's language up front: the
471467 // notification rows are written inside the transaction and each one has
@@ -506,7 +502,7 @@
506502 let embeds_json = json!([]);
507503 let mention_everyone = if parsed.everyone {
508504 match &ctx.space {
509 Some(space) => can_manage_space(self, space, caller).await?,
505 Some(space) => authz::can_manage_space(self, space, caller).await?,
510506 None => true,
511507 }
512508 } else {
@@ -626,7 +622,10 @@
626622 .await?;
627623
628624 if let Some(t) = &thread_clone {
629 maintain_thread_on_reply(txn, t, message_id, caller, now).await?;
625 crate::services::threads::maintain_thread_on_reply(
626 txn, t, message_id, caller, now,
627 )
628 .await?;
630629 }
631630
632631 record_mentions(txn, room.id, message_id, &mention_uids_for_txn).await?;
@@ -989,7 +988,7 @@
989988 .ok_or(ChatError::NotFound)?;
990989
991990 let is_manager = match &ctx.space {
992 Some(space) => can_manage_space(self, space, caller).await?,
991 Some(space) => authz::can_manage_space(self, space, caller).await?,
993992 None => false,
994993 };
995994 if row.author_id != caller && !is_manager {
@@ -1012,13 +1011,13 @@
10121011 let old_attachments = row.attachments.clone();
10131012 let now = OffsetDateTime::now_utc();
10141013
1015 let parsed = parse_mentions(self, &ctx, &content, caller).await?;
1014 let parsed = mention::parse_mentions(self, &ctx, &content, caller).await?;
10161015 let fallback_locale = i18n::config_fallback(self.config().email.default_locale());
10171016 let new_mention_locales =
10181017 i18n::resolve_user_locales(self.db().read(), &parsed.users, fallback_locale).await;
10191018 let mention_everyone = if parsed.everyone {
10201019 match &ctx.space {
1021 Some(space) => can_manage_space(self, space, caller).await?,
1020 Some(space) => authz::can_manage_space(self, space, caller).await?,
10221021 None => true,
10231022 }
10241023 } else {
@@ -1183,7 +1182,7 @@
11831182 ) -> Result<(), ChatError> {
11841183 let ctx = require_room_readable(self, room_id, caller).await?;
11851184 let is_manager = match &ctx.space {
1186 Some(space) => can_manage_space(self, space, caller).await?,
1185 Some(space) => authz::can_manage_space(self, space, caller).await?,
11871186 None => false,
11881187 };
11891188
@@ -1305,7 +1304,7 @@
13051304 ) -> Result<MessageDto, ChatError> {
13061305 let ctx = require_room_readable(self, room_id, caller).await?;
13071306 if ctx.space.is_some()
1308 && !can_manage_space(self, ctx.space.as_ref().unwrap(), caller).await?
1307 && !authz::can_manage_space(self, ctx.space.as_ref().unwrap(), caller).await?
13091308 {
13101309 return Err(ChatError::Forbidden);
13111310 }
Modified lib/chat/src/services/oembed.rs lib/chat/src/services/oembed.rs +1 −2 View lib/chat/src/services/oembed.rs
@@ -6,8 +6,7 @@
66
77use social::Enrichment;
88
9use crate::services::outbound::fetch_following;
10use crate::services::outbound::validate_outbound_url;
9use crate::services::outbound::{fetch_following, validate_outbound_url};
1110
1211const MAX_BYTES: usize = 262_144;
1312
Modified lib/chat/src/services/presence.rs lib/chat/src/services/presence.rs +0 −1 View lib/chat/src/services/presence.rs
@@ -1,5 +1,4 @@
11use models::chat::presence_states::{self, PresenceStatus};
2use models::space::space_members::{self, MemberStatus};
32use models::users::user_preferences;
43use redis::AsyncCommands;
54use sea_orm::{
Modified lib/chat/src/services/reactions.rs lib/chat/src/services/reactions.rs +5 −6 View lib/chat/src/services/reactions.rs
@@ -1,5 +1,4 @@
1use models::chat::messages;
2use models::chat::reactions;
1use models::chat::{messages, reactions};
32use sea_orm::{ColumnTrait, EntityTrait, QueryFilter, QueryOrder, Set};
43use serde::{Deserialize, Serialize};
54use time::OffsetDateTime;
@@ -8,7 +7,7 @@
87
98use crate::errors::ChatError;
109use crate::services::service::ChatService;
11use crate::share::lookup::require_room_readable;
10use crate::share::lookup;
1211use crate::share::realtime::RoomEvent;
1312
1413#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -42,7 +41,7 @@
4241 if emoji.is_empty() || emoji.chars().count() > self.config().chat.max_reaction_emoji_len {
4342 return Err(ChatError::BadRequest("invalid emoji".to_string()));
4443 }
45 let _ctx = require_room_readable(self, room_id, caller).await?;
44 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
4645 let message = messages::Entity::find_by_id(message_id)
4746 .filter(messages::Column::RoomId.eq(room_id))
4847 .one(self.db().read())
@@ -81,7 +80,7 @@
8180 cmd: ReactionCmd,
8281 ) -> Result<Vec<ReactionAggDto>, ChatError> {
8382 let emoji = cmd.emoji.trim().to_string();
84 let _ctx = require_room_readable(self, room_id, caller).await?;
83 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
8584 reactions::Entity::delete_many()
8685 .filter(reactions::Column::MessageId.eq(message_id))
8786 .filter(reactions::Column::Emoji.eq(&emoji))
@@ -97,7 +96,7 @@
9796 room_id: Uuid,
9897 message_id: Uuid,
9998 ) -> Result<Vec<ReactionUserDto>, ChatError> {
100 let _ctx = require_room_readable(self, room_id, caller).await?;
99 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
101100 let rows = reactions::Entity::find()
102101 .filter(reactions::Column::MessageId.eq(message_id))
103102 .order_by_asc(reactions::Column::Emoji)
Modified lib/chat/src/services/read_state.rs lib/chat/src/services/read_state.rs +3 −5 View lib/chat/src/services/read_state.rs
@@ -1,6 +1,4 @@
1use models::chat::messages;
2use models::chat::read_states;
3use models::chat::room_seq;
1use models::chat::{messages, read_states, room_seq};
42use models::room::rooms;
53use models::users::user_recent_mentions;
64use sea_orm::{ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter};
@@ -12,7 +10,7 @@
1210use crate::errors::ChatError;
1311use crate::services::service::ChatService;
1412use crate::share::lookup::{lookup_space_by_name, require_room_readable, require_space_member};
15use crate::share::notify::advance_read_state;
13use crate::share::notify;
1614
1715#[derive(Debug, Clone, Serialize, ToSchema)]
1816pub struct ReadStateDto {
@@ -84,7 +82,7 @@
8482 };
8583
8684 let changed =
87 advance_read_state(self.db().write(), caller, room_id, message_id, seq).await?;
85 notify::advance_read_state(self.db().write(), caller, room_id, message_id, seq).await?;
8886 if changed {
8987 self.realtime
9088 .publish_user(
Modified lib/chat/src/services/reminders.rs lib/chat/src/services/reminders.rs +2 −2 View lib/chat/src/services/reminders.rs
@@ -14,7 +14,7 @@
1414use crate::errors::ChatError;
1515use crate::services::service::ChatService;
1616use crate::share::lookup::{require_room_readable, space_slug_for};
17use crate::share::notify::notify_user;
17use crate::share::notify;
1818
1919#[derive(Debug, Clone, Serialize, ToSchema)]
2020pub struct ReminderDto {
@@ -230,7 +230,7 @@
230230 "message_id": reminder.message_id,
231231 "space_name": space_slug_for(self, space_id).await,
232232 });
233 if let Err(error) = notify_user(
233 if let Err(error) = notify::notify_user(
234234 self.db().write(),
235235 &pending,
236236 reminder.user_id,
Modified lib/chat/src/services/room_admin.rs lib/chat/src/services/room_admin.rs +5 −6 View lib/chat/src/services/room_admin.rs
@@ -1,6 +1,5 @@
1use models::room::room_bans;
21use models::room::room_members::{self, RoomMemberRole};
3use models::room::rooms;
2use models::room::{room_bans, rooms};
43use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, Set};
54use serde::{Deserialize, Serialize};
65use space::services::spaces::UserDto;
@@ -11,7 +10,7 @@
1110use crate::errors::ChatError;
1211use crate::services::rooms::RoomMemberDto;
1312use crate::services::service::ChatService;
14use crate::share::lookup::lookup_room;
13use crate::share::lookup;
1514use crate::share::realtime::RoomEvent;
1615
1716#[derive(Debug, Clone, Serialize, ToSchema)]
@@ -132,7 +131,7 @@
132131 room_id: Uuid,
133132 uid: i64,
134133 ) -> Result<(), ChatError> {
135 let room = lookup_room(self, room_id).await?;
134 let room = lookup::lookup_room(self, room_id).await?;
136135 if caller == uid {
137136 return Err(ChatError::BadRequest(
138137 "use leave endpoint instead".to_string(),
@@ -162,7 +161,7 @@
162161 room_id: Uuid,
163162 cmd: BanRoomMemberCmd,
164163 ) -> Result<RoomBanDto, ChatError> {
165 let room = lookup_room(self, room_id).await?;
164 let room = lookup::lookup_room(self, room_id).await?;
166165 require_room_role(self, room_id, caller, RoomMemberRole::Moderator).await?;
167166 if cmd.user_id == room.owner_id {
168167 return Err(ChatError::Forbidden);
@@ -240,7 +239,7 @@
240239 room_id: Uuid,
241240 new_owner: i64,
242241 ) -> Result<(), ChatError> {
243 let room = lookup_room(self, room_id).await?;
242 let room = lookup::lookup_room(self, room_id).await?;
244243 if room.owner_id != caller {
245244 return Err(ChatError::Forbidden);
246245 }
Modified lib/chat/src/services/rooms.rs lib/chat/src/services/rooms.rs +6 −8 View lib/chat/src/services/rooms.rs
@@ -1,7 +1,5 @@
11use models::chat::messages::{self, ChatMessageType};
2use models::chat::read_states;
3use models::chat::room_seq;
4use models::chat::room_user_settings;
2use models::chat::{read_states, room_seq, room_user_settings};
53use models::dir::dirs::{self, DirKind};
64use models::room::room_invites;
75use models::room::room_members::{self, RoomMemberRole};
@@ -22,7 +20,7 @@
2220
2321use crate::errors::ChatError;
2422use crate::services::service::ChatService;
25use crate::share::authz::can_manage_space;
23use crate::share::authz;
2624use crate::share::lookup::{
2725 is_room_member, load_room_context, lookup_room, lookup_space_by_name, require_room_readable,
2826 require_space_member,
@@ -339,7 +337,7 @@
339337 if needs_manage {
340338 match &ctx.space {
341339 Some(space) => {
342 if !can_manage_space(self, space, caller).await? {
340 if !authz::can_manage_space(self, space, caller).await? {
343341 return Err(ChatError::Forbidden);
344342 }
345343 }
@@ -625,7 +623,7 @@
625623 let ctx = require_room_readable(self, room_id, caller).await?;
626624 match &ctx.space {
627625 Some(space) => {
628 if !can_manage_space(self, space, caller).await? {
626 if !authz::can_manage_space(self, space, caller).await? {
629627 return Err(ChatError::Forbidden);
630628 }
631629 }
@@ -753,7 +751,7 @@
753751 let Some(space) = &ctx.space else {
754752 return Err(ChatError::BadRequest("cannot invite to a DM".to_string()));
755753 };
756 if !can_manage_space(self, space, caller).await?
754 if !authz::can_manage_space(self, space, caller).await?
757755 && !effective_permissions(&self.state, space, caller)
758756 .await?
759757 .has(MANAGE_INVITES)
@@ -935,7 +933,7 @@
935933 if row.inviter_id != caller {
936934 match &ctx.space {
937935 Some(space) => {
938 if !can_manage_space(self, space, caller).await? {
936 if !authz::can_manage_space(self, space, caller).await? {
939937 return Err(ChatError::Forbidden);
940938 }
941939 }
Modified lib/chat/src/services/service.rs lib/chat/src/services/service.rs +0 −2 View lib/chat/src/services/service.rs
@@ -5,8 +5,6 @@
55use export::AppState;
66use export::database::AppDatabase;
77use export::storage::AppStorage;
8use models::users::user;
9use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
108use space::services::spaces::UserDto;
119
1210use crate::errors::ChatError;
Modified lib/chat/src/services/settings.rs lib/chat/src/services/settings.rs +3 −3 View lib/chat/src/services/settings.rs
@@ -7,7 +7,7 @@
77
88use crate::errors::ChatError;
99use crate::services::service::ChatService;
10use crate::share::lookup::require_room_readable;
10use crate::share::lookup;
1111
1212#[derive(Debug, Clone, Serialize, ToSchema)]
1313pub struct RoomSettingDto {
@@ -52,7 +52,7 @@
5252 caller: i64,
5353 room_id: Uuid,
5454 ) -> Result<RoomSettingDto, ChatError> {
55 let _ctx = require_room_readable(self, room_id, caller).await?;
55 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
5656 let row = room_user_settings::Entity::find_by_id((caller, room_id))
5757 .one(self.db().read())
5858 .await?;
@@ -75,7 +75,7 @@
7575 room_id: Uuid,
7676 cmd: UpdateRoomSettingCmd,
7777 ) -> Result<RoomSettingDto, ChatError> {
78 let _ctx = require_room_readable(self, room_id, caller).await?;
78 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
7979 let now = OffsetDateTime::now_utc();
8080 let existing = room_user_settings::Entity::find_by_id((caller, room_id))
8181 .one(self.db().write())
Modified lib/chat/src/services/threads.rs lib/chat/src/services/threads.rs +8 −9 View lib/chat/src/services/threads.rs
@@ -15,9 +15,8 @@
1515
1616use crate::errors::ChatError;
1717use crate::services::service::ChatService;
18use crate::share::authz::can_manage_space;
19use crate::share::lookup::require_room_readable;
2018use crate::share::realtime::RoomEvent;
19use crate::share::{authz, lookup};
2120
2221#[derive(Debug, Clone, Serialize, ToSchema)]
2322pub struct ThreadDto {
@@ -152,7 +151,7 @@
152151 message_id: Uuid,
153152 cmd: CreateThreadCmd,
154153 ) -> Result<ThreadDto, ChatError> {
155 let _ctx = require_room_readable(self, room_id, caller).await?;
154 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
156155
157156 let root = messages::Entity::find_by_id(message_id)
158157 .filter(messages::Column::RoomId.eq(room_id))
@@ -248,7 +247,7 @@
248247 room_id: Uuid,
249248 q: ListThreadQuery,
250249 ) -> Result<ThreadPage, ChatError> {
251 let _ctx = require_room_readable(self, room_id, caller).await?;
250 let _ctx = lookup::require_room_readable(self, room_id, caller).await?;
252251 let limit = q
253252 .limit
254253 .unwrap_or(self.config().chat.default_pagination)
@@ -302,7 +301,7 @@
302301 .one(self.db().read())
303302 .await?
304303 .ok_or(ChatError::NotFound)?;
305 let _ctx = require_room_readable(self, thread.room_id, caller).await?;
304 let _ctx = lookup::require_room_readable(self, thread.room_id, caller).await?;
306305 let items = self.build_thread_dto(vec![thread]).await?;
307306 Ok(items.into_iter().next().unwrap())
308307 }
@@ -317,10 +316,10 @@
317316 .one(self.db().read())
318317 .await?
319318 .ok_or(ChatError::NotFound)?;
320 let ctx = require_room_readable(self, thread.room_id, caller).await?;
319 let ctx = lookup::require_room_readable(self, thread.room_id, caller).await?;
321320
322321 let is_manager = match &ctx.space {
323 Some(space) => can_manage_space(self, space, caller).await?,
322 Some(space) => authz::can_manage_space(self, space, caller).await?,
324323 None => false,
325324 };
326325 if thread.owner_id != caller && !is_manager {
@@ -369,7 +368,7 @@
369368 .one(self.db().read())
370369 .await?
371370 .ok_or(ChatError::NotFound)?;
372 let _ctx = require_room_readable(self, thread.room_id, caller).await?;
371 let _ctx = lookup::require_room_readable(self, thread.room_id, caller).await?;
373372
374373 let now = OffsetDateTime::now_utc();
375374 let notify_level = cmd.notify_level.unwrap_or(ThreadNotifyLevel::All);
@@ -421,7 +420,7 @@
421420 .one(self.db().read())
422421 .await?
423422 .ok_or(ChatError::NotFound)?;
424 let _ctx = require_room_readable(self, thread.room_id, caller).await?;
423 let _ctx = lookup::require_room_readable(self, thread.room_id, caller).await?;
425424
426425 self.db()
427426 .primary()
Modified lib/chat/src/services/unfurl.rs lib/chat/src/services/unfurl.rs +12 −10 View lib/chat/src/services/unfurl.rs
@@ -5,10 +5,9 @@
55use time::OffsetDateTime;
66use uuid::Uuid;
77
8use crate::services::oembed;
9use crate::services::outbound::fetch_following;
108use crate::services::service::ChatService;
11use crate::share::notify::current_room_seq;
9use crate::services::{oembed, outbound};
10use crate::share::notify;
1211use crate::share::realtime::RoomEvent;
1312
1413const MAX_URLS_PER_MESSAGE: usize = 3;
@@ -287,7 +286,8 @@
287286
288287/// 抓取并解析卡片元数据,同时回报最终落地 URL 与页面自声明的 oEmbed 端点。
289288async fn fetch_meta(url: &str) -> Result<FetchedMeta, String> {
290 let fetched = fetch_following(url, "text/html", Some("text/html"), MAX_FETCH_BYTES).await?;
289 let fetched =
290 outbound::fetch_following(url, "text/html", Some("text/html"), MAX_FETCH_BYTES).await?;
291291 let text = fetched.body;
292292 let head = match text.find("</head>") {
293293 Some(idx) => &text[..idx],
@@ -516,7 +516,7 @@
516516 let Ok(payload) = serde_json::to_value(&dto) else {
517517 return;
518518 };
519 let seq = current_room_seq(self.db().read(), room_id).await;
519 let seq = notify::current_room_seq(self.db().read(), room_id).await;
520520 let event = RoomEvent::MessageEdited {
521521 room_id,
522522 seq,
@@ -589,7 +589,6 @@
589589mod tests {
590590 use super::*;
591591 use crate::services::messages::MessageEmbedDto;
592 use crate::services::outbound::decode_body;
593592
594593 /// 平台 embed 必须能原样填进 `MessageDto::embeds`,否则聊天里收到的一直是
595594 /// 空数组 —— 这正是此前链接卡片链路断掉的位置。
@@ -730,18 +729,21 @@
730729 #[test]
731730 fn gbk_pages_decode_from_the_declared_charset() {
732731 let (encoded, _, _) = encoding_rs::GBK.encode("中文标题");
733 let text = decode_body(&encoded, "text/html; charset=gbk");
732 let text = outbound::decode_body(&encoded, "text/html; charset=gbk");
734733 assert_eq!(text, "中文标题");
735 let text = decode_body(&encoded, "text/html; charset=GB2312");
734 let text = outbound::decode_body(&encoded, "text/html; charset=GB2312");
736735 assert_eq!(text, "中文标题");
737736 }
738737
739738 /// 没声明 charset 时 UTF-8 直通;非法 UTF-8 回退 GB18030 而不是替换成 U+FFFD。
740739 #[test]
741740 fn undeclared_charsets_fall_back_to_utf8_then_gb18030() {
742 assert_eq!(decode_body("标题".as_bytes(), "text/html"), "标题");
741 assert_eq!(
742 outbound::decode_body("标题".as_bytes(), "text/html"),
743 "标题"
744 );
743745 let (encoded, _, _) = encoding_rs::GB18030.encode("中文标题");
744 assert_eq!(decode_body(&encoded, "text/html"), "中文标题");
746 assert_eq!(outbound::decode_body(&encoded, "text/html"), "中文标题");
745747 }
746748
747749 /// Wikipedia 这类带括号的路径不能被当成句尾括号裁掉。
Modified lib/chat/src/services/voice.rs lib/chat/src/services/voice.rs +3 −7 View lib/chat/src/services/voice.rs
@@ -11,7 +11,7 @@
1111use uuid::Uuid;
1212
1313use crate::errors::ChatError;
14use crate::services::room_admin::active_room_role;
14use crate::services::room_admin;
1515use crate::services::service::ChatService;
1616use crate::share::lookup::{lookup_space_by_name, require_room_readable};
1717use crate::share::realtime::RoomEvent;
@@ -274,7 +274,7 @@
274274 room_id: Uuid,
275275 uid: i64,
276276) -> Result<bool, ChatError> {
277 if let Some(role) = active_room_role(service, room_id, uid).await?
277 if let Some(role) = room_admin::active_room_role(service, room_id, uid).await?
278278 && role >= models::room::room_members::RoomMemberRole::Moderator
279279 {
280280 return Ok(true);
@@ -918,11 +918,7 @@
918918 Ok(())
919919 }
920920
921 pub async fn list_hands(
922 &self,
923 caller: i64,
924 room_id: Uuid,
925 ) -> Result<VoiceHandsDto, ChatError> {
921 pub async fn list_hands(&self, caller: i64, room_id: Uuid) -> Result<VoiceHandsDto, ChatError> {
926922 require_voice_room(self, room_id, caller).await?;
927923 let can_moderate = can_moderate_voice(self, room_id, caller).await?;
928924 let stored = read_hands(self, room_id).await?;
Modified lib/chat/src/services/webhooks.rs lib/chat/src/services/webhooks.rs +5 −5 View lib/chat/src/services/webhooks.rs
@@ -10,7 +10,7 @@
1010use crate::errors::ChatError;
1111use crate::services::messages::SendMessageCmd;
1212use crate::services::service::ChatService;
13use crate::share::authz::can_manage_space;
13use crate::share::authz;
1414use crate::share::lookup::{is_room_member, lookup_room, require_room_readable};
1515
1616#[derive(Debug, Clone, Serialize, ToSchema)]
@@ -113,7 +113,7 @@
113113 let ctx = require_room_readable(self, room_id, caller).await?;
114114 match &ctx.space {
115115 Some(space) => {
116 if !can_manage_space(self, space, caller).await? {
116 if !authz::can_manage_space(self, space, caller).await? {
117117 return Err(ChatError::Forbidden);
118118 }
119119 }
@@ -159,7 +159,7 @@
159159 let ctx = require_room_readable(self, room_id, caller).await?;
160160 match &ctx.space {
161161 Some(space) => {
162 if !can_manage_space(self, space, caller).await? {
162 if !authz::can_manage_space(self, space, caller).await? {
163163 return Err(ChatError::Forbidden);
164164 }
165165 }
@@ -182,7 +182,7 @@
182182 let ctx = require_room_readable(self, room_id, caller).await?;
183183 match &ctx.space {
184184 Some(space) => {
185 if !can_manage_space(self, space, caller).await? {
185 if !authz::can_manage_space(self, space, caller).await? {
186186 return Err(ChatError::Forbidden);
187187 }
188188 }
@@ -221,7 +221,7 @@
221221 let ctx = require_room_readable(self, room_id, caller).await?;
222222 match &ctx.space {
223223 Some(space) => {
224 if !can_manage_space(self, space, caller).await? {
224 if !authz::can_manage_space(self, space, caller).await? {
225225 return Err(ChatError::Forbidden);
226226 }
227227 }
Modified lib/chat/src/share/lookup.rs lib/chat/src/share/lookup.rs +3 −5 View lib/chat/src/share/lookup.rs
@@ -1,9 +1,7 @@
1use models::room::room_bans;
2use models::room::room_members;
31use models::room::rooms::{self, RoomKind};
4use models::space::space_members;
5use models::space::spaces;
6use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
2use models::room::{room_bans, room_members};
3use models::space::{space_members, spaces};
4use sea_orm::EntityTrait;
75use space::share::authz::{MESSAGE, effective_permissions};
86use uuid::Uuid;
97
Modified lib/chat/src/share/mention.rs lib/chat/src/share/mention.rs +2 −3 View lib/chat/src/share/mention.rs
@@ -1,8 +1,7 @@
11use models::room::room_members;
22use models::space::space_groups;
3use models::space::space_members::{self, MemberStatus};
4use models::users::user;
5use sea_orm::{ColumnTrait, Condition, EntityTrait, QueryFilter};
3use models::space::space_members::MemberStatus;
4use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
65use uuid::Uuid;
76
87use crate::errors::ChatError;
Modified lib/chat/src/share/notify.rs lib/chat/src/share/notify.rs +1 −1 View lib/chat/src/share/notify.rs
@@ -1,7 +1,7 @@
11use models::chat::room_seq;
22use models::chat::room_user_settings::{self, RoomNotificationLevel};
33use models::room::room_members;
4use models::space::space_members::{self, MemberStatus, MessageNotifications};
4use models::space::space_members::MessageNotifications;
55use models::users::user_notifications::{self, NotificationType};
66use models::users::user_recent_mentions;
77use sea_orm::{
Modified lib/config/src/lib.rs lib/config/src/lib.rs +3 −0 View lib/config/src/lib.rs
@@ -21,9 +21,12 @@
2121pub mod web;
2222
2323pub mod error;
24pub mod identity;
2425pub mod loader;
26pub mod net;
2527
2628pub use error::ConfigError;
29pub use net::is_loopback_host;
2730
2831use crate::apihost::ApihostConfig;
2932use crate::auth::AuthConfig;
Modified lib/config/src/loader.rs lib/config/src/loader.rs +2 −4 View lib/config/src/loader.rs
@@ -1,9 +1,7 @@
11use std::path::Path;
22
3use figment::{
4 Figment,
5 providers::{Env, Format, Toml},
6};
3use figment::Figment;
4use figment::providers::{Env, Format, Toml};
75
86use crate::AppConfig;
97use crate::error::ConfigError;
Modified lib/config/src/oauth.rs lib/config/src/oauth.rs +9 −3 View lib/config/src/oauth.rs
@@ -96,7 +96,10 @@
9696 }
9797
9898 pub fn authorization_endpoint(&self) -> String {
99 format!("{}/api/v1/oauth/authorize", self.issuer.trim_end_matches('/'))
99 format!(
100 "{}/api/v1/oauth/authorize",
101 self.issuer.trim_end_matches('/')
102 )
100103 }
101104
102105 pub fn end_session_endpoint(&self) -> String {
@@ -111,7 +114,10 @@
111114 return Err("oauth.issuer is required".to_string());
112115 }
113116 if !self.issuer.starts_with("http://") && !self.issuer.starts_with("https://") {
114 return Err(format!("oauth.issuer must be an http(s) URL: {:?}", self.issuer));
117 return Err(format!(
118 "oauth.issuer must be an http(s) URL: {:?}",
119 self.issuer
120 ));
115121 }
116122 if self.client_id.is_empty() {
117123 return Err("oauth.client_id is required".to_string());
@@ -149,4 +155,4 @@
149155 }
150156 Ok(())
151157 }
152}
No newline at end of file
158}
Modified lib/config/Cargo.toml lib/config/Cargo.toml +4 −1 View lib/config/Cargo.toml
@@ -7,7 +7,10 @@
77serde = { workspace = true, features = ["derive"] }
88sea-orm = { workspace = true, features = ["sqlx-postgres", "runtime-tokio-rustls"] }
99base64 = { workspace = true }
10figment = { workspace = true }
10figment = { workspace = true, features = ["json", "yaml"] }
11accounts = { workspace = true }
12chrono = { version = "0.4.45", features = ["serde"] }
13serde_json = { workspace = true }
1114dotenvy = { workspace = true }
1215thiserror = { workspace = true }
1316tracing = { workspace = true }
Modified lib/deletion/src/lib.rs lib/deletion/src/lib.rs +28 −14 View lib/deletion/src/lib.rs
@@ -17,9 +17,7 @@
1717 user_followers, user_notifications, user_preferences, user_profiles, user_push_subscriptions,
1818 user_recent_mentions, user_saved_messages,
1919};
20use sea_orm::{
21 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QuerySelect, Set,
22};
20use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QuerySelect, Set};
2321use serde::Serialize;
2422use time::OffsetDateTime;
2523use uuid::Uuid;
@@ -45,13 +43,18 @@
4543
4644impl DeletionError {
4745 pub fn is_retryable(&self) -> bool {
48 !matches!(self, Self::Conflict(_) | Self::NotFound(_) | Self::Config(_))
46 !matches!(
47 self,
48 Self::Conflict(_) | Self::NotFound(_) | Self::Config(_)
49 )
4950 }
5051}
5152
5253fn ken_auth(error: KenAuthError) -> DeletionError {
5354 match error {
54 KenAuthError::NotFound => DeletionError::NotFound("account or organization not found".into()),
55 KenAuthError::NotFound => {
56 DeletionError::NotFound("account or organization not found".into())
57 }
5558 KenAuthError::Rejected(message) => DeletionError::Conflict(message),
5659 other => DeletionError::KenAuth(other.to_string()),
5760 }
@@ -200,10 +203,7 @@
200203 Ok(status_of_account(&row))
201204}
202205
203pub async fn cancel_account_deletion(
204 state: &AppState,
205 user_id: i64,
206) -> Result<(), DeletionError> {
206pub async fn cancel_account_deletion(state: &AppState, user_id: i64) -> Result<(), DeletionError> {
207207 client(state)?
208208 .cancel_account_deletion(user_id)
209209 .await
@@ -448,7 +448,10 @@
448448 let now = now();
449449
450450 rooms::Entity::update_many()
451 .col_expr(rooms::Column::IsActive, sea_orm::sea_query::Expr::value(false))
451 .col_expr(
452 rooms::Column::IsActive,
453 sea_orm::sea_query::Expr::value(false),
454 )
452455 .filter(rooms::Column::SpaceId.eq(Some(space_id)))
453456 .exec(db)
454457 .await?;
@@ -483,13 +486,22 @@
483486 }
484487 if !dir_ids.is_empty() {
485488 dirs::Entity::update_many()
486 .col_expr(dirs::Column::IsArchived, sea_orm::sea_query::Expr::value(true))
487 .col_expr(dirs::Column::ArchivedAt, sea_orm::sea_query::Expr::value(Some(now)))
489 .col_expr(
490 dirs::Column::IsArchived,
491 sea_orm::sea_query::Expr::value(true),
492 )
493 .col_expr(
494 dirs::Column::ArchivedAt,
495 sea_orm::sea_query::Expr::value(Some(now)),
496 )
488497 .filter(dirs::Column::Id.is_in(dir_ids.clone()))
489498 .exec(db)
490499 .await?;
491500 repos::Entity::update_many()
492 .col_expr(repos::Column::IsArchived, sea_orm::sea_query::Expr::value(true))
501 .col_expr(
502 repos::Column::IsArchived,
503 sea_orm::sea_query::Expr::value(true),
504 )
493505 .filter(repos::Column::DirId.is_in(dir_ids.clone()))
494506 .exec(db)
495507 .await?;
@@ -558,7 +570,9 @@
558570 .filter(space_bans::Column::SpaceId.eq(space_id))
559571 .exec(db)
560572 .await?;
561 space_extras::Entity::delete_by_id(space_id).exec(db).await?;
573 space_extras::Entity::delete_by_id(space_id)
574 .exec(db)
575 .await?;
562576 space_member_extras::Entity::delete_many()
563577 .filter(space_member_extras::Column::SpaceId.eq(space_id))
564578 .exec(db)
Modified lib/export/src/metrics.rs lib/export/src/metrics.rs +2 −3 View lib/export/src/metrics.rs
@@ -1,9 +1,8 @@
11use std::sync::LazyLock;
22use std::time::Duration;
33
4use opentelemetry::global;
5use opentelemetry::metrics::{Counter, Gauge, UpDownCounter};
6use opentelemetry::{KeyValue, metrics::Meter};
4use opentelemetry::metrics::{Counter, Gauge, Meter, UpDownCounter};
5use opentelemetry::{KeyValue, global};
76
87use crate::redis::AppRedis;
98
Modified lib/export/src/oauth_client.rs lib/export/src/oauth_client.rs +1 −1 View lib/export/src/oauth_client.rs
@@ -10,4 +10,4 @@
1010
1111pub fn client() -> Option<&'static Arc<KenAuthClient>> {
1212 CLIENT.get()
13}
No newline at end of file
13}
Modified lib/export/src/redis.rs lib/export/src/redis.rs +1 −1 View lib/export/src/redis.rs
@@ -587,7 +587,7 @@
587587}
588588
589589macro_rules! dispatch {
590 ($conn:expr, |$c:ident| $body:expr) => {
590 ($conn:expr, | $c:ident | $body:expr) => {
591591 match &mut $conn {
592592 RedisConnection::Standalone($c) => $body,
593593 RedisConnection::Cluster($c) => $body,
Modified lib/export/src/telemetry.rs lib/export/src/telemetry.rs +1 −2 View lib/export/src/telemetry.rs
@@ -3,10 +3,9 @@
33
44use axum::extract::MatchedPath;
55use axum::http::{HeaderMap, Request, Response};
6use opentelemetry::Context;
7use opentelemetry::global;
86use opentelemetry::propagation::TextMapCompositePropagator;
97use opentelemetry::trace::TracerProvider as _;
8use opentelemetry::{Context, global};
109use opentelemetry_http::{HeaderExtractor, HeaderInjector};
1110use opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider, Temporality};
1211use opentelemetry_sdk::propagation::{BaggagePropagator, TraceContextPropagator};
Modified lib/export/src/urls.rs lib/export/src/urls.rs +0 −1 View lib/export/src/urls.rs
@@ -1,4 +1,3 @@
1
21/// Object-storage locator prefix written by every upload endpoint.
32const STORAGE_SCHEME: &str = "storage://";
43
Modified lib/git/src/handler/analysis/code_activity.rs lib/git/src/handler/analysis/code_activity.rs +2 −2 View lib/git/src/handler/analysis/code_activity.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::analysis::CodeActivityDto;
99
@@ -29,7 +29,7 @@
2929 Path(path): Path<crate::handler::RepoPath>,
3030 Query(q): Query<CodeActivityQuery>,
3131) -> Result<AppResponseData<CodeActivityDto>, ApiError> {
32 let _ = resolve_reader(
32 let _ = handler::resolve_reader(
3333 &service,
3434 &session,
3535 path.space_name.clone(),
Modified lib/git/src/handler/analysis/contributors.rs lib/git/src/handler/analysis/contributors.rs +2 −2 View lib/git/src/handler/analysis/contributors.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::analysis::ContributorStatDto;
99
@@ -22,7 +22,7 @@
2222 session: Session,
2323 Path(path): Path<crate::handler::RepoPath>,
2424) -> Result<AppResponseData<Vec<ContributorStatDto>>, ApiError> {
25 let _ = resolve_reader(
25 let _ = handler::resolve_reader(
2626 &service,
2727 &session,
2828 path.space_name.clone(),
Modified lib/git/src/handler/analysis/languages.rs lib/git/src/handler/analysis/languages.rs +2 −2 View lib/git/src/handler/analysis/languages.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::require_writer;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::analysis::LanguageStatDto;
99
@@ -22,7 +22,7 @@
2222 session: Session,
2323 Path(path): Path<crate::handler::RepoPath>,
2424) -> Result<AppResponseData<Vec<LanguageStatDto>>, ApiError> {
25 let (_ctx, _uid) = require_writer(
25 let (_ctx, _uid) = handler::require_writer(
2626 &service,
2727 &session,
2828 path.space_name.clone(),
Modified lib/git/src/handler/analysis/languages_read.rs lib/git/src/handler/analysis/languages_read.rs +2 −2 View lib/git/src/handler/analysis/languages_read.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::analysis::LanguageStatDto;
99
@@ -22,7 +22,7 @@
2222 session: Session,
2323 Path(path): Path<crate::handler::RepoPath>,
2424) -> Result<AppResponseData<Vec<LanguageStatDto>>, ApiError> {
25 let _ = resolve_reader(
25 let _ = handler::resolve_reader(
2626 &service,
2727 &session,
2828 path.space_name.clone(),
Modified lib/git/src/handler/blobs/content.rs lib/git/src/handler/blobs/content.rs +2 −2 View lib/git/src/handler/blobs/content.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::blobs::BlobContentDto;
99
@@ -29,7 +29,7 @@
2929 session: Session,
3030 Path(path): Path<BlobPath>,
3131) -> Result<AppResponseData<BlobContentDto>, ApiError> {
32 let _ = resolve_reader(
32 let _ = handler::resolve_reader(
3333 &service,
3434 &session,
3535 path.space_name.clone(),
Modified lib/git/src/handler/blobs/list_lfs_pointers.rs lib/git/src/handler/blobs/list_lfs_pointers.rs +2 −2 View lib/git/src/handler/blobs/list_lfs_pointers.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::blobs::LfsPointerDto;
99
@@ -39,7 +39,7 @@
3939 Path(path): Path<RepoQuery>,
4040 Query(q): Query<LfsPointerQuery>,
4141) -> Result<AppResponseData<Vec<LfsPointerDto>>, ApiError> {
42 let _ = resolve_reader(
42 let _ = handler::resolve_reader(
4343 &service,
4444 &session,
4545 path.space_name.clone(),
Modified lib/git/src/handler/blobs/metadata.rs lib/git/src/handler/blobs/metadata.rs +2 −2 View lib/git/src/handler/blobs/metadata.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::blobs::BlobMetaDto;
99
@@ -29,7 +29,7 @@
2929 session: Session,
3030 Path(path): Path<BlobPath>,
3131) -> Result<AppResponseData<BlobMetaDto>, ApiError> {
32 let _ = resolve_reader(
32 let _ = handler::resolve_reader(
3333 &service,
3434 &session,
3535 path.space_name.clone(),
Modified lib/git/src/handler/branch_protection/create_policy.rs lib/git/src/handler/branch_protection/create_policy.rs +1 −2 View lib/git/src/handler/branch_protection/create_policy.rs
@@ -4,8 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::RepoPath;
8use crate::handler::require_repo_admin;
7use crate::handler::{RepoPath, require_repo_admin};
98use crate::service::GitService;
109use crate::service::protection::{BranchPolicyDto, CreateBranchPolicyCmd};
1110
Modified lib/git/src/handler/branch_protection/delete_policy.rs lib/git/src/handler/branch_protection/delete_policy.rs +2 −2 View lib/git/src/handler/branch_protection/delete_policy.rs
@@ -4,8 +4,8 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler;
78use crate::handler::branch_protection::PolicyPath;
8use crate::handler::require_repo_admin;
99use crate::service::GitService;
1010
1111#[utoipa::path(
@@ -23,7 +23,7 @@
2323 session: Session,
2424 Path(path): Path<PolicyPath>,
2525) -> Result<(StatusCode, AppResponseData<NoData>), ApiError> {
26 let _ = require_repo_admin(
26 let _ = handler::require_repo_admin(
2727 &service,
2828 &session,
2929 path.space_name.clone(),
Modified lib/git/src/handler/branch_protection/get_policy.rs lib/git/src/handler/branch_protection/get_policy.rs +2 −2 View lib/git/src/handler/branch_protection/get_policy.rs
@@ -3,8 +3,8 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler;
67use crate::handler::branch_protection::PolicyPath;
7use crate::handler::require_repo_admin;
88use crate::service::GitService;
99use crate::service::protection::BranchPolicyDto;
1010
@@ -23,7 +23,7 @@
2323 session: Session,
2424 Path(path): Path<PolicyPath>,
2525) -> Result<AppResponseData<BranchPolicyDto>, ApiError> {
26 let _ = require_repo_admin(
26 let _ = handler::require_repo_admin(
2727 &service,
2828 &session,
2929 path.space_name.clone(),
Modified lib/git/src/handler/branch_protection/list_policies.rs lib/git/src/handler/branch_protection/list_policies.rs +1 −2 View lib/git/src/handler/branch_protection/list_policies.rs
@@ -3,8 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::RepoPath;
7use crate::handler::require_repo_admin;
6use crate::handler::{RepoPath, require_repo_admin};
87use crate::service::GitService;
98use crate::service::protection::BranchPolicyDto;
109
Modified lib/git/src/handler/branch_protection/mod.rs lib/git/src/handler/branch_protection/mod.rs +2 −28 View lib/git/src/handler/branch_protection/mod.rs
@@ -2,33 +2,7 @@
22pub mod delete_policy;
33pub mod get_policy;
44pub mod list_policies;
5mod path;
56pub mod update_policy;
67
7use axum::extract::{FromRequestParts, Path};
8use axum::http::request::Parts;
9use serde::Deserialize;
10use utoipa::IntoParams;
11use uuid::Uuid;
12
13use crate::errors::ApiError;
14
15#[derive(Debug, Clone, Deserialize, IntoParams)]
16pub struct PolicyPath {
17 pub space_name: String,
18 pub repo_name: String,
19 pub policy_id: Uuid,
20}
21
22impl<S> FromRequestParts<S> for PolicyPath
23where
24 S: Send + Sync,
25{
26 type Rejection = ApiError;
27
28 async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
29 Path::<PolicyPath>::from_request_parts(parts, state)
30 .await
31 .map(|Path(p)| p)
32 .map_err(|_| ApiError::bad_request())
33 }
34}
8pub use path::PolicyPath;
Modified lib/git/src/handler/branch_protection/update_policy.rs lib/git/src/handler/branch_protection/update_policy.rs +2 −2 View lib/git/src/handler/branch_protection/update_policy.rs
@@ -4,8 +4,8 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler;
78use crate::handler::branch_protection::PolicyPath;
8use crate::handler::require_repo_admin;
99use crate::service::GitService;
1010use crate::service::protection::{BranchPolicyDto, UpdateBranchPolicyCmd};
1111
@@ -26,7 +26,7 @@
2626 Path(path): Path<PolicyPath>,
2727 Json(cmd): Json<UpdateBranchPolicyCmd>,
2828) -> Result<AppResponseData<BranchPolicyDto>, ApiError> {
29 let _ = require_repo_admin(
29 let _ = handler::require_repo_admin(
3030 &service,
3131 &session,
3232 path.space_name.clone(),
Modified lib/git/src/handler/branches/create.rs lib/git/src/handler/branches/create.rs +2 −2 View lib/git/src/handler/branches/create.rs
@@ -4,7 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::require_writer;
7use crate::handler;
88use crate::service::GitService;
99use crate::service::branches::{BranchDto, CreateBranchCmd};
1010
@@ -25,7 +25,7 @@
2525 Path(path): Path<crate::handler::RepoPath>,
2626 Json(cmd): Json<CreateBranchCmd>,
2727) -> Result<AppResponseData<BranchDto>, ApiError> {
28 let _ = require_writer(
28 let _ = handler::require_writer(
2929 &service,
3030 &session,
3131 path.space_name.clone(),
Modified lib/git/src/handler/branches/delete.rs lib/git/src/handler/branches/delete.rs +2 −2 View lib/git/src/handler/branches/delete.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::require_writer;
6use crate::handler;
77use crate::service::GitService;
88
99#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -35,7 +35,7 @@
3535 Path(path): Path<BranchPath>,
3636 Query(query): Query<DeleteBranchQuery>,
3737) -> Result<AppResponseData<NoData>, ApiError> {
38 let _ = require_writer(
38 let _ = handler::require_writer(
3939 &service,
4040 &session,
4141 path.space_name.clone(),
Modified lib/git/src/handler/branches/get.rs lib/git/src/handler/branches/get.rs +2 −2 View lib/git/src/handler/branches/get.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::branches::BranchDto;
99
@@ -29,7 +29,7 @@
2929 session: Session,
3030 Path(path): Path<BranchPath>,
3131) -> Result<AppResponseData<BranchDto>, ApiError> {
32 let _ = resolve_reader(
32 let _ = handler::resolve_reader(
3333 &service,
3434 &session,
3535 path.space_name.clone(),
Modified lib/git/src/handler/branches/list.rs lib/git/src/handler/branches/list.rs +2 −2 View lib/git/src/handler/branches/list.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::branches::BranchDto;
99
@@ -23,7 +23,7 @@
2323 Path(path): Path<crate::handler::RepoPath>,
2424 Query(page): Query<export::pagination::PageQuery>,
2525) -> Result<AppResponseData<export::pagination::Page<BranchDto>>, ApiError> {
26 let _ = resolve_reader(
26 let _ = handler::resolve_reader(
2727 &service,
2828 &session,
2929 path.space_name.clone(),
Modified lib/git/src/handler/branches/rename.rs lib/git/src/handler/branches/rename.rs +2 −2 View lib/git/src/handler/branches/rename.rs
@@ -4,7 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::require_writer;
7use crate::handler;
88use crate::service::GitService;
99
1010#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -36,7 +36,7 @@
3636 Path(path): Path<BranchPath>,
3737 Json(cmd): Json<RenameBranchCmd>,
3838) -> Result<AppResponseData<NoData>, ApiError> {
39 let _ = require_writer(
39 let _ = handler::require_writer(
4040 &service,
4141 &session,
4242 path.space_name.clone(),
Modified lib/git/src/handler/branches/set_default.rs lib/git/src/handler/branches/set_default.rs +2 −2 View lib/git/src/handler/branches/set_default.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::require_writer;
6use crate::handler;
77use crate::service::GitService;
88
99#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -28,7 +28,7 @@
2828 session: Session,
2929 Path(path): Path<BranchPath>,
3030) -> Result<AppResponseData<NoData>, ApiError> {
31 let _ = require_writer(
31 let _ = handler::require_writer(
3232 &service,
3333 &session,
3434 path.space_name.clone(),
Modified lib/git/src/handler/code_comments/create_code_comment.rs lib/git/src/handler/code_comments/create_code_comment.rs +2 −2 View lib/git/src/handler/code_comments/create_code_comment.rs
@@ -4,7 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::require_writer;
7use crate::handler;
88use crate::service::GitService;
99use crate::service::code_comments::{CodeCommentDto, CreateCodeCommentCmd};
1010
@@ -25,7 +25,7 @@
2525 Path(path): Path<crate::handler::RepoPath>,
2626 Json(cmd): Json<CreateCodeCommentCmd>,
2727) -> Result<AppResponseData<CodeCommentDto>, ApiError> {
28 let (_ctx, uid) = require_writer(
28 let (_ctx, uid) = handler::require_writer(
2929 &service,
3030 &session,
3131 path.space_name.clone(),
Modified lib/git/src/handler/code_comments/list_code_comments.rs lib/git/src/handler/code_comments/list_code_comments.rs +2 −2 View lib/git/src/handler/code_comments/list_code_comments.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::code_comments::{CodeCommentPage, ListCodeCommentsQuery};
99
@@ -23,7 +23,7 @@
2323 Path(path): Path<crate::handler::RepoPath>,
2424 Query(query): Query<ListCodeCommentsQuery>,
2525) -> Result<AppResponseData<CodeCommentPage>, ApiError> {
26 let _ = resolve_reader(
26 let _ = handler::resolve_reader(
2727 &service,
2828 &session,
2929 path.space_name.clone(),
Modified lib/git/src/handler/code_comments/resolve_code_comment.rs lib/git/src/handler/code_comments/resolve_code_comment.rs +3 −3 View lib/git/src/handler/code_comments/resolve_code_comment.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::require_writer;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::code_comments::CodeCommentDto;
99
@@ -22,7 +22,7 @@
2222 session: Session,
2323 Path(path): Path<super::modify::CodeCommentPath>,
2424) -> Result<AppResponseData<CodeCommentDto>, ApiError> {
25 let (_ctx, uid) = require_writer(
25 let (_ctx, uid) = handler::require_writer(
2626 &service,
2727 &session,
2828 path.space_name.clone(),
@@ -51,7 +51,7 @@
5151 session: Session,
5252 Path(path): Path<super::modify::CodeCommentPath>,
5353) -> Result<AppResponseData<CodeCommentDto>, ApiError> {
54 let (_ctx, uid) = require_writer(
54 let (_ctx, uid) = handler::require_writer(
5555 &service,
5656 &session,
5757 path.space_name.clone(),
Modified lib/git/src/handler/commits/get.rs lib/git/src/handler/commits/get.rs +2 −2 View lib/git/src/handler/commits/get.rs
@@ -4,7 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::resolve_reader;
7use crate::handler;
88use crate::service::GitService;
99
1010#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -29,7 +29,7 @@
2929 session: Session,
3030 Path(path): Path<CommitPath>,
3131) -> Result<AppResponseData<CommitInfo>, ApiError> {
32 let _ = resolve_reader(
32 let _ = handler::resolve_reader(
3333 &service,
3434 &session,
3535 path.space_name.clone(),
Modified lib/git/src/handler/commits/is_ancestor.rs lib/git/src/handler/commits/is_ancestor.rs +2 −2 View lib/git/src/handler/commits/is_ancestor.rs
@@ -4,7 +4,7 @@
44use serde::Serialize;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::resolve_reader;
7use crate::handler;
88use crate::service::GitService;
99
1010#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -34,7 +34,7 @@
3434 Path(path): Path<crate::handler::RepoPath>,
3535 Query(query): Query<AncestorQuery>,
3636) -> Result<AppResponseData<IsAncestorResponse>, ApiError> {
37 let _ = resolve_reader(
37 let _ = handler::resolve_reader(
3838 &service,
3939 &session,
4040 path.space_name.clone(),
Modified lib/git/src/handler/commits/list.rs lib/git/src/handler/commits/list.rs +2 −2 View lib/git/src/handler/commits/list.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::commits::{CommitsPageDto, ListCommitsCmd};
99
@@ -32,7 +32,7 @@
3232 Path(path): Path<crate::handler::RepoPath>,
3333 Query(cmd): Query<ListCommitsCmd>,
3434) -> Result<AppResponseData<CommitsPageDto>, ApiError> {
35 let (_, viewer) = resolve_reader(
35 let (_, viewer) = handler::resolve_reader(
3636 &service,
3737 &session,
3838 path.space_name.clone(),
Modified lib/git/src/handler/commits/list_commit_statuses.rs lib/git/src/handler/commits/list_commit_statuses.rs +2 −2 View lib/git/src/handler/commits/list_commit_statuses.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::commits::CommitStatusDto;
99
@@ -29,7 +29,7 @@
2929 session: Session,
3030 Path(path): Path<StatusPath>,
3131) -> Result<AppResponseData<Vec<CommitStatusDto>>, ApiError> {
32 let _ = resolve_reader(
32 let _ = handler::resolve_reader(
3333 &service,
3434 &session,
3535 path.space_name.clone(),
Modified lib/git/src/handler/commits/rev_parse.rs lib/git/src/handler/commits/rev_parse.rs +2 −2 View lib/git/src/handler/commits/rev_parse.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88
99#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -28,7 +28,7 @@
2828 session: Session,
2929 Path(path): Path<RevPath>,
3030) -> Result<AppResponseData<String>, ApiError> {
31 let _ = resolve_reader(
31 let _ = handler::resolve_reader(
3232 &service,
3333 &session,
3434 path.space_name.clone(),
Modified lib/git/src/handler/commits/set_commit_status.rs lib/git/src/handler/commits/set_commit_status.rs +2 −2 View lib/git/src/handler/commits/set_commit_status.rs
@@ -4,7 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::require_writer;
7use crate::handler;
88use crate::service::GitService;
99use crate::service::commits::{CommitStatusDto, SetCommitStatusCmd};
1010
@@ -25,7 +25,7 @@
2525 Path(path): Path<crate::handler::RepoPath>,
2626 Json(cmd): Json<SetCommitStatusCmd>,
2727) -> Result<AppResponseData<CommitStatusDto>, ApiError> {
28 let (_ctx, uid) = require_writer(
28 let (_ctx, uid) = handler::require_writer(
2929 &service,
3030 &session,
3131 path.space_name.clone(),
Modified lib/git/src/handler/commits/stats.rs lib/git/src/handler/commits/stats.rs +2 −2 View lib/git/src/handler/commits/stats.rs
@@ -6,7 +6,7 @@
66use jwt::Session;
77
88use crate::errors::{ApiError, GitApiError};
9use crate::handler::resolve_reader;
9use crate::handler;
1010use crate::service::GitService;
1111
1212#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -32,7 +32,7 @@
3232 Path(path): Path<crate::handler::RepoPath>,
3333 Query(query): Query<StatsQuery>,
3434) -> Result<AppResponseData<CommitStats>, ApiError> {
35 let _ = resolve_reader(
35 let _ = handler::resolve_reader(
3636 &service,
3737 &session,
3838 path.space_name.clone(),
Modified lib/git/src/handler/commits/sync_commit.rs lib/git/src/handler/commits/sync_commit.rs +3 −2 View lib/git/src/handler/commits/sync_commit.rs
@@ -4,7 +4,7 @@
44use serde::Serialize;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::require_writer;
7use crate::handler;
88use crate::service::GitService;
99
1010#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -35,7 +35,8 @@
3535 session: Session,
3636 Path(path): Path<CommitPath>,
3737) -> Result<AppResponseData<CommitSyncResponse>, ApiError> {
38 let (ctx, _uid) = require_writer(&service, &session, path.space_name, path.repo_name).await?;
38 let (ctx, _uid) =
39 handler::require_writer(&service, &session, path.space_name, path.repo_name).await?;
3940 let row = service
4041 .sync_commit(&ctx, &path.revision)
4142 .await
Modified lib/git/src/handler/conflicts/detail.rs lib/git/src/handler/conflicts/detail.rs +2 −2 View lib/git/src/handler/conflicts/detail.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::conflicts::ConflictDetailDto;
99
@@ -30,7 +30,7 @@
3030 Path(path): Path<crate::handler::RepoPath>,
3131 Query(q): Query<ConflictDetailQuery>,
3232) -> Result<AppResponseData<ConflictDetailDto>, ApiError> {
33 let _ = resolve_reader(
33 let _ = handler::resolve_reader(
3434 &service,
3535 &session,
3636 path.space_name.clone(),
Modified lib/git/src/handler/conflicts/get_conflicts.rs lib/git/src/handler/conflicts/get_conflicts.rs +2 −2 View lib/git/src/handler/conflicts/get_conflicts.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::conflicts::MergeStatusDto;
99
@@ -31,7 +31,7 @@
3131 Path(path): Path<crate::handler::RepoPath>,
3232 Query(q): Query<GetConflictsQuery>,
3333) -> Result<AppResponseData<MergeStatusDto>, ApiError> {
34 let _ = resolve_reader(
34 let _ = handler::resolve_reader(
3535 &service,
3636 &session,
3737 path.space_name.clone(),
Modified lib/git/src/handler/content/caller_signature.rs lib/git/src/handler/content/caller_signature.rs +2 −2 View lib/git/src/handler/content/caller_signature.rs
@@ -5,7 +5,7 @@
55use time::OffsetDateTime;
66
77use crate::errors::{ApiError, GitApiError};
8use crate::handler::ensure_caller;
8use crate::handler;
99use crate::service::GitService;
1010use crate::service::content::SignatureDto;
1111
@@ -30,7 +30,7 @@
3030 session: Session,
3131 Json(_body): Json<CallerSignatureBody>,
3232) -> Result<AppResponseData<SignatureDto>, ApiError> {
33 let caller = ensure_caller(&session)?;
33 let caller = handler::ensure_caller(&session)?;
3434 let out = service
3535 .caller_signature(caller, OffsetDateTime::now_utc())
3636 .await
Modified lib/git/src/handler/diffs/for_commit.rs lib/git/src/handler/diffs/for_commit.rs +2 −2 View lib/git/src/handler/diffs/for_commit.rs
@@ -4,7 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::resolve_reader;
7use crate::handler;
88use crate::service::GitService;
99
1010#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -29,7 +29,7 @@
2929 session: Session,
3030 Path(path): Path<CommitPath>,
3131) -> Result<AppResponseData<Vec<ChangedPath>>, ApiError> {
32 let _ = resolve_reader(
32 let _ = handler::resolve_reader(
3333 &service,
3434 &session,
3535 path.space_name.clone(),
Modified lib/git/src/handler/diffs/get_diff.rs lib/git/src/handler/diffs/get_diff.rs +2 −2 View lib/git/src/handler/diffs/get_diff.rs
@@ -4,7 +4,7 @@
44use serde::Deserialize;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::resolve_reader;
7use crate::handler;
88use crate::service::GitService;
99use crate::service::diffs::DiffOptionsDto;
1010use crate::share::errors::GitError;
@@ -55,7 +55,7 @@
5555 Path(path): Path<crate::handler::RepoPath>,
5656 Query(q): Query<GetDiffQuery>,
5757) -> Result<AppResponseData<serde_json::Value>, ApiError> {
58 let _ = resolve_reader(
58 let _ = handler::resolve_reader(
5959 &service,
6060 &session,
6161 path.space_name.clone(),
Modified lib/git/src/handler/diffs/range_diff.rs lib/git/src/handler/diffs/range_diff.rs +2 −2 View lib/git/src/handler/diffs/range_diff.rs
@@ -4,7 +4,7 @@
44use jwt::Session;
55
66use crate::errors::{ApiError, GitApiError};
7use crate::handler::resolve_reader;
7use crate::handler;
88use crate::service::GitService;
99
1010#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -35,7 +35,7 @@
3535 Some(base) => RangeDiffSpec::BaseWithRevisions(base, q.from, q.to),
3636 None => RangeDiffSpec::RevisionRange(q.from, q.to),
3737 };
38 let _ = resolve_reader(
38 let _ = handler::resolve_reader(
3939 &service,
4040 &session,
4141 path.space_name.clone(),
Modified lib/git/src/handler/diffs/raw.rs lib/git/src/handler/diffs/raw.rs +2 −2 View lib/git/src/handler/diffs/raw.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88
99#[derive(Debug, Clone, serde::Deserialize, utoipa::IntoParams)]
@@ -31,7 +31,7 @@
3131 Path(path): Path<crate::handler::RepoPath>,
3232 Query(q): Query<DiffBaseHeadQuery>,
3333) -> Result<AppResponseData<String>, ApiError> {
34 let _ = resolve_reader(
34 let _ = handler::resolve_reader(
3535 &service,
3636 &session,
3737 path.space_name.clone(),
Modified lib/git/src/handler/blame.rs lib/git/src/handler/blame.rs +2 −2 View lib/git/src/handler/blame.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::blame::BlameRangeDto;
99
@@ -36,7 +36,7 @@
3636 Path(path): Path<crate::handler::RepoPath>,
3737 Query(q): Query<BlameQuery>,
3838) -> Result<AppResponseData<Vec<BlameRangeDto>>, ApiError> {
39 let _ = resolve_reader(
39 let _ = handler::resolve_reader(
4040 &service,
4141 &session,
4242 path.space_name.clone(),
Modified lib/git/src/handler/path_log.rs lib/git/src/handler/path_log.rs +2 −2 View lib/git/src/handler/path_log.rs
@@ -3,7 +3,7 @@
33use jwt::Session;
44
55use crate::errors::{ApiError, GitApiError};
6use crate::handler::resolve_reader;
6use crate::handler;
77use crate::service::GitService;
88use crate::service::path_log::PathLogEntryDto;
99
@@ -32,7 +32,7 @@
3232 Path(path): Path<crate::handler::RepoPath>,
3333 Query(q): Query<PathLogQuery>,
3434) -> Result<AppResponseData<Vec<PathLogEntryDto>>, ApiError> {
35 let _ = resolve_reader(
35 let _ = handler::resolve_reader(
3636 &service,
3737 &session,
3838 path.space_name.clone(),
Modified lib/git/src/handler/share.rs lib/git/src/handler/share.rs +5 −5 View lib/git/src/handler/share.rs
@@ -6,7 +6,7 @@
66
77use crate::errors::ApiError;
88use crate::service::GitService;
9use crate::share::access::authorize_repo_access;
9use crate::share::access;
1010
1111#[derive(Debug, Clone, Deserialize, IntoParams)]
1212pub struct RepoPath {
@@ -51,7 +51,7 @@
5151 .map_err(super::super::errors::GitApiError::from)?;
5252 if ctx.model.is_private {
5353 let uid = session.uid().ok_or(ApiError::unauthorized())?;
54 authorize_repo_access(service, uid, &ctx, false, false)
54 access::authorize_repo_access(service, uid, &ctx, false, false)
5555 .await
5656 .map_err(super::super::errors::GitApiError::from)?;
5757 Ok((ctx, Some(uid)))
@@ -67,7 +67,7 @@
6767) -> Result<Option<i64>, ApiError> {
6868 if ctx.model.is_private {
6969 let uid = session.uid().ok_or(ApiError::unauthorized())?;
70 authorize_repo_access(service, uid, ctx, false, false)
70 access::authorize_repo_access(service, uid, ctx, false, false)
7171 .await
7272 .map_err(super::super::errors::GitApiError::from)?;
7373 Ok(Some(uid))
@@ -87,7 +87,7 @@
8787 .await
8888 .map_err(super::super::errors::GitApiError::from)?;
8989 let uid = session.uid().ok_or(ApiError::unauthorized())?;
90 authorize_repo_access(service, uid, &ctx, true, false)
90 access::authorize_repo_access(service, uid, &ctx, true, false)
9191 .await
9292 .map_err(super::super::errors::GitApiError::from)?;
9393 Ok((ctx, uid))
@@ -104,7 +104,7 @@
104104 .await
105105 .map_err(super::super::errors::GitApiError::from)?;
106106 let uid = session.uid().ok_or(ApiError::unauthorized())?;
107 authorize_repo_access(service, uid, &ctx, true, true)
107 access::authorize_repo_access(service, uid, &ctx, true, true)
108108 .await
109109 .map_err(super::super::errors::GitApiError::from)?;
110110 Ok((ctx, uid))
Modified lib/git/src/handler/whitelists.rs lib/git/src/handler/whitelists.rs +7 −7 View lib/git/src/handler/whitelists.rs
@@ -8,7 +8,7 @@
88use jwt::Session;
99
1010use crate::errors::{ApiError, GitApiError};
11use crate::handler::require_repo_admin;
11use crate::handler;
1212use crate::service::GitService;
1313use crate::service::whitelists::{
1414 AddBranchWhitelistCmd, AddTagWhitelistCmd, BranchWhitelistDto, TagWhitelistDto,
@@ -61,7 +61,7 @@
6161 Path(p): Path<BranchPolicyPath>,
6262 Json(cmd): Json<AddBranchWhitelistCmd>,
6363) -> Result<AppResponseData<BranchWhitelistDto>, ApiError> {
64 let (ctx, _) = require_repo_admin(
64 let (ctx, _) = handler::require_repo_admin(
6565 &service,
6666 &session,
6767 p.space_name.clone(),
@@ -90,7 +90,7 @@
9090 session: Session,
9191 Path(p): Path<BranchWhitelistPath>,
9292) -> Result<AppResponseData<NoData>, ApiError> {
93 let (ctx, _) = require_repo_admin(
93 let (ctx, _) = handler::require_repo_admin(
9494 &service,
9595 &session,
9696 p.space_name.clone(),
@@ -119,7 +119,7 @@
119119 session: Session,
120120 Path(p): Path<BranchPolicyPath>,
121121) -> Result<AppResponseData<Vec<BranchWhitelistDto>>, ApiError> {
122 let (ctx, _) = require_repo_admin(
122 let (ctx, _) = handler::require_repo_admin(
123123 &service,
124124 &session,
125125 p.space_name.clone(),
@@ -150,7 +150,7 @@
150150 Path(p): Path<TagPolicyPath>,
151151 Json(cmd): Json<AddTagWhitelistCmd>,
152152) -> Result<AppResponseData<TagWhitelistDto>, ApiError> {
153 let (ctx, _) = require_repo_admin(
153 let (ctx, _) = handler::require_repo_admin(
154154 &service,
155155 &session,
156156 p.space_name.clone(),
@@ -179,7 +179,7 @@
179179 session: Session,
180180 Path(p): Path<TagWhitelistPath>,
181181) -> Result<AppResponseData<NoData>, ApiError> {
182 let (ctx, _) = require_repo_admin(
182 let (ctx, _) = handler::require_repo_admin(
183183 &service,
184184 &session,
185185 p.space_name.clone(),
@@ -208,7 +208,7 @@
208208 session: Session,
209209 Path(p): Path<TagPolicyPath>,
210210) -> Result<AppResponseData<Vec<TagWhitelistDto>>, ApiError> {
211 let (ctx, _) = require_repo_admin(
211 let (ctx, _) = handler::require_repo_admin(
212212 &service,
213213 &session,
214214 p.space_name.clone(),
Modified lib/git/src/lfs/lock.rs lib/git/src/lfs/lock.rs +0 −1 View lib/git/src/lfs/lock.rs
@@ -1,5 +1,4 @@
11use models::git::git_lfs_lock;
2use models::users::user;
32use sea_orm::{
43 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, Set,
54};
Modified lib/git/src/rpcgit/mod.rs lib/git/src/rpcgit/mod.rs +3 −35 View lib/git/src/rpcgit/mod.rs
@@ -18,39 +18,7 @@
1818
1919mod api;
2020
21use std::sync::Arc;
22
23use crate::context::facade::GitContext;
24
25#[derive(Clone)]
26pub struct GitBaby {
27 ctx: Arc<GitContext>,
28}
29
30impl GitBaby {
31 pub fn new(ctx: Arc<GitContext>) -> Self {
32 Self { ctx }
33 }
21mod baby;
22pub mod gix;
3423
35 pub fn context(&self) -> &GitContext {
36 &self.ctx
37 }
38}
39
40pub mod gix {
41 pub mod hash {
42 pub use crate::rpcgit::oid::ObjectId;
43 }
44
45 pub use hash::ObjectId;
46
47 pub mod objs {
48 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
49 pub enum Kind {
50 Blob,
51 Tree,
52 Commit,
53 Tag,
54 }
55 }
56}
24pub use baby::GitBaby;
Modified lib/git/src/service/archives.rs lib/git/src/service/archives.rs +3 −3 View lib/git/src/service/archives.rs
@@ -6,7 +6,7 @@
66use crate::service::GitService;
77use crate::service::rpc::{rpc_error, wait_job};
88use crate::share::errors::GitError;
9use crate::share::validate::validate_revision;
9use crate::share::validate;
1010
1111#[derive(Debug, Clone, Serialize, utoipa::ToSchema)]
1212pub struct ArchiveResultDto {
@@ -49,7 +49,7 @@
4949 revision: String,
5050 opts: ArchiveOptionsDto,
5151 ) -> Result<ArchiveResultDto, GitError> {
52 validate_revision(&revision)?;
52 validate::validate_revision(&revision)?;
5353 let ctx = self.context(space_name, repo_name).await?;
5454 let mut client = ctx.ks.archive();
5555 let job = client
@@ -90,7 +90,7 @@
9090 revision: String,
9191 opts: ArchiveOptionsDto,
9292 ) -> Result<ArchiveResultDto, GitError> {
93 validate_revision(&revision)?;
93 validate::validate_revision(&revision)?;
9494 let ctx = self.context(space_name, repo_name).await?;
9595 let mut client = ctx.ks.archive();
9696 let artifact = client
Modified lib/git/src/service/branches.rs lib/git/src/service/branches.rs +7 −7 View lib/git/src/service/branches.rs
@@ -11,7 +11,7 @@
1111use crate::service::GitService;
1212use crate::share::errors::{GitError, map_baby};
1313use crate::share::policy::load_branch_policy;
14use crate::share::validate::validate_branch_name;
14use crate::share::validate;
1515
1616#[derive(Debug, Clone, Serialize, utoipa::ToSchema)]
1717pub struct BranchDto {
@@ -123,7 +123,7 @@
123123 repo_name: String,
124124 name: String,
125125 ) -> Result<BranchDto, GitError> {
126 validate_branch_name(&name)?;
126 validate::validate_branch_name(&name)?;
127127 let ctx = self.context(space_name, repo_name).await?;
128128 let baby = self.baby(&ctx);
129129 let info = baby.find_branch(&name).await.map_err(map_baby)?;
@@ -148,7 +148,7 @@
148148 repo_name: String,
149149 cmd: CreateBranchCmd,
150150 ) -> Result<BranchDto, GitError> {
151 let name = validate_branch_name(&cmd.name)?;
151 let name = validate::validate_branch_name(&cmd.name)?;
152152 if let Some(sp) = &cmd.start_point
153153 && (sp.trim().is_empty() || sp.starts_with('-'))
154154 {
@@ -203,8 +203,8 @@
203203 from: String,
204204 to: String,
205205 ) -> Result<(), GitError> {
206 validate_branch_name(&from)?;
207 let to = validate_branch_name(&to)?;
206 validate::validate_branch_name(&from)?;
207 let to = validate::validate_branch_name(&to)?;
208208 let ctx = self.context(space_name, repo_name).await?;
209209 let baby = self.baby(&ctx);
210210 baby.rename_branch(&from, &to).await.map_err(map_baby)?;
@@ -233,7 +233,7 @@
233233 name: String,
234234 force: bool,
235235 ) -> Result<(), GitError> {
236 let name = validate_branch_name(&name)?;
236 let name = validate::validate_branch_name(&name)?;
237237 let ctx = self.context(space_name, repo_name).await?;
238238 let policy = load_branch_policy(&self.state.database, ctx.model.id).await?;
239239 if policy.is_match(&name) {
@@ -281,7 +281,7 @@
281281 repo_name: String,
282282 name: String,
283283 ) -> Result<(), GitError> {
284 let name = validate_branch_name(&name)?;
284 let name = validate::validate_branch_name(&name)?;
285285 let ctx = self.context(space_name, repo_name).await?;
286286 let baby = self.baby(&ctx);
287287 baby.set_default_branch(&name).await.map_err(map_baby)?;
Modified lib/git/src/service/cache.rs lib/git/src/service/cache.rs +2 −1 View lib/git/src/service/cache.rs
@@ -1,7 +1,8 @@
11use std::time::Duration;
22
33use cache::CacheClient;
4use serde::{Serialize, de::DeserializeOwned};
4use serde::Serialize;
5use serde::de::DeserializeOwned;
56
67use crate::share::errors::GitError;
78
Modified lib/git/src/service/code_comments.rs lib/git/src/service/code_comments.rs +3 −2 View lib/git/src/service/code_comments.rs
@@ -1,9 +1,10 @@
11use crate::context::facade::GitContext;
22use export::pagination::Page;
33use models::repo::code_comment;
4use sea_orm::ActiveValue::Set;
45use sea_orm::{
5 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter,
6 QueryOrder, QuerySelect,
6 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
7 QuerySelect,
78};
89use serde::{Deserialize, Serialize};
910use space::services::spaces::UserDto;
Modified lib/git/src/service/commits.rs lib/git/src/service/commits.rs +2 −4 View lib/git/src/service/commits.rs
@@ -1,12 +1,10 @@
11use std::path::PathBuf;
22
33use crate::rpcgit::commit::types::{CommitInfo, CommitStats, ListCommitsOptions, TreeEntry};
4use models::git::git_commit_status;
54use models::git::git_commit_status::CommitStatusState;
6use models::git::git_commits;
5use models::git::{git_commit_status, git_commits};
76use sea_orm::{
8 ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter, QueryOrder, Set,
9 Unchanged,
7 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, Set, Unchanged,
108};
119use serde::{Deserialize, Serialize};
1210use time::OffsetDateTime;
Modified lib/git/src/service/content.rs lib/git/src/service/content.rs +2 −2 View lib/git/src/service/content.rs
@@ -3,7 +3,7 @@
33
44use crate::service::GitService;
55use crate::share::errors::GitError;
6use crate::share::identity::load_identity;
6use crate::share::identity;
77
88#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
99pub struct SignatureDto {
@@ -37,7 +37,7 @@
3737 caller: i64,
3838 when: OffsetDateTime,
3939 ) -> Result<SignatureDto, GitError> {
40 let ident = load_identity(&self.state, caller).await?;
40 let ident = identity::load_identity(&self.state, caller).await?;
4141 Ok(SignatureDto {
4242 name: ident.name,
4343 email: ident.email,
Modified lib/git/src/service/context.rs lib/git/src/service/context.rs +2 −3 View lib/git/src/service/context.rs
@@ -3,12 +3,11 @@
33
44use cache::CacheClient;
55use models::repo::repos;
6use models::space::spaces;
76use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
87
98use crate::context::facade::GitContext;
109use crate::service::GitService;
11use crate::share::access::space_for_dir;
10use crate::share::access;
1211use crate::share::errors::GitError;
1312
1413impl GitService {
@@ -37,7 +36,7 @@
3736 let repo = {
3837 let mut found = None;
3938 for candidate in candidates {
40 if space_for_dir(&self.state, candidate.dir_id)
39 if access::space_for_dir(&self.state, candidate.dir_id)
4140 .await?
4241 .is_some_and(|s| s.id == space.id)
4342 {
Modified lib/git/src/service/mod.rs lib/git/src/service/mod.rs +2 −52 View lib/git/src/service/mod.rs
@@ -1,56 +1,6 @@
1use std::sync::Arc;
2use std::time::Duration;
3
4use export::AppState;
5use kenshell::KenShellClient;
6use sea_orm::DatabaseConnection;
7
8use crate::context::facade::GitContext;
9use crate::rpcgit::GitBaby;
10
11#[derive(Clone)]
12pub struct GitService {
13 pub state: AppState,
14 ks: Arc<KenShellClient>,
15}
1mod git_service;
162
17impl GitService {
18 pub fn new(state: AppState) -> Self {
19 let cfg = &state.config.git;
20 let timeout = Duration::from_secs(cfg.kenshell_timeout_secs.max(1));
21 let ks = KenShellClient::connect_with_key(
22 &cfg.kenshell_endpoint,
23 &cfg.kenshell_rpc_key,
24 timeout,
25 )
26 .unwrap_or_else(|error| {
27 panic!(
28 "invalid git.kenshell_endpoint `{}`: {error}",
29 cfg.kenshell_endpoint
30 )
31 });
32 Self {
33 state,
34 ks: Arc::new(ks),
35 }
36 }
37
38 pub fn ks(&self) -> &KenShellClient {
39 &self.ks
40 }
41
42 pub fn baby(&self, ctx: &GitContext) -> GitBaby {
43 GitBaby::new(Arc::new(ctx.clone()))
44 }
45
46 pub fn db_write(&self) -> &DatabaseConnection {
47 self.state.database.write()
48 }
49
50 pub fn db_read(&self) -> &DatabaseConnection {
51 self.state.database.read()
52 }
53}
3pub use git_service::GitService;
544
555pub mod analysis;
566pub mod archives;
Modified lib/git/src/service/pdf.rs lib/git/src/service/pdf.rs +1 −2 View lib/git/src/service/pdf.rs
@@ -11,8 +11,7 @@
1111use crate::rpcgit::error::BabyError;
1212
1313use crate::lfs;
14use crate::service::GitService;
15use crate::service::blobs;
14use crate::service::{GitService, blobs};
1615use crate::share::errors::{GitError, map_baby};
1716
1817/// Page rasterisation for the in-repo PDF viewer.
Modified lib/git/src/service/protection.rs lib/git/src/service/protection.rs +4 −5 View lib/git/src/service/protection.rs
@@ -1,10 +1,9 @@
11use globset::Glob;
2use models::repo::repo_branch_protection_policy;
3use models::repo::repo_tag_protection_policy;
4use models::repo::repo_tag_protection_whitelists;
5use sea_orm::{
6 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, QueryFilter, QueryOrder,
2use models::repo::{
3 repo_branch_protection_policy, repo_tag_protection_policy, repo_tag_protection_whitelists,
74};
5use sea_orm::ActiveValue::Set;
6use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder};
87use serde::{Deserialize, Serialize};
98use time::OffsetDateTime;
109use uuid::Uuid;
Modified lib/git/src/service/refs.rs lib/git/src/service/refs.rs +3 −3 View lib/git/src/service/refs.rs
@@ -4,7 +4,7 @@
44use crate::service::GitService;
55use crate::share::errors::{GitError, map_baby};
66use crate::share::policy::load_branch_policy;
7use crate::share::validate::validate_qualified_ref;
7use crate::share::validate;
88
99#[derive(Debug, Clone, Serialize, utoipa::ToSchema)]
1010pub struct HeadInfoDto {
@@ -153,7 +153,7 @@
153153 new_oid: String,
154154 expected_oid: Option<String>,
155155 ) -> Result<UpdateRefResultDto, GitError> {
156 validate_qualified_ref(&name)?;
156 validate::validate_qualified_ref(&name)?;
157157 let ctx = self.context(space_name, repo_name).await?;
158158 if self.ref_protected(&ctx, &name).await? {
159159 return Err(GitError::Forbidden);
@@ -181,7 +181,7 @@
181181 repo_name: String,
182182 name: String,
183183 ) -> Result<(), GitError> {
184 validate_qualified_ref(&name)?;
184 validate::validate_qualified_ref(&name)?;
185185 let ctx = self.context(space_name, repo_name).await?;
186186 if self.ref_protected(&ctx, &name).await? {
187187 return Err(GitError::Forbidden);
Modified lib/git/src/service/releases.rs lib/git/src/service/releases.rs +3 −2 View lib/git/src/service/releases.rs
@@ -1,8 +1,9 @@
11use export::pagination::Page;
22use models::repo::repo_release;
3use sea_orm::ActiveValue::Set;
34use sea_orm::{
4 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter,
5 QueryOrder, QuerySelect,
5 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
6 QuerySelect,
67};
78use serde::{Deserialize, Serialize};
89use space::services::spaces::UserDto;
Modified lib/git/src/service/repos.rs lib/git/src/service/repos.rs +2 −5 View lib/git/src/service/repos.rs
@@ -1,8 +1,6 @@
11use crate::rpcgit::refs::types::{ListRefsOptions, RefType};
22use models::dir::dirs::{self, DirKind};
3use models::repo::repo_collaborations;
4use models::repo::repo_license;
5use models::repo::repos;
3use models::repo::{repo_collaborations, repo_license, repos};
64use models::space::spaces;
75use sea_orm::{
86 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, Set,
@@ -471,8 +469,7 @@
471469 }
472470
473471 pub async fn repo_viewer_state(&self, repo_id: Uuid, uid: i64) -> Result<RepoMeDto, GitError> {
474 use models::repo::repo_star;
475 use models::repo::repo_watch;
472 use models::repo::{repo_star, repo_watch};
476473 let starred = repo_star::Entity::find()
477474 .filter(repo_star::Column::RepoId.eq(repo_id))
478475 .filter(repo_star::Column::UserId.eq(uid))
Modified lib/git/src/service/rpc.rs lib/git/src/service/rpc.rs +2 −2 View lib/git/src/service/rpc.rs
@@ -1,7 +1,7 @@
11use std::time::Duration;
22
33use kenshell::proto::v1 as pb;
4use tokio::time::sleep;
4use tokio::time;
55
66use crate::share::errors::GitError;
77
@@ -52,7 +52,7 @@
5252 if tokio::time::Instant::now() >= deadline {
5353 return Err(GitError::Internal("job timed out".into()));
5454 }
55 sleep(Duration::from_millis(400)).await;
55 time::sleep(Duration::from_millis(400)).await;
5656 }
5757}
5858impl crate::service::GitService {
Modified lib/git/src/service/stars.rs lib/git/src/service/stars.rs +1 −2 View lib/git/src/service/stars.rs
@@ -1,5 +1,4 @@
1use models::repo::repo_star;
2use models::repo::repos;
1use models::repo::{repo_star, repos};
32use sea_orm::{
43 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, Set,
54 TransactionTrait, Unchanged,
Modified lib/git/src/service/tags.rs lib/git/src/service/tags.rs +3 −3 View lib/git/src/service/tags.rs
@@ -13,7 +13,7 @@
1313use crate::service::GitService;
1414use crate::service::cache::{self, IMMUTABLE_TTL};
1515use crate::share::errors::{GitError, map_baby};
16use crate::share::policy::load_tag_policy;
16use crate::share::policy;
1717
1818#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
1919pub struct TagDto {
@@ -78,7 +78,7 @@
7878 ));
7979 }
8080 let ctx = self.context(space_name, repo_name).await?;
81 let tag_policy = load_tag_policy(&self.state.database, ctx.model.id).await?;
81 let tag_policy = policy::load_tag_policy(&self.state.database, ctx.model.id).await?;
8282 if tag_policy.is_match(&cmd.name) {
8383 return Err(GitError::Forbidden);
8484 }
@@ -225,7 +225,7 @@
225225 name: String,
226226 ) -> Result<(), GitError> {
227227 let ctx = self.context(space_name, repo_name).await?;
228 let tag_policy = load_tag_policy(&self.state.database, ctx.model.id).await?;
228 let tag_policy = policy::load_tag_policy(&self.state.database, ctx.model.id).await?;
229229 if tag_policy.is_match(&name) {
230230 return Err(GitError::Forbidden);
231231 }
Modified lib/git/src/service/topics.rs lib/git/src/service/topics.rs +1 −3 View lib/git/src/service/topics.rs
@@ -1,6 +1,4 @@
1use models::repo::repo_relation_topic;
2use models::repo::repo_topic;
3use models::repo::repos;
1use models::repo::{repo_relation_topic, repo_topic, repos};
42use sea_orm::{
53 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, Set,
64};
Modified lib/git/src/service/trees.rs lib/git/src/service/trees.rs +8 −8 View lib/git/src/service/trees.rs
@@ -7,7 +7,7 @@
77use crate::service::GitService;
88use crate::service::cache::{self, IMMUTABLE_TTL};
99use crate::share::errors::{GitError, map_baby};
10use crate::share::validate::validate_revision;
10use crate::share::validate;
1111
1212#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
1313pub struct PathLastUpdated {
@@ -33,7 +33,7 @@
3333 revision: String,
3434 path: PathBuf,
3535 ) -> Result<Vec<TreeEntry>, GitError> {
36 validate_revision(&revision)?;
36 validate::validate_revision(&revision)?;
3737 let ctx = self.context(space_name, repo_name).await?;
3838 let baby = self.baby(&ctx);
3939 let rev_oid = baby.rev_parse(&revision).await.map_err(map_baby)?;
@@ -58,7 +58,7 @@
5858 revision: String,
5959 path: String,
6060 ) -> Result<TreeEntry, GitError> {
61 validate_revision(&revision)?;
61 validate::validate_revision(&revision)?;
6262 let ctx = self.context(space_name, repo_name).await?;
6363 let baby = self.baby(&ctx);
6464 let name = path.trim().trim_start_matches("./").to_string();
@@ -81,7 +81,7 @@
8181 recurse: bool,
8282 show_trees: bool,
8383 ) -> Result<Vec<TreeEntry>, GitError> {
84 validate_revision(&revision)?;
84 validate::validate_revision(&revision)?;
8585 let ctx = self.context(space_name, repo_name).await?;
8686 let baby = self.baby(&ctx);
8787 let rev_oid = baby.rev_parse(&revision).await.map_err(map_baby)?;
@@ -111,7 +111,7 @@
111111 revision: String,
112112 path: String,
113113 ) -> Result<(TreeEntry, Option<String>, Option<TreeEntry>), GitError> {
114 validate_revision(&revision)?;
114 validate::validate_revision(&revision)?;
115115 let entry = self
116116 .tree_resolve_path(
117117 space_name.clone(),
@@ -157,7 +157,7 @@
157157 revision: String,
158158 path: Option<String>,
159159 ) -> Result<Vec<PathLastUpdated>, GitError> {
160 validate_revision(&revision)?;
160 validate::validate_revision(&revision)?;
161161 let ctx = self.context(space_name, repo_name).await?;
162162 let baby = self.baby(&ctx);
163163 let rev_oid = baby.rev_parse(&revision).await.map_err(map_baby)?;
@@ -189,7 +189,7 @@
189189 ctx: &std::sync::Arc<crate::context::facade::GitContext>,
190190 revision: &str,
191191 ) -> Result<Vec<crate::rpcgit::tree::types::TreeEntryWithLatest>, GitError> {
192 validate_revision(revision)?;
192 validate::validate_revision(revision)?;
193193 if ctx.repo_uninitialized() {
194194 return Ok(Vec::new());
195195 }
@@ -210,7 +210,7 @@
210210 revision: &str,
211211 path: &str,
212212 ) -> Result<Vec<crate::rpcgit::tree::types::TreeEntryWithLatest>, GitError> {
213 validate_revision(revision)?;
213 validate::validate_revision(revision)?;
214214 if path.contains("..")
215215 || path.contains('\\')
216216 || path.starts_with('/')
Modified lib/git/src/service/watches.rs lib/git/src/service/watches.rs +1 −2 View lib/git/src/service/watches.rs
@@ -1,6 +1,5 @@
11use models::common::watch_mode::WatchMode;
2use models::repo::repo_watch;
3use models::repo::repos;
2use models::repo::{repo_watch, repos};
43use sea_orm::{
54 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, Set,
65 TransactionTrait, Unchanged,
Modified lib/git/src/service/whitelists.rs lib/git/src/service/whitelists.rs +3 −4 View lib/git/src/service/whitelists.rs
@@ -1,7 +1,7 @@
1use models::repo::repo_branch_protection_policy;
21use models::repo::repo_branch_protection_whitelists::{self, WhitelistKind};
3use models::repo::repo_tag_protection_policy;
4use models::repo::repo_tag_protection_whitelists;
2use models::repo::{
3 repo_branch_protection_policy, repo_tag_protection_policy, repo_tag_protection_whitelists,
4};
55use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set, TransactionTrait};
66use serde::{Deserialize, Serialize};
77use time::OffsetDateTime;
@@ -84,7 +84,6 @@
8484 &self,
8585 uids: &[i64],
8686 ) -> Result<std::collections::HashMap<i64, space::services::spaces::UserDto>, GitError> {
87 use models::users::user;
8887 let mut map = std::collections::HashMap::new();
8988 if uids.is_empty() {
9089 return Ok(map);
Modified lib/git/src/share/policy.rs lib/git/src/share/policy.rs +4 −4 View lib/git/src/share/policy.rs
@@ -1,8 +1,8 @@
11use globset::{Glob, GlobMatcher};
2use models::repo::repo_branch_protection_policy;
3use models::repo::repo_branch_protection_whitelists;
4use models::repo::repo_tag_protection_policy;
5use models::repo::repo_tag_protection_whitelists;
2use models::repo::{
3 repo_branch_protection_policy, repo_branch_protection_whitelists, repo_tag_protection_policy,
4 repo_tag_protection_whitelists,
5};
66use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
77use uuid::Uuid;
88
Modified lib/identity/src/auth/authority.rs lib/identity/src/auth/authority.rs +2 −3 View lib/identity/src/auth/authority.rs
@@ -7,8 +7,7 @@
77use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, QueryFilter, Set};
88use uuid::Uuid;
99
10use crate::auth::share::crypto::sha256_hex;
11use crate::auth::share::user as store;
10use crate::auth::share::{crypto, user as store};
1211use crate::auth::{AuthError, AuthResult, AuthSvc};
1312
1413const MAX_BATCH_PROFILES: usize = store::MAX_BATCH_USER_IDS;
@@ -18,7 +17,7 @@
1817
1918/// 会话 ID 的摘要。会话 ID 本身即凭据,库里只存摘要。
2019pub fn session_token_hash(id: Uuid) -> String {
21 sha256_hex(id.to_string().as_bytes())
20 crypto::sha256_hex(id.to_string().as_bytes())
2221}
2322
2423pub(crate) fn record(user: users::Model) -> UserRecord {
Modified lib/identity/src/auth/migrate.rs lib/identity/src/auth/migrate.rs +2 −2 View lib/identity/src/auth/migrate.rs
@@ -1,7 +1,7 @@
11use crate::auth::errors::AuthResult;
22
3const USER_PREFIX: &str = concat!(env!("CARGO_CRATE_NAME"), "::models::user::");
4const ORGANIZATION_PREFIX: &str = concat!(env!("CARGO_CRATE_NAME"), "::models::organization::");
3const USER_PREFIX: &str = "accounts::user::";
4const ORGANIZATION_PREFIX: &str = "accounts::organization::";
55
66pub async fn sync_schema(db: &crate::db::DbConn) -> AuthResult<()> {
77 crate::db::migrate::EntityFirst::new(&[USER_PREFIX, ORGANIZATION_PREFIX])
Modified lib/identity/src/auth/mod.rs lib/identity/src/auth/mod.rs +2 −243 View lib/identity/src/auth/mod.rs
@@ -25,249 +25,8 @@
2525pub mod ssh_key;
2626pub mod token;
2727
28use std::sync::Arc;
29
30use crate::config::app::AppRegistry;
31use crate::config::auth::AuthConfig;
32use crate::config::jwt::JwtConfig;
33use crate::config::pow::PowConfig;
34use crate::db::DbConn;
35use crate::email::EmailService;
36use crate::events::{EventHandler, Labels, RuntimeEvent};
37use crate::kvcache::Cache;
38use serde::Serialize;
39
4028pub use errors::{AuthError, AuthResult};
4129
42const EVENT_PUBLISH_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(5);
43
44#[derive(Clone)]
45pub struct AuthSvc {
46 db: DbConn,
47 cache: Cache,
48 email: Option<EmailService>,
49 events: Option<EventHandler>,
50 auth: Arc<AuthConfig>,
51 pow: Arc<PowConfig>,
52 apps: Arc<AppRegistry>,
53 signing: Arc<crate::auth::keys::SigningState>,
54 jwt: crate::jwt::JwtState,
55 clients: Arc<crate::auth::client::ClientRegistry>,
56 session_max_age_secs: u64,
57}
58
59impl AuthSvc {
60 #[allow(clippy::too_many_arguments)]
61 pub async fn new(
62 db: DbConn,
63 cache: Cache,
64 email: Option<EmailService>,
65 events: Option<EventHandler>,
66 auth: AuthConfig,
67 pow: PowConfig,
68 apps: AppRegistry,
69 jwt_config: JwtConfig,
70 session_max_age_secs: u64,
71 ) -> AuthResult<Self> {
72 crate::auth::protocol::validate_config(&auth.oauth, &jwt_config.issuer)?;
73 let signing = crate::auth::keys::SigningState::from_config(&jwt_config)?;
74 let jwt_state = crate::jwt::JwtState::load(&jwt_config)
75 .await
76 .map_err(|error| AuthError::Unavailable(error.to_string()))?;
77 // 客户端注册表:配置种子落库后加载,之后由管理接口维护。
78 let clients = crate::auth::client::ClientRegistry::load(&db, &auth.oauth).await?;
79 let svc = Self {
80 db,
81 cache,
82 email,
83 events,
84 auth: Arc::new(auth),
85 pow: Arc::new(pow),
86 apps: Arc::new(apps),
87 signing: Arc::new(signing),
88 jwt: jwt_state,
89 clients: Arc::new(clients),
90 session_max_age_secs: session_max_age_secs.max(1),
91 };
92 crate::jwt::authority::install(Arc::new(svc.clone()))
93 .map_err(|error| AuthError::Unavailable(error.to_string()))?;
94 Ok(svc)
95 }
96
97 pub fn db(&self) -> &DbConn {
98 &self.db
99 }
100
101 pub fn cache(&self) -> &Cache {
102 &self.cache
103 }
104
105 pub fn email(&self) -> Option<&EmailService> {
106 self.email.as_ref()
107 }
108
109 pub fn auth(&self) -> &AuthConfig {
110 &self.auth
111 }
112
113 pub fn pow(&self) -> &PowConfig {
114 &self.pow
115 }
116
117 pub fn apps(&self) -> &AppRegistry {
118 &self.apps
119 }
120
121 pub fn signing(&self) -> &crate::auth::keys::SigningState {
122 &self.signing
123 }
124
125 pub fn jwt(&self) -> &crate::jwt::JwtState {
126 &self.jwt
127 }
128
129 pub fn events(&self) -> Option<&EventHandler> {
130 self.events.as_ref()
131 }
132
133 pub fn clients(&self) -> &crate::auth::client::ClientRegistry {
134 &self.clients
135 }
136
137 /// 逻辑会话有效期(秒):启动时从配置读取一次,热路径避免重读配置文件。
138 pub fn session_max_age_secs(&self) -> u64 {
139 self.session_max_age_secs
140 }
141
142 pub async fn emit<T>(&self, event: RuntimeEvent, payload: T, request_id: Option<&str>)
143 where
144 T: Serialize + Clone,
145 {
146 self.emit_labeled(event, Labels::default(), payload, request_id)
147 .await;
148 }
149
150 /// 事件先写进 `event_outbox`,由 relay 投递到 RocketMQ;进程在投递前退出也不会丢。
151 ///
152 /// 写库失败时退回直接投递:outbox 表缺失或数据库抖动不应该让事件链静默断掉,
153 /// 只是这时又回到「重试 3 次后丢弃」的旧语义。
154 pub async fn emit_labeled<T>(
155 &self,
156 event: RuntimeEvent,
157 labels: Labels,
158 payload: T,
159 request_id: Option<&str>,
160 ) where
161 T: Serialize + Clone,
162 {
163 let Some(events) = self.events.as_ref() else {
164 tracing::error!(
165 event = %event,
166 subject = %event.subject(),
167 "event handler is not configured; event was not forwarded to rocketmq"
168 );
169 return;
170 };
171
172 let trace_id = request_id
173 .map(str::to_owned)
174 .or_else(crate::envelope::context::request_id)
175 .unwrap_or_default();
176 let enqueued = crate::events::outbox::enqueue_at(
177 self.db.write(),
178 event,
179 labels.clone(),
180 payload.clone(),
181 &trace_id,
182 chrono::Utc::now(),
183 request_id,
184 )
185 .await;
186
187 if let Err(error) = enqueued {
188 tracing::error!(
189 event = %event,
190 subject = %event.subject(),
191 %error,
192 "failed to enqueue the event in the outbox; falling back to direct publish"
193 );
194 crate::events::retry_publish(events, event, labels, payload, "auth", request_id).await;
195 }
196 }
30mod auth_svc;
19731
198 /// 事务内入队:事件行与业务写入同一个事务,提交时一起可见、回滚时一起消失。
199 ///
200 /// 与 `emit_labeled` 的差别在于**错误会向上传播**:写不进 outbox 就让业务事务回滚,
201 /// 而不是退回直接投递。这是 KenShell 的语义——宁可这次写操作失败重试,
202 /// 也不要出现「业务成功、事件永久缺失」。
203 pub async fn emit_tx<T>(
204 &self,
205 conn: &impl sea_orm::ConnectionTrait,
206 event: RuntimeEvent,
207 labels: Labels,
208 payload: T,
209 request_id: Option<&str>,
210 ) -> AuthResult<()>
211 where
212 T: Serialize,
213 {
214 let trace_id = request_id
215 .map(str::to_owned)
216 .or_else(crate::envelope::context::request_id)
217 .unwrap_or_default();
218 crate::events::outbox::enqueue_at(
219 conn,
220 event,
221 labels,
222 payload,
223 &trace_id,
224 chrono::Utc::now(),
225 request_id,
226 )
227 .await?;
228 Ok(())
229 }
230
231 /// 启动时验证事件链路:查询一次 RocketMQ 路由,让 broker 不可达如实暴露。
232 pub async fn verify_event_forwarding(&self) -> bool {
233 let Some(events) = self.events.as_ref() else {
234 return false;
235 };
236 match tokio::time::timeout(EVENT_PUBLISH_TIMEOUT, events.health()).await {
237 Ok(Ok(())) => true,
238 Ok(Err(error)) => {
239 tracing::error!(%error, "rocketmq event forwarding is unavailable");
240 false
241 }
242 Err(_) => {
243 tracing::error!(
244 timeout_ms = EVENT_PUBLISH_TIMEOUT.as_millis() as u64,
245 "rocketmq event forwarding timed out"
246 );
247 false
248 }
249 }
250 }
251
252 pub async fn publish_mail(
253 &self,
254 to: &str,
255 subject: &str,
256 text: &str,
257 html: &str,
258 request_id: Option<&str>,
259 ) -> AuthResult<()> {
260 match self.email.as_ref() {
261 Some(service) => {
262 service
263 .enqueue_mail(to, subject, text, html, request_id)
264 .await?;
265 Ok(())
266 }
267 None => {
268 tracing::warn!(to, subject, "auth email service is not configured");
269 Ok(())
270 }
271 }
272 }
273}
32pub use auth_svc::AuthSvc;
Modified lib/identity/src/auth/protocol.rs lib/identity/src/auth/protocol.rs +2 −1 View lib/identity/src/auth/protocol.rs
@@ -13,7 +13,8 @@
1313use crate::config::web::WebConfig;
1414use actix_web::http::header::{self, HeaderValue};
1515use actix_web::{HttpRequest, HttpResponse, web};
16use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD};
16use base64::Engine;
17use base64::engine::general_purpose::URL_SAFE_NO_PAD;
1718use chrono::Utc;
1819use reqwest::Url;
1920use serde::{Deserialize, Serialize};
Modified lib/identity/src/oauth/mod.rs lib/identity/src/oauth/mod.rs +1 −2 View lib/identity/src/oauth/mod.rs
@@ -19,8 +19,7 @@
1919use crate::session::{RedisStore, SessionMiddleware};
2020use actix_web::{App, HttpServer, web};
2121use anyhow::{Context, Result};
22use std::net::IpAddr;
23use std::net::SocketAddr;
22use std::net::{IpAddr, SocketAddr};
2423
2524const APP: &str = "oauth";
2625/// 邮件订阅者排空时的宽限时间。
Modified lib/identity/src/lib.rs lib/identity/src/lib.rs +20 −16 View lib/identity/src/lib.rs
@@ -1,23 +1,27 @@
11//! KenOAuth 认证中心。
22//!
3//! 单 crate 结构:每个原 workspace crate 变成顶层模块,模块名与包名保持一致
4//! (`crates/service/auth` → [`auth`],`crates/infra/config` → [`config`])。
3//! 业务逻辑保留在 `auth` / `oauth`;账号、会话、令牌之外的基础设施
4//! (config、db、email、envelope、events、jwt、kvcache、models、oltp、
5//! protos、queue、session、shutdown、crypt)已拆成工作区公共 crate,
6//! 这里按原模块名重新导出,保持既有调用路径不变。
57
68#![recursion_limit = "512"]
79
810pub mod auth;
9pub mod config;
10pub mod crypt;
11pub mod db;
12pub mod email;
13pub mod envelope;
14pub mod events;
15pub mod jwt;
16pub mod kvcache;
17pub mod models;
11pub mod client;
1812pub mod oauth;
19pub mod oltp;
20pub mod protos;
21pub mod queue;
22pub mod session;
23pub mod shutdown;
13
14pub use accounts as models;
15pub use config::identity as config;
16pub use crypt;
17pub use db;
18pub use email;
19pub use envelope;
20pub use events;
21pub use kvcache;
22pub use oltp;
23pub use oltp::shutdown;
24pub use proto as protos;
25pub use queue::identity as queue;
26pub use session;
27pub use token as jwt;
Modified lib/identity/build.rs lib/identity/build.rs +9 −267 View lib/identity/build.rs
@@ -1,277 +1,20 @@
11use std::fmt::Write as _;
22use std::fs;
3use std::path::{Path, PathBuf};
4
5/// 前端构建产物目录(`pnpm build` 的输出)
6const WEB_DIST: &str = "view/dist";
7
8/// 需要序列化(serde)与 ToSchema 的 proto 包
9const JSON_PACKAGES: [&str; 5] = [
10 "v1",
11 "common.v1",
12 "admin.v1",
13 "cluster.v1",
14 "cluster.internal.v1",
15];
3use std::path::Path;
164
17/// protobuf 字段的 serde 路径:合并成单 crate 后 serde 助手在 `crate::protos::serde_helpers`。
18const SERDE_HELPERS: &str = "crate::protos::serde_helpers";
19
20/// protoc 的 descriptor 临时输出(相对路径,避免非 ASCII 绝对路径)。
21const DESCRIPTOR_TMP: &str = ".descriptor.bin";
5/// 前端构建产物目录(`pnpm build` 的输出)。
6const WEB_DIST: &str = "../../view/dist";
227
23fn main() -> Result<(), Box<dyn std::error::Error>> {
8fn main() {
249 let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
25 let out_dir = PathBuf::from(std::env::var("OUT_DIR")?);
26
27 build_protos(manifest_dir, &out_dir)?;
10 let out_dir = std::path::PathBuf::from(std::env::var("OUT_DIR").expect("OUT_DIR"));
2811 build_web_assets(manifest_dir, &out_dir);
29
30 Ok(())
3112}
3213
33fn build_protos(manifest_dir: &Path, out_dir: &Path) -> Result<(), Box<dyn std::error::Error>> {
34 let proto_dir = PathBuf::from("proto");
35 let proto_root = manifest_dir.join(&proto_dir);
36
37 let mut files = Vec::new();
38 collect_protos(&proto_root, &mut files)?;
39 files.sort();
40 if files.is_empty() {
41 return Err(format!("no .proto found under {}", proto_root.display()).into());
42 }
43 let relative: Vec<PathBuf> = files
44 .iter()
45 .map(|file| proto_dir.join(file.strip_prefix(&proto_root).expect("scanned under root")))
46 .collect();
47
48 println!("cargo:rerun-if-changed={}", proto_root.display());
49 for file in &files {
50 println!("cargo:rerun-if-changed={}", file.display());
51 }
52
53 let mut builder = tonic_prost_build::configure()
54 .build_client(true)
55 .build_server(true)
56 // 先写相对路径再由 build.rs 搬到 OUT_DIR:protoc 无法写入非 ASCII 的绝对路径(如 C:\工程\...)。
57 .file_descriptor_set_path(DESCRIPTOR_TMP)
58 .enum_attribute(".", "#[allow(clippy::large_enum_variant)]")
59 .include_file("_include.rs");
60
61 for package in JSON_PACKAGES {
62 let prefix = format!(".{package}");
63 builder = builder
64 .type_attribute(&prefix, "#[derive(serde::Serialize, serde::Deserialize)]")
65 .message_attribute(&prefix, "#[serde(default)]")
66 .enum_attribute(&prefix, "#[serde(rename_all = \"SCREAMING_SNAKE_CASE\")]");
67 }
68
69 let bytes_helper = format!(
70 "#[serde(with = \"{SERDE_HELPERS}::bytes\")] #[schema(value_type = String)] #[doc = \"Hex encoded bytes (two hex digits per byte).\"]"
71 );
72 let bytes_list_helper = format!(
73 "#[serde(with = \"{SERDE_HELPERS}::bytes_list\")] #[schema(value_type = Vec<String>)]"
74 );
75 let timestamp_helper = format!(
76 "#[serde(with = \"{SERDE_HELPERS}::timestamp_opt\")] #[schema(value_type = Option<String>, default = json!(null))]"
77 );
78
79 for file in &files {
80 let text = fs::read_to_string(file)?;
81 for decl in scan_proto(&text) {
82 builder = match decl {
83 Decl::Schema(path) => builder.type_attribute(path, "#[derive(utoipa::ToSchema)]"),
84 Decl::Oneof(holder) => builder
85 .field_attribute(holder, "#[schema(value_type = Option<serde_json::Value>)]"),
86 Decl::Field(path, FieldKind::Bytes) => builder.field_attribute(path, &bytes_helper),
87 Decl::Field(path, FieldKind::BytesList) => {
88 builder.field_attribute(path, &bytes_list_helper)
89 }
90 Decl::Field(path, FieldKind::Timestamp) => {
91 builder.field_attribute(path, ×tamp_helper)
92 }
93 };
94 }
95 }
96
97 builder.compile_protos(&relative, std::slice::from_ref(&proto_dir))?;
98
99 std::fs::copy(DESCRIPTOR_TMP, out_dir.join("descriptor.bin"))?;
100 let _ = std::fs::remove_file(DESCRIPTOR_TMP);
101 Ok(())
102}
103
104fn collect_protos(dir: &Path, out: &mut Vec<PathBuf>) -> std::io::Result<()> {
105 for entry in fs::read_dir(dir)? {
106 let path = entry?.path();
107 if path.is_dir() {
108 collect_protos(&path, out)?;
109 } else if path.extension().is_some_and(|ext| ext == "proto") {
110 out.push(path);
111 }
112 }
113 Ok(())
114}
115
116enum Decl {
117 Schema(String),
118 Oneof(String),
119 Field(String, FieldKind),
120}
121
122enum FieldKind {
123 Bytes,
124 BytesList,
125 Timestamp,
126}
127
128enum Block {
129 Message(String),
130 Other,
131}
132
133fn scan_proto(text: &str) -> Vec<Decl> {
134 let text = strip_comments(text);
135 let Some(package) = package_of(&text) else {
136 return Vec::new();
137 };
138 if !JSON_PACKAGES.contains(&package.as_str()) {
139 return Vec::new();
140 }
141
142 let mut decls = Vec::new();
143 let mut stack: Vec<Block> = Vec::new();
144 for raw in text.lines() {
145 let line = raw.trim();
146 if line.is_empty() {
147 continue;
148 }
149 if let Some(head) = line.strip_suffix('{') {
150 let head = head.trim();
151 let mut tokens = head.split_whitespace();
152 let keyword = tokens.next().unwrap_or_default();
153 let name = tokens.next().unwrap_or_default().to_string();
154 match keyword {
155 "message" => {
156 decls.push(Decl::Schema(path_of(&package, &stack, &name)));
157 stack.push(Block::Message(name));
158 }
159 "enum" => {
160 decls.push(Decl::Schema(path_of(&package, &stack, &name)));
161 stack.push(Block::Other);
162 }
163 "oneof" => {
164 decls.push(Decl::Oneof(path_of(&package, &stack, &name)));
165 stack.push(Block::Other);
166 }
167 _ => stack.push(Block::Other),
168 }
169 continue;
170 }
171 if let Some(head) = line.strip_suffix("{}") {
172 let head = head.trim();
173 let mut tokens = head.split_whitespace();
174 let keyword = tokens.next().unwrap_or_default();
175 let name = tokens.next().unwrap_or_default();
176 if matches!(keyword, "message" | "enum") && !name.is_empty() {
177 decls.push(Decl::Schema(path_of(&package, &stack, name)));
178 }
179 continue;
180 }
181 if line == "}" {
182 stack.pop();
183 continue;
184 }
185 if !matches!(stack.last(), Some(Block::Message(_))) {
186 continue;
187 }
188 let Some((ty, name, repeated)) = parse_field(line) else {
189 continue;
190 };
191 let kind = match (ty.as_str(), repeated) {
192 ("google.protobuf.Timestamp", _) => FieldKind::Timestamp,
193 ("bytes", true) => FieldKind::BytesList,
194 ("bytes", false) => FieldKind::Bytes,
195 _ => continue,
196 };
197 decls.push(Decl::Field(path_of(&package, &stack, &name), kind));
198 }
199 decls
200}
201
202fn package_of(text: &str) -> Option<String> {
203 text.lines()
204 .find_map(|line| line.trim().strip_prefix("package "))
205 .map(|rest| rest.trim().trim_end_matches(';').trim().to_string())
206}
207
208fn path_of(package: &str, stack: &[Block], name: &str) -> String {
209 let mut path = format!(".{package}");
210 for block in stack {
211 if let Block::Message(outer) = block {
212 path.push('.');
213 path.push_str(outer);
214 }
215 }
216 path.push('.');
217 path.push_str(name);
218 path
219}
220
221fn parse_field(line: &str) -> Option<(String, String, bool)> {
222 let body = line.strip_suffix(';')?;
223 let tokens: Vec<&str> = body.split_whitespace().collect();
224 let eq = tokens.iter().position(|token| *token == "=")?;
225 if eq < 2 {
226 return None;
227 }
228 let name = tokens[eq - 1];
229 let ty = tokens[eq - 2];
230 if ty.contains('<') || !name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') {
231 return None;
232 }
233 let repeated = eq >= 3 && tokens[eq - 3] == "repeated";
234 Some((ty.to_string(), name.to_string(), repeated))
235}
236
237fn strip_comments(text: &str) -> String {
238 let mut out = String::with_capacity(text.len());
239 let mut chars = text.chars().peekable();
240 let mut line_comment = false;
241 let mut block_comment = false;
242 while let Some(current) = chars.next() {
243 if line_comment {
244 if current == '\n' {
245 line_comment = false;
246 out.push('\n');
247 }
248 continue;
249 }
250 if block_comment {
251 if current == '*' && chars.peek() == Some(&'/') {
252 chars.next();
253 block_comment = false;
254 }
255 continue;
256 }
257 if current == '/' && chars.peek() == Some(&'/') {
258 chars.next();
259 line_comment = true;
260 continue;
261 }
262 if current == '/' && chars.peek() == Some(&'*') {
263 chars.next();
264 block_comment = true;
265 continue;
266 }
267 out.push(current);
268 }
269 out
270}
271
272/// 把 `view/dist` 下的前端产物编进二进制:认证中心自带登录页,不依赖外部静态站点。
14/// 把根目录 `view/dist` 下的前端产物编进二进制:认证中心自带登录页,不依赖外部静态站点。
27315fn build_web_assets(manifest_dir: &Path, out_dir: &Path) {
274 println!("cargo:rerun-if-changed={WEB_DIST}");
16 let root = manifest_dir.join(WEB_DIST);
17 println!("cargo:rerun-if-changed={}", root.display());
27518 println!("cargo:rerun-if-changed=build.rs");
27619 println!("cargo:rerun-if-env-changed=KENOAUTH_SKIP_WEB_ASSETS");
27720
@@ -282,14 +25,13 @@
28225 return;
28326 }
28427
285 let root = manifest_dir.join(WEB_DIST);
28628 let mut files = Vec::new();
28729 collect_assets(&root, &root, &mut files);
28830 files.sort();
28931
29032 let mut source = String::from(concat!(
29133 "// generated by build.rs from ",
292 "view/dist\n",
34 "../../view/dist\n",
29335 "pub static ASSETS: &[Asset] = &[\n"
29436 ));
29537 for file in &files {
Modified lib/identity/Cargo.toml lib/identity/Cargo.toml +13 −3 View lib/identity/Cargo.toml
@@ -13,6 +13,19 @@
1313path = "src/lib.rs"
1414
1515[dependencies]
16accounts = { workspace = true }
17config = { workspace = true }
18crypt = { workspace = true }
19db = { workspace = true }
20email = { workspace = true }
21envelope = { workspace = true }
22events = { workspace = true }
23kvcache = { workspace = true }
24oltp = { workspace = true }
25proto = { workspace = true }
26queue = { workspace = true }
27session = { workspace = true }
28token = { workspace = true }
1629tokio-stream = { version = "0.1", features = ["net"] }
1730actix-web = "4.16.0"
1831aes-gcm = "0.11.1"
@@ -99,7 +112,4 @@
99112tracing-subscriber = { version = "0.3.23", features = ["env-filter", "fmt"] }
100113utoipa = { version = "6.0.0", features = ["actix_extras", "chrono", "uuid"] }
101114uuid = { version = "1.28.0", features = ["serde", "v4", "v7"] }
102
103[build-dependencies]
104tonic-prost-build = "0.14.6"
105115
Modified lib/issues/src/services/boards.rs lib/issues/src/services/boards.rs +6 −10 View lib/issues/src/services/boards.rs
@@ -1,10 +1,7 @@
11use std::collections::HashMap;
22
33use models::dir::dirs::{self, DirKind};
4use models::issue::issue_item;
5use models::issue::issue_pin;
6use models::issue::issues;
7use models::issue::milestone;
4use models::issue::{issue_item, issue_pin, issues, milestone};
85use sea_orm::{
96 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
107 QuerySelect, Set, TransactionTrait, Unchanged,
@@ -15,9 +12,8 @@
1512use uuid::Uuid;
1613
1714use crate::errors::IssueError;
18use crate::services::issues::delete_issue_cascade_in_txn;
1915use crate::services::service::IssueService;
20use crate::share::authz::require_board_manage;
16use crate::share::authz;
2117use crate::share::lookup::{board_context, lookup_board, space_context};
2218
2319#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -200,7 +196,7 @@
200196 cmd: CreateBoardCmd,
201197 ) -> Result<BoardDto, IssueError> {
202198 let space = space_context(self, caller, space_name).await?;
203 require_board_manage(self, &space, caller).await?;
199 authz::require_board_manage(self, &space, caller).await?;
204200
205201 let name = cmd.name.trim();
206202 if name.is_empty() || name.chars().count() > self.config().issues.max_board_name_len {
@@ -398,7 +394,7 @@
398394 cmd: UpdateBoardCmd,
399395 ) -> Result<BoardDto, IssueError> {
400396 let space = space_context(self, caller, space_name).await?;
401 require_board_manage(self, &space, caller).await?;
397 authz::require_board_manage(self, &space, caller).await?;
402398 let board = lookup_board(self, &space, board_id, caller).await?;
403399
404400 let now = OffsetDateTime::now_utc();
@@ -471,7 +467,7 @@
471467 board_id: Uuid,
472468 ) -> Result<(), IssueError> {
473469 let space = space_context(self, caller, space_name).await?;
474 require_board_manage(self, &space, caller).await?;
470 authz::require_board_manage(self, &space, caller).await?;
475471 let board = lookup_board(self, &space, board_id, caller).await?;
476472
477473 self.db()
@@ -489,7 +485,7 @@
489485 .await?;
490486
491487 for item in issue_rows {
492 delete_issue_cascade_in_txn(txn, item.id).await?;
488 crate::services::issues::delete_issue_cascade_in_txn(txn, item.id).await?;
493489 }
494490
495491 milestone::Entity::delete_many()
Modified lib/issues/src/services/comments.rs lib/issues/src/services/comments.rs +5 −9 View lib/issues/src/services/comments.rs
@@ -1,7 +1,6 @@
1use models::issue::comment;
2use models::issue::issue_content_history;
31use models::issue::issue_event_line::IssueEventType;
42use models::issue::issue_member::{self, IssueMemberKind};
3use models::issue::{comment, issue_content_history};
54use models::users::user_notifications::NotificationType;
65use sea_orm::sea_query::Expr;
76use sea_orm::{
@@ -15,9 +14,8 @@
1514use uuid::Uuid;
1615
1716use crate::errors::IssueError;
18use crate::services::service::IssueEventDetail;
19use crate::services::service::IssueService;
20use crate::share::authz::is_board_manager;
17use crate::services::service::{IssueEventDetail, IssueService};
18use crate::share::authz;
2119use crate::share::lookup::{issue_context, require_issue_access};
2220
2321#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -280,7 +278,6 @@
280278
281279 let user_map = self.load_user_briefs(&[inserted.poster_id]).await?;
282280 let poster = user_map.get(&inserted.poster_id).cloned();
283
284281
285282 Ok(CommentDto {
286283 id: inserted.id,
@@ -457,7 +454,7 @@
457454 .await?
458455 .ok_or(IssueError::NotFound)?;
459456
460 if c.poster_id != caller && !is_board_manager(self, &space, caller).await? {
457 if c.poster_id != caller && !authz::is_board_manager(self, &space, caller).await? {
461458 return Err(IssueError::Forbidden);
462459 }
463460
@@ -518,7 +515,6 @@
518515 let user_map = self.load_user_briefs(&[updated.poster_id]).await?;
519516 let poster = user_map.get(&updated.poster_id).cloned();
520517
521
522518 Ok(CommentDto {
523519 id: updated.id,
524520 issue_id: updated.issue_id,
@@ -547,7 +543,7 @@
547543 .await?
548544 .ok_or(IssueError::NotFound)?;
549545
550 if c.poster_id != caller && !is_board_manager(self, &space, caller).await? {
546 if c.poster_id != caller && !authz::is_board_manager(self, &space, caller).await? {
551547 return Err(IssueError::Forbidden);
552548 }
553549
Modified lib/issues/src/services/content_history.rs lib/issues/src/services/content_history.rs +2 −2 View lib/issues/src/services/content_history.rs
@@ -8,7 +8,7 @@
88
99use crate::errors::IssueError;
1010use crate::services::service::IssueService;
11use crate::share::lookup::require_issue_access;
11use crate::share::lookup;
1212
1313#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1414pub struct ContentHistoryDto {
@@ -47,7 +47,7 @@
4747 issue_id: Uuid,
4848 q: ListContentHistoryQuery,
4949 ) -> Result<ContentHistoryPage, IssueError> {
50 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
50 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
5151
5252 let (limit, offset) = self.paginate(q.limit, q.offset);
5353
Modified lib/issues/src/services/dependencies.rs lib/issues/src/services/dependencies.rs +4 −5 View lib/issues/src/services/dependencies.rs
@@ -9,9 +9,8 @@
99use uuid::Uuid;
1010
1111use crate::errors::IssueError;
12use crate::services::service::IssueEventDetail;
13use crate::services::service::IssueService;
14use crate::share::authz::require_board_manage;
12use crate::services::service::{IssueEventDetail, IssueService};
13use crate::share::authz;
1514use crate::share::lookup::{lookup_board, lookup_issue, require_issue_access, space_context};
1615
1716#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -57,7 +56,7 @@
5756 cmd: CreateDependencyCmd,
5857 ) -> Result<DependencyDto, IssueError> {
5958 let space = space_context(self, caller, space_name).await?;
60 require_board_manage(self, &space, caller).await?;
59 authz::require_board_manage(self, &space, caller).await?;
6160 let board = lookup_board(self, &space, board_id, caller).await?;
6261 let _ = lookup_issue(self, &board, issue_id).await?;
6362
@@ -167,7 +166,7 @@
167166 dep_id: Uuid,
168167 ) -> Result<(), IssueError> {
169168 let space = space_context(self, caller, space_name).await?;
170 require_board_manage(self, &space, caller).await?;
169 authz::require_board_manage(self, &space, caller).await?;
171170 let board = lookup_board(self, &space, board_id, caller).await?;
172171 let _ = lookup_issue(self, &board, issue_id).await?;
173172
Modified lib/issues/src/services/events.rs lib/issues/src/services/events.rs +2 −2 View lib/issues/src/services/events.rs
@@ -8,7 +8,7 @@
88
99use crate::errors::IssueError;
1010use crate::services::service::IssueService;
11use crate::share::lookup::require_issue_access;
11use crate::share::lookup;
1212
1313#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1414pub struct EventDto {
@@ -50,7 +50,7 @@
5050 issue_id: Uuid,
5151 q: ListEventQuery,
5252 ) -> Result<EventPage, IssueError> {
53 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
53 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
5454
5555 let (limit, offset) = self.paginate(q.limit, q.offset);
5656
Modified lib/issues/src/services/issue_users.rs lib/issues/src/services/issue_users.rs +3 −3 View lib/issues/src/services/issue_users.rs
@@ -11,7 +11,7 @@
1111
1212use crate::errors::IssueError;
1313use crate::services::service::IssueService;
14use crate::share::lookup::require_issue_access;
14use crate::share::lookup;
1515
1616#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1717pub struct IssueUserDto {
@@ -54,7 +54,7 @@
5454 issue_id: Uuid,
5555 q: ListIssueUserQuery,
5656 ) -> Result<IssueUserPage, IssueError> {
57 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
57 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
5858
5959 let (limit, offset) = self.paginate(q.limit, q.offset);
6060
@@ -105,7 +105,7 @@
105105 uid: i64,
106106 cmd: UpdateIssueUserCmd,
107107 ) -> Result<IssueUserDto, IssueError> {
108 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
108 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
109109
110110 if caller != uid {
111111 return Err(IssueError::Forbidden);
Modified lib/issues/src/services/issues.rs lib/issues/src/services/issues.rs +13 −27 View lib/issues/src/services/issues.rs
@@ -1,25 +1,12 @@
1use models::issue::comment;
2use models::issue::issue_attachment;
3use models::issue::issue_content_history;
4use models::issue::issue_dependency;
5use models::issue::issue_event_line;
61use models::issue::issue_event_line::IssueEventType;
7use models::issue::issue_item;
82use models::issue::issue_item::IssuePriority;
9use models::issue::issue_label;
10use models::issue::issue_member;
11use models::issue::issue_pin;
12use models::issue::issue_reactions;
13use models::issue::issue_relation_label;
14use models::issue::issue_relation_pull;
15use models::issue::issue_relation_repo;
16use models::issue::issue_user;
17use models::issue::issue_watch;
18use models::issue::issues;
19use models::issue::milestone;
20use models::issue::stopwatch;
21use models::issue::tracked_time;
22use models::space::space_members::{self, MemberStatus};
3use models::issue::{
4 comment, issue_attachment, issue_content_history, issue_dependency, issue_event_line,
5 issue_item, issue_label, issue_member, issue_pin, issue_reactions, issue_relation_label,
6 issue_relation_pull, issue_relation_repo, issue_user, issue_watch, issues, milestone,
7 stopwatch, tracked_time,
8};
9use models::space::space_members::MemberStatus;
2310use models::users::user_notifications::NotificationType;
2411use sea_orm::{
2512 ActiveModelTrait, ColumnTrait, Condition, ConnectionTrait, EntityTrait, PaginatorTrait,
@@ -33,9 +20,8 @@
3320
3421use crate::errors::IssueError;
3522use crate::services::labels::LabelDto;
36use crate::services::service::IssueEventDetail;
37use crate::services::service::IssueService;
38use crate::share::authz::is_board_manager;
23use crate::services::service::{IssueEventDetail, IssueService};
24use crate::share::authz;
3925use crate::share::lookup::{board_context, issue_context, lookup_issue_by_ref};
4026
4127#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
@@ -858,7 +844,7 @@
858844 let (space, board, item) =
859845 issue_context(self, caller, space_name, board_id, issue_id).await?;
860846
861 if item.author_id != caller && !is_board_manager(self, &space, caller).await? {
847 if item.author_id != caller && !authz::is_board_manager(self, &space, caller).await? {
862848 return Err(IssueError::Forbidden);
863849 }
864850
@@ -1164,7 +1150,7 @@
11641150 ));
11651151 }
11661152 let (space, board) = board_context(self, caller, space_name, board_id).await?;
1167 let is_manager = is_board_manager(self, &space, caller).await?;
1153 let is_manager = authz::is_board_manager(self, &space, caller).await?;
11681154
11691155 let mut updated = 0u64;
11701156 for issue_ref in cmd.issue_refs {
@@ -1221,7 +1207,7 @@
12211207 ) -> Result<(), IssueError> {
12221208 let (space, _, item) = issue_context(self, caller, space_name, board_id, issue_id).await?;
12231209
1224 if item.author_id != caller && !is_board_manager(self, &space, caller).await? {
1210 if item.author_id != caller && !authz::is_board_manager(self, &space, caller).await? {
12251211 return Err(IssueError::Forbidden);
12261212 }
12271213
@@ -1259,7 +1245,7 @@
12591245 ) -> Result<IssueDto, IssueError> {
12601246 let (space, _, item) = issue_context(self, caller, space_name, board_id, issue_id).await?;
12611247
1262 if item.author_id != caller && !is_board_manager(self, &space, caller).await? {
1248 if item.author_id != caller && !authz::is_board_manager(self, &space, caller).await? {
12631249 return Err(IssueError::Forbidden);
12641250 }
12651251
Modified lib/issues/src/services/labels.rs lib/issues/src/services/labels.rs +5 −7 View lib/issues/src/services/labels.rs
@@ -1,6 +1,5 @@
11use models::issue::issue_event_line::IssueEventType;
2use models::issue::issue_label;
3use models::issue::issue_relation_label;
2use models::issue::{issue_label, issue_relation_label};
43use sea_orm::{
54 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
65 QuerySelect, Set, TransactionTrait,
@@ -11,9 +10,8 @@
1110use uuid::Uuid;
1211
1312use crate::errors::IssueError;
14use crate::services::service::IssueEventDetail;
15use crate::services::service::IssueService;
16use crate::share::authz::require_board_manage;
13use crate::services::service::{IssueEventDetail, IssueService};
14use crate::share::authz;
1715use crate::share::lookup::{
1816 board_context, lookup_board, lookup_issue, require_issue_access, space_context,
1917};
@@ -120,7 +118,7 @@
120118 label_id: Uuid,
121119 ) -> Result<issue_label::Model, IssueError> {
122120 let space = space_context(self, caller, space_name).await?;
123 require_board_manage(self, &space, caller).await?;
121 authz::require_board_manage(self, &space, caller).await?;
124122 let board = lookup_board(self, &space, board_id, caller).await?;
125123 let _ = lookup_issue(self, &board, issue_id).await?;
126124 let label = issue_label::Entity::find_by_id(label_id)
@@ -140,7 +138,7 @@
140138 cmd: CreateLabelCmd,
141139 ) -> Result<LabelDto, IssueError> {
142140 let space = space_context(self, caller, space_name).await?;
143 require_board_manage(self, &space, caller).await?;
141 authz::require_board_manage(self, &space, caller).await?;
144142 let board = lookup_board(self, &space, board_id, caller).await?;
145143
146144 let name = cmd.name.trim();
Modified lib/issues/src/services/members.rs lib/issues/src/services/members.rs +5 −6 View lib/issues/src/services/members.rs
@@ -1,6 +1,6 @@
11use models::issue::issue_event_line::IssueEventType;
22use models::issue::issue_member::{self, IssueMemberKind};
3use models::space::space_members::{self, MemberStatus};
3use models::space::space_members::MemberStatus;
44use models::users::user_notifications::NotificationType;
55use sea_orm::{
66 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
@@ -13,9 +13,8 @@
1313use uuid::Uuid;
1414
1515use crate::errors::IssueError;
16use crate::services::service::IssueEventDetail;
17use crate::services::service::IssueService;
18use crate::share::authz::require_board_manage;
16use crate::services::service::{IssueEventDetail, IssueService};
17use crate::share::authz;
1918use crate::share::lookup::{lookup_board, lookup_issue, require_issue_access, space_context};
2019
2120#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -62,7 +61,7 @@
6261 cmd: CreateIssueMemberCmd,
6362 ) -> Result<IssueMemberDto, IssueError> {
6463 let space = space_context(self, caller, space_name).await?;
65 require_board_manage(self, &space, caller).await?;
64 authz::require_board_manage(self, &space, caller).await?;
6665 let board = lookup_board(self, &space, board_id, caller).await?;
6766 let item = lookup_issue(self, &board, issue_id).await?;
6867
@@ -262,7 +261,7 @@
262261 member_id: Uuid,
263262 ) -> Result<(), IssueError> {
264263 let space = space_context(self, caller, space_name).await?;
265 require_board_manage(self, &space, caller).await?;
264 authz::require_board_manage(self, &space, caller).await?;
266265 let board = lookup_board(self, &space, board_id, caller).await?;
267266 let _ = lookup_issue(self, &board, issue_id).await?;
268267
Modified lib/issues/src/services/milestones.rs lib/issues/src/services/milestones.rs +5 −6 View lib/issues/src/services/milestones.rs
@@ -1,7 +1,6 @@
11use std::collections::HashMap;
22
3use models::issue::issue_item;
4use models::issue::milestone;
3use models::issue::{issue_item, milestone};
54use sea_orm::sea_query::Expr;
65use sea_orm::{
76 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
@@ -14,7 +13,7 @@
1413
1514use crate::errors::IssueError;
1615use crate::services::service::IssueService;
17use crate::share::authz::require_board_manage;
16use crate::share::authz;
1817use crate::share::lookup::{board_context, lookup_board, space_context};
1918
2019#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -156,7 +155,7 @@
156155 cmd: CreateMilestoneCmd,
157156 ) -> Result<MilestoneDto, IssueError> {
158157 let space = space_context(self, caller, space_name).await?;
159 require_board_manage(self, &space, caller).await?;
158 authz::require_board_manage(self, &space, caller).await?;
160159 let board = lookup_board(self, &space, board_id, caller).await?;
161160
162161 let name = cmd.name.trim();
@@ -287,7 +286,7 @@
287286 cmd: UpdateMilestoneCmd,
288287 ) -> Result<MilestoneDto, IssueError> {
289288 let space = space_context(self, caller, space_name).await?;
290 require_board_manage(self, &space, caller).await?;
289 authz::require_board_manage(self, &space, caller).await?;
291290 let board = lookup_board(self, &space, board_id, caller).await?;
292291
293292 let m = milestone::Entity::find_by_id(milestone_id)
@@ -344,7 +343,7 @@
344343 milestone_id: Uuid,
345344 ) -> Result<(), IssueError> {
346345 let space = space_context(self, caller, space_name).await?;
347 require_board_manage(self, &space, caller).await?;
346 authz::require_board_manage(self, &space, caller).await?;
348347 let board = lookup_board(self, &space, board_id, caller).await?;
349348
350349 let _ = milestone::Entity::find_by_id(milestone_id)
Modified lib/issues/src/services/pins.rs lib/issues/src/services/pins.rs +4 −4 View lib/issues/src/services/pins.rs
@@ -7,7 +7,7 @@
77
88use crate::errors::IssueError;
99use crate::services::service::IssueService;
10use crate::share::authz::require_board_manage;
10use crate::share::authz;
1111use crate::share::lookup::{board_context, lookup_board, lookup_issue, space_context};
1212
1313#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -60,7 +60,7 @@
6060 cmd: UpdatePinCmd,
6161 ) -> Result<PinDto, IssueError> {
6262 let space = space_context(self, caller, space_name).await?;
63 require_board_manage(self, &space, caller).await?;
63 authz::require_board_manage(self, &space, caller).await?;
6464 let row = issue_pin::Entity::find_by_id(pin_id)
6565 .filter(issue_pin::Column::CollectionId.eq(board_id))
6666 .one(self.db().write())
@@ -86,7 +86,7 @@
8686 cmd: CreatePinCmd,
8787 ) -> Result<PinDto, IssueError> {
8888 let space = space_context(self, caller, space_name).await?;
89 require_board_manage(self, &space, caller).await?;
89 authz::require_board_manage(self, &space, caller).await?;
9090 let board = lookup_board(self, &space, board_id, caller).await?;
9191 let _ = lookup_issue(self, &board, cmd.issue_id).await?;
9292
@@ -147,7 +147,7 @@
147147 pin_id: Uuid,
148148 ) -> Result<(), IssueError> {
149149 let space = space_context(self, caller, space_name).await?;
150 require_board_manage(self, &space, caller).await?;
150 authz::require_board_manage(self, &space, caller).await?;
151151 let board = lookup_board(self, &space, board_id, caller).await?;
152152
153153 let p = issue_pin::Entity::find_by_id(pin_id)
Modified lib/issues/src/services/reactions.rs lib/issues/src/services/reactions.rs +4 −5 View lib/issues/src/services/reactions.rs
@@ -1,11 +1,10 @@
11use std::collections::HashMap;
22
3use models::issue::comment;
4use models::issue::issue_reactions;
3use models::issue::{comment, issue_reactions};
54use models::space::space_join_rule::SpaceJoinTrigger;
65use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set};
76use serde::{Deserialize, Serialize};
8use space::services::join_rules::apply_space_join_rules;
7use space::services::join_rules;
98use space::services::spaces::UserDto;
109use time::OffsetDateTime;
1110use utoipa::{IntoParams, ToSchema};
@@ -131,7 +130,7 @@
131130 };
132131
133132 let inserted = row.insert(self.db().write()).await?;
134 if let Err(e) = apply_space_join_rules(
133 if let Err(e) = join_rules::apply_space_join_rules(
135134 &self.state,
136135 space.id,
137136 caller,
@@ -198,7 +197,7 @@
198197 };
199198
200199 let inserted = row.insert(self.db().write()).await?;
201 if let Err(e) = apply_space_join_rules(
200 if let Err(e) = join_rules::apply_space_join_rules(
202201 &self.state,
203202 space.id,
204203 caller,
Modified lib/issues/src/services/repo_relations.rs lib/issues/src/services/repo_relations.rs +3 −3 View lib/issues/src/services/repo_relations.rs
@@ -8,7 +8,7 @@
88
99use crate::errors::IssueError;
1010use crate::services::service::IssueService;
11use crate::share::authz::require_board_manage;
11use crate::share::authz;
1212use crate::share::lookup::{lookup_board, lookup_issue, require_issue_access, space_context};
1313
1414#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -54,7 +54,7 @@
5454 cmd: CreateRepoRelCmd,
5555 ) -> Result<RepoRelDto, IssueError> {
5656 let space = space_context(self, caller, space_name).await?;
57 require_board_manage(self, &space, caller).await?;
57 authz::require_board_manage(self, &space, caller).await?;
5858 let board = lookup_board(self, &space, board_id, caller).await?;
5959 let _ = lookup_issue(self, &board, issue_id).await?;
6060
@@ -115,7 +115,7 @@
115115 rel_id: Uuid,
116116 ) -> Result<(), IssueError> {
117117 let space = space_context(self, caller, space_name).await?;
118 require_board_manage(self, &space, caller).await?;
118 authz::require_board_manage(self, &space, caller).await?;
119119 let board = lookup_board(self, &space, board_id, caller).await?;
120120 let _ = lookup_issue(self, &board, issue_id).await?;
121121
Modified lib/issues/src/services/service.rs lib/issues/src/services/service.rs +1 −3 View lib/issues/src/services/service.rs
@@ -6,11 +6,9 @@
66use export::database::AppDatabase;
77use i18n;
88use models::issue::issue_event_line::{self, IssueEventType};
9use models::space::space_members::{self, MemberStatus};
109use models::space::spaces;
11use models::users::user;
1210use models::users::user_notifications::{self, NotificationType};
13use sea_orm::{ActiveModelTrait, ColumnTrait, ConnectionTrait, EntityTrait, QueryFilter, Set};
11use sea_orm::{ActiveModelTrait, ConnectionTrait, Set};
1412use space::services::spaces::UserDto;
1513use time::OffsetDateTime;
1614use uuid::Uuid;
Modified lib/issues/src/services/stopwatch.rs lib/issues/src/services/stopwatch.rs +5 −6 View lib/issues/src/services/stopwatch.rs
@@ -1,5 +1,4 @@
1use models::issue::stopwatch;
2use models::issue::tracked_time;
1use models::issue::{stopwatch, tracked_time};
32use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set, TransactionTrait};
43use serde::{Deserialize, Serialize};
54use space::services::spaces::UserDto;
@@ -9,7 +8,7 @@
98
109use crate::errors::IssueError;
1110use crate::services::service::IssueService;
12use crate::share::lookup::require_issue_access;
11use crate::share::lookup;
1312
1413#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1514pub struct StopwatchDto {
@@ -40,7 +39,7 @@
4039 board_id: Uuid,
4140 issue_id: Uuid,
4241 ) -> Result<StopwatchDto, IssueError> {
43 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
42 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
4443
4544 let sw = stopwatch::Entity::find()
4645 .filter(stopwatch::Column::IssueId.eq(issue_id))
@@ -80,7 +79,7 @@
8079 board_id: Uuid,
8180 issue_id: Uuid,
8281 ) -> Result<StopwatchDto, IssueError> {
83 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
82 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
8483
8584 let existing = stopwatch::Entity::find()
8685 .filter(stopwatch::Column::IssueId.eq(issue_id))
@@ -125,7 +124,7 @@
125124 board_id: Uuid,
126125 issue_id: Uuid,
127126 ) -> Result<(), IssueError> {
128 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
127 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
129128
130129 let sw = stopwatch::Entity::find()
131130 .filter(stopwatch::Column::IssueId.eq(issue_id))
Modified lib/issues/src/services/tracked_time.rs lib/issues/src/services/tracked_time.rs +5 −5 View lib/issues/src/services/tracked_time.rs
@@ -11,7 +11,7 @@
1111
1212use crate::errors::IssueError;
1313use crate::services::service::IssueService;
14use crate::share::lookup::require_issue_access;
14use crate::share::lookup;
1515
1616#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1717pub struct TrackedTimeDto {
@@ -71,7 +71,7 @@
7171 "seconds must be positive".to_string(),
7272 ));
7373 }
74 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
74 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
7575 let row = tracked_time::ActiveModel {
7676 id: Set(Uuid::now_v7()),
7777 issue_id: Set(issue_id),
@@ -106,7 +106,7 @@
106106 "seconds must be positive".to_string(),
107107 ));
108108 }
109 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
109 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
110110 let row = tracked_time::Entity::find_by_id(time_id)
111111 .filter(tracked_time::Column::IssueId.eq(issue_id))
112112 .one(self.db().write())
@@ -137,7 +137,7 @@
137137 issue_id: Uuid,
138138 time_id: Uuid,
139139 ) -> Result<(), IssueError> {
140 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
140 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
141141 let row = tracked_time::Entity::find_by_id(time_id)
142142 .filter(tracked_time::Column::IssueId.eq(issue_id))
143143 .one(self.db().read())
@@ -160,7 +160,7 @@
160160 issue_id: Uuid,
161161 q: ListTrackedTimeQuery,
162162 ) -> Result<TrackedTimePage, IssueError> {
163 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
163 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
164164
165165 let (limit, offset) = self.paginate(q.limit, q.offset);
166166
Modified lib/issues/src/services/watches.rs lib/issues/src/services/watches.rs +4 −4 View lib/issues/src/services/watches.rs
@@ -9,7 +9,7 @@
99
1010use crate::errors::IssueError;
1111use crate::services::service::IssueService;
12use crate::share::lookup::require_issue_access;
12use crate::share::lookup;
1313
1414#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
1515pub struct WatchDto {
@@ -41,7 +41,7 @@
4141 board_id: Uuid,
4242 issue_id: Uuid,
4343 ) -> Result<WatchDto, IssueError> {
44 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
44 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
4545
4646 let w = issue_watch::Entity::find()
4747 .filter(issue_watch::Column::IssueId.eq(Some(issue_id)))
@@ -72,7 +72,7 @@
7272 issue_id: Uuid,
7373 cmd: UpsertWatchCmd,
7474 ) -> Result<WatchDto, IssueError> {
75 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
75 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
7676
7777 let existing = issue_watch::Entity::find()
7878 .filter(issue_watch::Column::IssueId.eq(Some(issue_id)))
@@ -122,7 +122,7 @@
122122 board_id: Uuid,
123123 issue_id: Uuid,
124124 ) -> Result<(), IssueError> {
125 require_issue_access(self, caller, space_name, board_id, issue_id).await?;
125 lookup::require_issue_access(self, caller, space_name, board_id, issue_id).await?;
126126
127127 let res = issue_watch::Entity::delete_many()
128128 .filter(issue_watch::Column::IssueId.eq(Some(issue_id)))
Modified lib/issues/src/share/lookup.rs lib/issues/src/share/lookup.rs +1 −2 View lib/issues/src/share/lookup.rs
@@ -1,6 +1,5 @@
11use models::dir::dirs::{self, DirKind};
2use models::issue::issue_item;
3use models::issue::issues;
2use models::issue::{issue_item, issues};
43use models::space::spaces;
54use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
65use space::share::authz::{READ, VIEW_SPACE, effective_permissions};
Modified lib/jwt/src/claims.rs lib/jwt/src/claims.rs +1 −1 View lib/jwt/src/claims.rs
@@ -123,4 +123,4 @@
123123 }),
124124 )
125125 }
126}
No newline at end of file
126}
Modified lib/jwt/src/cookie.rs lib/jwt/src/cookie.rs +1 −1 View lib/jwt/src/cookie.rs
@@ -67,4 +67,4 @@
6767 SameSite::None => "None",
6868 });
6969 cookie
70}
No newline at end of file
70}
Modified lib/jwt/src/error.rs lib/jwt/src/error.rs +1 −1 View lib/jwt/src/error.rs
@@ -49,4 +49,4 @@
4949 )
5050 .into_response()
5151 }
52}
No newline at end of file
52}
Modified lib/jwt/src/extract.rs lib/jwt/src/extract.rs +5 −3 View lib/jwt/src/extract.rs
@@ -5,7 +5,7 @@
55use axum::http::request::Parts;
66
77use crate::claims::AccessClaims;
8use crate::cookie::read_cookie;
8use crate::cookie;
99use crate::error::SessionError;
1010use crate::verifier::JwtVerifier;
1111
@@ -100,7 +100,9 @@
100100 .headers
101101 .get(axum::http::header::COOKIE)
102102 .and_then(|value| value.to_str().ok())
103 .and_then(|header| read_cookie(header, verifier.session_cookie()).map(str::to_owned))
103 .and_then(|header| {
104 cookie::read_cookie(header, verifier.session_cookie()).map(str::to_owned)
105 })
104106 .or_else(|| {
105107 parts
106108 .headers
@@ -131,4 +133,4 @@
131133 }
132134 }
133135 }
134}
No newline at end of file
136}
Modified lib/jwt/src/guard.rs lib/jwt/src/guard.rs +1 −1 View lib/jwt/src/guard.rs
@@ -26,4 +26,4 @@
2626 Ok(_) => next.run(request).await,
2727 Err(error) => error.into_response(),
2828 }
29}
No newline at end of file
29}
Modified lib/jwt/src/lib.rs lib/jwt/src/lib.rs +4 −2 View lib/jwt/src/lib.rs
@@ -8,7 +8,9 @@
88pub mod verifier;
99
1010pub use claims::{AccessClaims, IdClaims, ServiceClaims};
11pub use cookie::{clear_refresh_cookie, clear_session_cookie, read_cookie, refresh_cookie, session_cookie};
11pub use cookie::{
12 clear_refresh_cookie, clear_session_cookie, read_cookie, refresh_cookie, session_cookie,
13};
1214pub use error::SessionError;
1315pub use extract::Session;
1416pub use guard::require_uid;
@@ -20,4 +22,4 @@
2022 use sha2::{Digest, Sha512};
2123 let digest = Sha512::digest(access_token.as_bytes());
2224 base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(&digest[..digest.len() / 2])
23}
No newline at end of file
25}
Modified lib/jwt/src/share.rs lib/jwt/src/share.rs +1 −1 View lib/jwt/src/share.rs
@@ -4,4 +4,4 @@
44
55pub mod session {
66 pub use crate::guard::require_uid;
7}
No newline at end of file
7}
Modified lib/jwt/src/user.rs lib/jwt/src/user.rs +1 −1 View lib/jwt/src/user.rs
@@ -21,4 +21,4 @@
2121 fn uid(&self) -> Option<i64> {
2222 Session::uid(self)
2323 }
24}
No newline at end of file
24}
Modified lib/kenauth/src/lib.rs lib/kenauth/src/lib.rs +1 −7 View lib/kenauth/src/lib.rs
@@ -1,8 +1,2 @@
1pub use kenoauth::client::{KenAuthClient, error::KenAuthError};
12pub use kenoauth::protos::auth as proto;
2
3mod client;
4mod error;
5mod local;
6
7pub use client::KenAuthClient;
8pub use error::KenAuthError;
Modified lib/kenauth/Cargo.toml lib/kenauth/Cargo.toml +0 −10 View lib/kenauth/Cargo.toml
@@ -5,13 +5,3 @@
55
66[dependencies]
77kenoauth = { workspace = true }
8config = { workspace = true }
9prost = { workspace = true }
10prost-types = { workspace = true }
11thiserror = { workspace = true }
12tonic = { workspace = true }
13tonic-prost = { workspace = true }
14tonic-health = "0.14"
15tracing = { workspace = true }
16tokio = { workspace = true, features = ["time"] }
17uuid = { workspace = true }
Modified lib/kenshell/build.rs lib/kenshell/build.rs +1 −2 View lib/kenshell/build.rs
@@ -1,6 +1,5 @@
1use std::env;
2use std::fs;
31use std::path::{Path, PathBuf};
2use std::{env, fs};
43
54fn main() -> Result<(), Box<dyn std::error::Error>> {
65 let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?);
Modified lib/models/src/repo/mod.rs lib/models/src/repo/mod.rs +1 −1 View lib/models/src/repo/mod.rs
@@ -1,6 +1,6 @@
1pub mod code_comment;
12pub mod repo_branch_protection_policy;
23pub mod repo_branch_protection_whitelists;
3pub mod code_comment;
44pub mod repo_collaborations;
55pub mod repo_license;
66pub mod repo_relation_topic;
Modified lib/models/src/users/access_scope.rs lib/models/src/users/access_scope.rs +2 −12 View lib/models/src/users/access_scope.rs
@@ -1,16 +1,6 @@
11use serde::{Deserialize, Serialize};
22
3#[derive(
4 Debug,
5 Clone,
6 Copy,
7 PartialEq,
8 Eq,
9 Default,
10 Serialize,
11 Deserialize,
12 utoipa::ToSchema,
13)]
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize, utoipa::ToSchema)]
144#[serde(rename_all = "snake_case")]
155pub enum AccessKeyScope {
166 #[default]
@@ -25,4 +15,4 @@
2515 Self::Read => !want_write,
2616 }
2717 }
28}
No newline at end of file
18}
Modified lib/models/src/users/mod.rs lib/models/src/users/mod.rs +1 −2 View lib/models/src/users/mod.rs
@@ -1,8 +1,8 @@
1pub mod access_scope;
12pub mod user;
23pub mod user_agreement_acceptances;
34pub mod user_blocks;
45pub mod user_external_identity;
5pub mod access_scope;
66pub mod user_favorite_memes;
77pub mod user_followers;
88pub mod user_notifications;
@@ -15,4 +15,3 @@
1515pub mod user_suspensions;
1616
1717pub use user::*;
18
Modified lib/pulls/src/services/assignees.rs lib/pulls/src/services/assignees.rs +7 −8 View lib/pulls/src/services/assignees.rs
@@ -1,7 +1,6 @@
11use models::pull_request::{pull_request_assignee, pull_requests};
2use sea_orm::{
3 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, QueryFilter, QueryOrder,
4};
2use sea_orm::ActiveValue::Set;
3use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder};
54use serde::{Deserialize, Serialize};
65use space::services::spaces::UserDto;
76use time::OffsetDateTime;
@@ -10,9 +9,9 @@
109
1110use crate::errors::PullError;
1211use crate::services::events::{EVENT_ASSIGNED, EVENT_UNASSIGNED};
13use crate::services::reviews::unique_ids;
12use crate::services::reviews;
1413use crate::services::service::PullService;
15use crate::share::authz::require_unlocked;
14use crate::share::authz;
1615
1716#[derive(Debug, Clone, Deserialize, ToSchema)]
1817pub struct AssignCmd {
@@ -35,7 +34,7 @@
3534 .all(self.db_read())
3635 .await?;
3736 let users = self
38 .user_briefs(&unique_ids(rows.iter().map(|row| row.user_id)))
37 .user_briefs(&reviews::unique_ids(rows.iter().map(|row| row.user_id)))
3938 .await?;
4039 Ok(rows
4140 .iter()
@@ -53,7 +52,7 @@
5352 caller: i64,
5453 reference: &str,
5554 ) -> Result<Vec<PullAssigneeDto>, PullError> {
56 require_unlocked(pull)?;
55 authz::require_unlocked(pull)?;
5756 let uid = self.resolve_user_id(reference).await?;
5857 let existing = pull_request_assignee::Entity::find()
5958 .filter(pull_request_assignee::Column::PullRequestId.eq(pull.id))
@@ -87,7 +86,7 @@
8786 caller: i64,
8887 reference: &str,
8988 ) -> Result<Vec<PullAssigneeDto>, PullError> {
90 require_unlocked(pull)?;
89 authz::require_unlocked(pull)?;
9190 let uid = self.resolve_user_id(reference).await?;
9291 let deleted = pull_request_assignee::Entity::delete_many()
9392 .filter(pull_request_assignee::Column::PullRequestId.eq(pull.id))
Modified lib/pulls/src/services/changes.rs lib/pulls/src/services/changes.rs +3 −3 View lib/pulls/src/services/changes.rs
@@ -2,13 +2,13 @@
22use git::service::diffs::{ChangedPathDiffDto, DiffOptionsDto};
33use git::service::merge::{MergeCommitDto, MergePlanDto};
44use models::pull_request::pull_requests;
5use sea_orm::{ActiveModelTrait, ActiveValue::Set, IntoActiveModel};
5use sea_orm::ActiveValue::Set;
6use sea_orm::{ActiveModelTrait, IntoActiveModel};
67use serde::{Deserialize, Serialize};
78use time::OffsetDateTime;
89
910use crate::errors::PullError;
10use crate::services::events::EVENT_HEAD_UPDATED;
11use crate::services::events::write_event;
11use crate::services::events::{EVENT_HEAD_UPDATED, write_event};
1212use crate::services::service::PullService;
1313
1414#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
Modified lib/pulls/src/services/comments.rs lib/pulls/src/services/comments.rs +5 −4 View lib/pulls/src/services/comments.rs
@@ -1,9 +1,10 @@
11use export::pagination::{Page, PageQuery};
22use git::context::facade::GitContext;
33use models::pull_request::{pull_request_comment, pull_requests};
4use sea_orm::ActiveValue::Set;
45use sea_orm::{
5 ActiveModelTrait, ActiveValue::Set, ColumnTrait, Condition, EntityTrait, PaginatorTrait,
6 QueryFilter, QueryOrder, QuerySelect,
6 ActiveModelTrait, ColumnTrait, Condition, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
7 QuerySelect,
78};
89use serde::{Deserialize, Serialize};
910use space::services::spaces::UserDto;
@@ -14,7 +15,7 @@
1415
1516use crate::errors::PullError;
1617use crate::services::events::EVENT_COMMENTED;
17use crate::services::reviews::unique_ids;
18use crate::services::reviews;
1819use crate::services::service::PullService;
1920use crate::share::authz::{require_open, require_unlocked};
2021
@@ -323,7 +324,7 @@
323324 &self,
324325 rows: &[pull_request_comment::Model],
325326 ) -> Result<HashMap<i64, UserDto>, PullError> {
326 self.user_briefs(&unique_ids(rows.iter().map(|row| row.user_id)))
327 self.user_briefs(&reviews::unique_ids(rows.iter().map(|row| row.user_id)))
327328 .await
328329 }
329330
Modified lib/pulls/src/services/events.rs lib/pulls/src/services/events.rs +3 −3 View lib/pulls/src/services/events.rs
@@ -1,9 +1,9 @@
11use export::pagination::{Page, PageQuery};
22use models::pull_request::{pull_request_event_line, pull_requests};
3use models::users::user;
3use sea_orm::ActiveValue::Set;
44use sea_orm::{
5 ActiveModelTrait, ActiveValue::Set, ColumnTrait, ConnectionTrait, EntityTrait, PaginatorTrait,
6 QueryFilter, QueryOrder, QuerySelect,
5 ActiveModelTrait, ColumnTrait, ConnectionTrait, EntityTrait, PaginatorTrait, QueryFilter,
6 QueryOrder, QuerySelect,
77};
88use serde::{Deserialize, Serialize};
99use space::services::spaces::UserDto;
Modified lib/pulls/src/services/labels.rs lib/pulls/src/services/labels.rs +5 −6 View lib/pulls/src/services/labels.rs
@@ -1,8 +1,7 @@
11use models::issue::issue_label;
22use models::pull_request::{pull_request_label, pull_requests};
3use sea_orm::{
4 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, QueryFilter, QueryOrder,
5};
3use sea_orm::ActiveValue::Set;
4use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder};
65use serde::Deserialize;
76use utoipa::ToSchema;
87use uuid::Uuid;
@@ -10,7 +9,7 @@
109use crate::errors::PullError;
1110use crate::services::events::{EVENT_LABELED, EVENT_UNLABELED};
1211use crate::services::service::PullService;
13use crate::share::authz::require_unlocked;
12use crate::share::authz;
1413
1514#[derive(Debug, Clone, Deserialize, ToSchema)]
1615pub struct AttachLabelCmd {
@@ -87,7 +86,7 @@
8786 caller: i64,
8887 cmd: AttachLabelCmd,
8988 ) -> Result<Vec<issues::services::labels::LabelDto>, PullError> {
90 require_unlocked(pull)?;
89 authz::require_unlocked(pull)?;
9190 let label = self.resolve_label(dir_id, &cmd.label).await?;
9291 let existing = pull_request_label::Entity::find()
9392 .filter(pull_request_label::Column::PullRequestId.eq(pull.id))
@@ -122,7 +121,7 @@
122121 caller: i64,
123122 label_ref: &str,
124123 ) -> Result<Vec<issues::services::labels::LabelDto>, PullError> {
125 require_unlocked(pull)?;
124 authz::require_unlocked(pull)?;
126125 let label = self.resolve_label(dir_id, label_ref).await?;
127126 let deleted = pull_request_label::Entity::delete_many()
128127 .filter(pull_request_label::Column::PullRequestId.eq(pull.id))
Modified lib/pulls/src/services/merge.rs lib/pulls/src/services/merge.rs +5 −4 View lib/pulls/src/services/merge.rs
@@ -2,14 +2,15 @@
22use git::service::merge::{ExecuteMergeCmd, MergeResultDto};
33use models::pull_request::pull_requests;
44use models::pull_request::pull_requests::MergeMethod;
5use sea_orm::{ActiveModelTrait, ActiveValue::Set, IntoActiveModel};
5use sea_orm::ActiveValue::Set;
6use sea_orm::{ActiveModelTrait, IntoActiveModel};
67use serde::{Deserialize, Serialize};
78use utoipa::ToSchema;
89
910use crate::errors::PullError;
1011use crate::services::changes::PullSummaryDto;
1112use crate::services::service::PullService;
12use crate::share::authz::require_open;
13use crate::share::authz;
1314
1415#[derive(Debug, Clone, Deserialize, ToSchema)]
1516pub struct MergePullCmd {
@@ -58,7 +59,7 @@
5859 // caller, and the resolved handle is the single place it is known.
5960 let caller = handle.caller.ok_or(PullError::Unauthorized)?;
6061 let admin = *admin;
61 require_open(pull)?;
62 authz::require_open(pull)?;
6263 if pull.is_draft {
6364 return Err(PullError::Conflict(
6465 "pull request is still a draft".to_string(),
@@ -182,7 +183,7 @@
182183 caller: i64,
183184 admin: bool,
184185 ) -> Result<(pull_requests::Model, MergeResultDto), PullError> {
185 require_open(pull)?;
186 authz::require_open(pull)?;
186187 let _ = ctx;
187188 if pull.is_locked && !admin {
188189 return Err(PullError::Forbidden);
Modified lib/pulls/src/services/pulls.rs lib/pulls/src/services/pulls.rs +3 −3 View lib/pulls/src/services/pulls.rs
@@ -6,10 +6,10 @@
66 pull_request_review, pull_request_reviewer, pull_requests,
77};
88use models::repo::repos;
9use models::users::user;
9use sea_orm::ActiveValue::Set;
1010use sea_orm::{
11 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter,
12 QueryOrder, QuerySelect, TransactionTrait,
11 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
12 QuerySelect, TransactionTrait,
1313};
1414use serde::{Deserialize, Serialize};
1515use space::services::spaces::UserDto;
Modified lib/pulls/src/services/relations.rs lib/pulls/src/services/relations.rs +2 −3 View lib/pulls/src/services/relations.rs
@@ -2,9 +2,8 @@
22use models::issue::issue_event_line::{self, IssueEventType};
33use models::issue::issue_relation_pull;
44use models::pull_request::pull_requests;
5use sea_orm::{
6 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, QueryFilter, QueryOrder,
7};
5use sea_orm::ActiveValue::Set;
6use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder};
87use serde::{Deserialize, Serialize};
98use std::collections::HashMap;
109use time::OffsetDateTime;
Modified lib/pulls/src/services/reviewers.rs lib/pulls/src/services/reviewers.rs +6 −7 View lib/pulls/src/services/reviewers.rs
@@ -1,7 +1,6 @@
11use models::pull_request::{pull_request_review, pull_request_reviewer, pull_requests};
2use sea_orm::{
3 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, QueryFilter, QueryOrder,
4};
2use sea_orm::ActiveValue::Set;
3use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder};
54use serde::{Deserialize, Serialize};
65use space::services::spaces::UserDto;
76use time::OffsetDateTime;
@@ -12,9 +11,9 @@
1211use crate::services::events::{
1312 EVENT_REVIEW_REQUEST_CANCELLED, EVENT_REVIEW_REQUESTED, write_event,
1413};
15use crate::services::reviews::unique_ids;
14use crate::services::reviews;
1615use crate::services::service::PullService;
17use crate::share::authz::require_open;
16use crate::share::authz;
1817use models::pull_request::pull_request_review::ReviewState;
1918use models::pull_request::pull_request_reviewer::ReviewerState;
2019
@@ -81,7 +80,7 @@
8180 caller: i64,
8281 cmd: RequestReviewersCmd,
8382 ) -> Result<Vec<PullReviewerDto>, PullError> {
84 require_open(pull)?;
83 authz::require_open(pull)?;
8584 if cmd.reviewers.is_empty() {
8685 return Err(PullError::BadRequest(
8786 "reviewers must not be empty".to_string(),
@@ -180,7 +179,7 @@
180179 .all(self.db_read())
181180 .await?;
182181 let users = self
183 .user_briefs(&unique_ids(
182 .user_briefs(&reviews::unique_ids(
184183 rows.iter()
185184 .flat_map(|row| [row.user_id, row.requested_by_id]),
186185 ))
Modified lib/pulls/src/services/reviews.rs lib/pulls/src/services/reviews.rs +6 −5 View lib/pulls/src/services/reviews.rs
@@ -1,8 +1,9 @@
11use git::context::facade::GitContext;
22use models::pull_request::{pull_request_comment, pull_request_review, pull_requests};
3use sea_orm::ActiveValue::Set;
34use sea_orm::{
4 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter,
5 QueryOrder, Set as AmSet, TransactionTrait,
5 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
6 Set as AmSet, TransactionTrait,
67};
78use serde::{Deserialize, Serialize};
89use space::services::spaces::UserDto;
@@ -14,7 +15,7 @@
1415use crate::services::events::{EVENT_REVIEW_DISMISSED, EVENT_REVIEW_SUBMITTED, write_event};
1516use crate::services::reviewers::ReviewerOutcome;
1617use crate::services::service::PullService;
17use crate::share::authz::require_open;
18use crate::share::authz;
1819use models::pull_request::pull_request_review::ReviewState;
1920
2021#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
@@ -77,7 +78,7 @@
7778 admin: bool,
7879 cmd: SubmitReviewCmd,
7980 ) -> Result<pull_request_review::Model, PullError> {
80 require_open(pull)?;
81 authz::require_open(pull)?;
8182 if pull.is_locked && !admin {
8283 return Err(PullError::Forbidden);
8384 }
@@ -164,7 +165,7 @@
164165 admin: bool,
165166 cmd: SubmitReviewCmd,
166167 ) -> Result<pull_request_review::Model, PullError> {
167 require_open(pull)?;
168 authz::require_open(pull)?;
168169 if pull.is_locked && !admin {
169170 return Err(PullError::Forbidden);
170171 }
Modified lib/pulls/src/services/service.rs lib/pulls/src/services/service.rs +3 −3 View lib/pulls/src/services/service.rs
@@ -1,13 +1,13 @@
11use config::AppConfig;
22use export::AppState;
33use git::service::GitService;
4use jwt::Session;
45use models::pull_request::pull_requests;
56use models::repo::repos;
7use sea_orm::ActiveValue::Set;
68use sea_orm::{
7 ActiveModelTrait, ActiveValue::Set, ColumnTrait, DatabaseConnection, EntityTrait,
8 PaginatorTrait, QueryFilter,
9 ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, PaginatorTrait, QueryFilter,
910};
10use jwt::Session;
1111use uuid::Uuid;
1212
1313use crate::errors::PullError;
Modified lib/pulls/src/share/lookup.rs lib/pulls/src/share/lookup.rs +5 −5 View lib/pulls/src/share/lookup.rs
@@ -1,8 +1,8 @@
11use git::context::facade::GitContext;
2use git::share::access::authorize_repo_access;
2use git::share::access;
3use jwt::Session;
34use models::pull_request::pull_requests;
45use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
5use jwt::Session;
66use uuid::Uuid;
77
88use crate::errors::PullError;
@@ -25,7 +25,7 @@
2525 let ctx = svc.git.context(space_name, repo_name).await?;
2626 if ctx.model.is_private {
2727 let uid = PullService::uid(session)?;
28 authorize_repo_access(&svc.git, uid, &ctx, false, false).await?;
28 access::authorize_repo_access(&svc.git, uid, &ctx, false, false).await?;
2929 return Ok((ctx, Some(uid)));
3030 }
3131 Ok((ctx, session.uid()))
@@ -39,12 +39,12 @@
3939) -> Result<(GitContext, i64), PullError> {
4040 let uid = PullService::uid(session)?;
4141 let ctx = svc.git.context(space_name, repo_name).await?;
42 authorize_repo_access(&svc.git, uid, &ctx, true, false).await?;
42 access::authorize_repo_access(&svc.git, uid, &ctx, true, false).await?;
4343 Ok((ctx, uid))
4444}
4545
4646pub async fn is_admin(svc: &PullService, uid: i64, ctx: &GitContext) -> bool {
47 authorize_repo_access(&svc.git, uid, ctx, true, true)
47 access::authorize_repo_access(&svc.git, uid, ctx, true, true)
4848 .await
4949 .is_ok()
5050}
Modified lib/push/src/worker.rs lib/push/src/worker.rs +0 −1 View lib/push/src/worker.rs
@@ -10,7 +10,6 @@
1010
1111use export::AppState;
1212use export::push::{PushJob, online_key};
13use models::users::user;
1413use models::users::user_preferences;
1514use models::users::user_push_subscriptions::{self, PushSubscriptionPlatform};
1615use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
Modified lib/queue/src/envelope.rs lib/queue/src/envelope.rs +2 −1 View lib/queue/src/envelope.rs
@@ -1,7 +1,8 @@
11use std::collections::BTreeMap;
22
33use bytes::Bytes;
4use serde::{Deserialize, Serialize, de::DeserializeOwned};
4use serde::de::DeserializeOwned;
5use serde::{Deserialize, Serialize};
56use serde_json::Value;
67use time::OffsetDateTime;
78use uuid::Uuid;
Modified lib/queue/src/lib.rs lib/queue/src/lib.rs +3 −0 View lib/queue/src/lib.rs
@@ -1,6 +1,9 @@
1#![recursion_limit = "512"]
2
13pub mod conn;
24pub mod envelope;
35pub mod error;
6pub mod identity;
47pub mod publisher;
58pub mod relay;
69pub mod route;
Modified lib/queue/Cargo.toml lib/queue/Cargo.toml +3 −0 View lib/queue/Cargo.toml
@@ -5,7 +5,10 @@
55
66[dependencies]
77config = { workspace = true }
8async-trait = { workspace = true }
9chrono = { version = "0.4.45", features = ["serde"] }
810sea-orm = { workspace = true }
11thiserror = { workspace = true }
912serde = { workspace = true, features = ["derive"] }
1013serde_json = { workspace = true }
1114bytes = { workspace = true }
Modified lib/space/src/handlers/accept_invite.rs lib/space/src/handlers/accept_invite.rs +2 −2 View lib/space/src/handlers/accept_invite.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::invites::AcceptInviteCmd;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 post,
@@ -28,7 +28,7 @@
2828 session: Session,
2929 Json(cmd): Json<AcceptInviteCmd>,
3030) -> Result<AppResponseData<NoData>, ApiError> {
31 let uid = require_uid(&session)?;
31 let uid = session::require_uid(&session)?;
3232 service.accept_invite(uid, cmd).await?;
3333 Ok(AppResponseData::empty())
3434}
Modified lib/space/src/handlers/add_member.rs lib/space/src/handlers/add_member.rs +2 −2 View lib/space/src/handlers/add_member.rs
@@ -6,7 +6,7 @@
66use crate::services::members::{AddMemberCmd, MemberDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -30,7 +30,7 @@
3030 Path(path): Path<SpaceNamePath>,
3131 Json(cmd): Json<AddMemberCmd>,
3232) -> Result<AppResponseData<MemberDto>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let member = service.add_member(uid, &path.space_name, cmd).await?;
3535 Ok(AppResponseData::ok(member))
3636}
Modified lib/space/src/handlers/assign_group.rs lib/space/src/handlers/assign_group.rs +2 −2 View lib/space/src/handlers/assign_group.rs
@@ -6,7 +6,7 @@
66use crate::handlers::get_member::MemberPath;
77use crate::services::groups::AssignGroupCmd;
88use crate::services::service::SpaceService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -30,7 +30,7 @@
3030 Path(path): Path<MemberPath>,
3131 Json(cmd): Json<AssignGroupCmd>,
3232) -> Result<AppResponseData<NoData>, ApiError> {
33 let caller = require_uid(&session)?;
33 let caller = session::require_uid(&session)?;
3434 service
3535 .assign_group(caller, &path.space_name, path.user_id, cmd)
3636 .await?;
Modified lib/space/src/handlers/ban_user.rs lib/space/src/handlers/ban_user.rs +2 −2 View lib/space/src/handlers/ban_user.rs
@@ -6,7 +6,7 @@
66use crate::services::bans::{BanDto, BanUserCmd};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -30,7 +30,7 @@
3030 Path(path): Path<SpaceNamePath>,
3131 Json(cmd): Json<BanUserCmd>,
3232) -> Result<AppResponseData<BanDto>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let ban = service.ban_user(uid, &path.space_name, cmd).await?;
3535 Ok(AppResponseData::ok(ban))
3636}
Modified lib/space/src/handlers/create_dir_node.rs lib/space/src/handlers/create_dir_node.rs +2 −2 View lib/space/src/handlers/create_dir_node.rs
@@ -6,7 +6,7 @@
66use crate::services::dir::{CreateDirCmd, DirNodeDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -30,7 +30,7 @@
3030 Path(path): Path<SpaceNamePath>,
3131 Json(cmd): Json<CreateDirCmd>,
3232) -> Result<AppResponseData<DirNodeDto>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let node = service.create_dir_node(uid, &path.space_name, cmd).await?;
3535 Ok(AppResponseData::ok(node))
3636}
Modified lib/space/src/handlers/create_group.rs lib/space/src/handlers/create_group.rs +2 −2 View lib/space/src/handlers/create_group.rs
@@ -6,7 +6,7 @@
66use crate::services::groups::{CreateGroupCmd, GroupDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -30,7 +30,7 @@
3030 Path(path): Path<SpaceNamePath>,
3131 Json(cmd): Json<CreateGroupCmd>,
3232) -> Result<AppResponseData<GroupDto>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let group = service.create_group(uid, &path.space_name, cmd).await?;
3535 Ok(AppResponseData::ok(group))
3636}
Modified lib/space/src/handlers/create_invite.rs lib/space/src/handlers/create_invite.rs +2 −2 View lib/space/src/handlers/create_invite.rs
@@ -6,7 +6,7 @@
66use crate::services::invites::{CreateInviteCmd, InviteDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -30,7 +30,7 @@
3030 Path(path): Path<SpaceNamePath>,
3131 Json(cmd): Json<CreateInviteCmd>,
3232) -> Result<AppResponseData<InviteDto>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let invite = service.create_invite(uid, &path.space_name, cmd).await?;
3535 Ok(AppResponseData::ok(invite))
3636}
Modified lib/space/src/handlers/create_join_rule.rs lib/space/src/handlers/create_join_rule.rs +2 −2 View lib/space/src/handlers/create_join_rule.rs
@@ -6,7 +6,7 @@
66use crate::services::join_rules::{CreateJoinRuleCmd, JoinRuleDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -30,7 +30,7 @@
3030 Path(path): Path<SpaceNamePath>,
3131 Json(cmd): Json<CreateJoinRuleCmd>,
3232) -> Result<AppResponseData<JoinRuleDto>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let dto = service.create_join_rule(uid, &path.space_name, cmd).await?;
3535 Ok(AppResponseData::ok(dto))
3636}
Modified lib/space/src/handlers/create_room.rs lib/space/src/handlers/create_room.rs +2 −2 View lib/space/src/handlers/create_room.rs
@@ -6,7 +6,7 @@
66use crate::services::rooms::{CreateRoomCmd, RoomDto};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -31,7 +31,7 @@
3131 Path(path): Path<SpaceNamePath>,
3232 Json(cmd): Json<CreateRoomCmd>,
3333) -> Result<AppResponseData<RoomDto>, ApiError> {
34 let uid = require_uid(&session)?;
34 let uid = session::require_uid(&session)?;
3535 let room = service.create_room(uid, &path.space_name, cmd).await?;
3636 Ok(AppResponseData::ok(room))
3737}
Modified lib/space/src/handlers/create_space.rs lib/space/src/handlers/create_space.rs +2 −2 View lib/space/src/handlers/create_space.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::{CreateSpaceCmd, SpaceDto};
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 post,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Json(cmd): Json<CreateSpaceCmd>,
2828) -> Result<AppResponseData<SpaceDto>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let space = service.create_space(uid, cmd).await?;
3131 Ok(AppResponseData::ok(space))
3232}
Modified lib/space/src/handlers/delete_group.rs lib/space/src/handlers/delete_group.rs +2 −2 View lib/space/src/handlers/delete_group.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::handlers::get_group::GroupPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<GroupPath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service
3030 .delete_group(uid, &path.space_name, path.group_id)
3131 .await?;
Modified lib/space/src/handlers/delete_join_rule.rs lib/space/src/handlers/delete_join_rule.rs +2 −2 View lib/space/src/handlers/delete_join_rule.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::join_rules::JoinRulePath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<JoinRulePath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service
3030 .delete_join_rule(uid, &path.space_name, path.rule_id)
3131 .await?;
Modified lib/space/src/handlers/delete_room.rs lib/space/src/handlers/delete_room.rs +2 −2 View lib/space/src/handlers/delete_room.rs
@@ -5,7 +5,7 @@
55
66use crate::errors::ApiError;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -27,7 +27,7 @@
2727 session: Session,
2828 Path(room_id): Path<Uuid>,
2929) -> Result<AppResponseData<NoData>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 service.delete_room(uid, room_id).await?;
3232 Ok(AppResponseData::empty())
3333}
Modified lib/space/src/handlers/delete_space.rs lib/space/src/handlers/delete_space.rs +3 −3 View lib/space/src/handlers/delete_space.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::SpaceNamePath;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<SpaceNamePath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service.delete_space(uid, &path.space_name).await?;
3030 Ok(AppResponseData::empty())
3131}
@@ -48,7 +48,7 @@
4848 session: Session,
4949 Path(path): Path<SpaceNamePath>,
5050) -> Result<AppResponseData<NoData>, ApiError> {
51 let uid = require_uid(&session)?;
51 let uid = session::require_uid(&session)?;
5252 service.restore_space(uid, &path.space_name).await?;
5353 Ok(AppResponseData::empty())
5454}
Modified lib/space/src/handlers/delete_space_image.rs lib/space/src/handlers/delete_space_image.rs +2 −2 View lib/space/src/handlers/delete_space_image.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::images::SpaceImageKindPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<SpaceImageKindPath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service
3030 .delete_space_image(uid, &path.space_name, path.kind)
3131 .await?;
Modified lib/space/src/handlers/explore_spaces.rs lib/space/src/handlers/explore_spaces.rs +4 −4 View lib/space/src/handlers/explore_spaces.rs
@@ -9,7 +9,7 @@
99};
1010use crate::services::service::SpaceService;
1111use crate::services::spaces::SpaceNamePath;
12use jwt::share::session::require_uid;
12use jwt::share::session;
1313
1414#[utoipa::path(
1515 get,
@@ -51,7 +51,7 @@
5151 Path(path): Path<SpaceNamePath>,
5252 Query(query): Query<ListJoinRequestsQuery>,
5353) -> Result<AppResponseData<JoinRequestPage>, ApiError> {
54 let uid = require_uid(&session)?;
54 let uid = session::require_uid(&session)?;
5555 let page = service
5656 .list_join_requests(uid, &path.space_name, query)
5757 .await?;
@@ -77,7 +77,7 @@
7777 session: Session,
7878 Path(path): Path<JoinRequestPath>,
7979) -> Result<AppResponseData<JoinRequestDto>, ApiError> {
80 let uid = require_uid(&session)?;
80 let uid = session::require_uid(&session)?;
8181 let request = service
8282 .approve_join_request(uid, &path.space_name, path.request_id)
8383 .await?;
@@ -103,7 +103,7 @@
103103 session: Session,
104104 Path(path): Path<JoinRequestPath>,
105105) -> Result<AppResponseData<JoinRequestDto>, ApiError> {
106 let uid = require_uid(&session)?;
106 let uid = session::require_uid(&session)?;
107107 let request = service
108108 .reject_join_request(uid, &path.space_name, path.request_id)
109109 .await?;
Modified lib/space/src/handlers/get_ban.rs lib/space/src/handlers/get_ban.rs +2 −2 View lib/space/src/handlers/get_ban.rs
@@ -6,7 +6,7 @@
66use crate::handlers::get_member::MemberPath;
77use crate::services::bans::BanDto;
88use crate::services::service::SpaceService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Path(path): Path<MemberPath>,
2828) -> Result<AppResponseData<BanDto>, ApiError> {
29 let caller = require_uid(&session)?;
29 let caller = session::require_uid(&session)?;
3030 let ban = service
3131 .get_ban(caller, &path.space_name, path.user_id)
3232 .await?;
Modified lib/space/src/handlers/get_group.rs lib/space/src/handlers/get_group.rs +1 −1 View lib/space/src/handlers/get_group.rs
@@ -1,7 +1,7 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
Modified lib/space/src/handlers/get_member.rs lib/space/src/handlers/get_member.rs +3 −3 View lib/space/src/handlers/get_member.rs
@@ -1,13 +1,13 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55use utoipa::{IntoParams, ToSchema};
66
77use crate::errors::ApiError;
88use crate::services::members::MemberDto;
99use crate::services::service::SpaceService;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1313pub struct MemberPath {
@@ -33,7 +33,7 @@
3333 session: Session,
3434 Path(path): Path<MemberPath>,
3535) -> Result<AppResponseData<MemberDto>, ApiError> {
36 let uid = require_uid(&session)?;
36 let uid = session::require_uid(&session)?;
3737 let member = service
3838 .get_member(uid, &path.space_name, path.user_id)
3939 .await?;
Modified lib/space/src/handlers/get_space_dir_tree.rs lib/space/src/handlers/get_space_dir_tree.rs +3 −3 View lib/space/src/handlers/get_space_dir_tree.rs
@@ -1,13 +1,13 @@
11use axum::extract::{Path, Query, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55
66use crate::errors::ApiError;
77use crate::services::dir::DirNodeDto;
88use crate::services::service::SpaceService;
99use crate::services::spaces::SpaceNamePath;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[derive(Debug, Clone, Deserialize, utoipa::IntoParams)]
1313pub struct DirTreeQuery {
@@ -33,7 +33,7 @@
3333 Path(path): Path<SpaceNamePath>,
3434 Query(q): Query<DirTreeQuery>,
3535) -> Result<AppResponseData<Vec<DirNodeDto>>, ApiError> {
36 let uid = require_uid(&session)?;
36 let uid = session::require_uid(&session)?;
3737 let tree = service
3838 .get_space_dir_tree(uid, &path.space_name, q.parent_id)
3939 .await?;
Modified lib/space/src/handlers/get_space_image_file.rs lib/space/src/handlers/get_space_image_file.rs +1 −1 View lib/space/src/handlers/get_space_image_file.rs
@@ -2,8 +2,8 @@
22use axum::http::{StatusCode, header};
33use axum::response::Response;
44use imaging::layout::ImageVariant;
5use jwt::Session;
56use serde::Deserialize;
6use jwt::Session;
77use utoipa::{IntoParams, ToSchema};
88
99use crate::errors::ApiError;
Modified lib/space/src/handlers/join_group_self.rs lib/space/src/handlers/join_group_self.rs +2 −2 View lib/space/src/handlers/join_group_self.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::handlers::get_group::GroupPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 post,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Path(path): Path<GroupPath>,
2828) -> Result<AppResponseData<NoData>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 service
3131 .join_group_self(uid, &path.space_name, path.group_id)
3232 .await?;
Modified lib/space/src/handlers/join_requests.rs lib/space/src/handlers/join_requests.rs +3 −3 View lib/space/src/handlers/join_requests.rs
@@ -6,7 +6,7 @@
66use crate::services::join_requests::{CreateJoinRequestCmd, JoinRequestDto, JoinRequestPath};
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -31,7 +31,7 @@
3131 Path(path): Path<SpaceNamePath>,
3232 Json(cmd): Json<CreateJoinRequestCmd>,
3333) -> Result<AppResponseData<JoinRequestDto>, ApiError> {
34 let uid = require_uid(&session)?;
34 let uid = session::require_uid(&session)?;
3535 let request = service
3636 .create_join_request(uid, &path.space_name, cmd)
3737 .await?;
@@ -56,7 +56,7 @@
5656 session: Session,
5757 Path(path): Path<JoinRequestPath>,
5858) -> Result<AppResponseData<NoData>, ApiError> {
59 let uid = require_uid(&session)?;
59 let uid = session::require_uid(&session)?;
6060 service
6161 .withdraw_join_request(uid, &path.space_name, path.request_id)
6262 .await?;
Modified lib/space/src/handlers/leave_group_self.rs lib/space/src/handlers/leave_group_self.rs +2 −2 View lib/space/src/handlers/leave_group_self.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::handlers::get_group::GroupPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<GroupPath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service
3030 .leave_group_self(uid, &path.space_name, path.group_id)
3131 .await?;
Modified lib/space/src/handlers/list_bans.rs lib/space/src/handlers/list_bans.rs +2 −2 View lib/space/src/handlers/list_bans.rs
@@ -6,7 +6,7 @@
66use crate::services::bans::BanPage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -27,7 +27,7 @@
2727 Path(path): Path<SpaceNamePath>,
2828 Query(query): Query<PageQuery>,
2929) -> Result<AppResponseData<BanPage>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 let page = service.list_bans(uid, &path.space_name, query).await?;
3232 Ok(AppResponseData::ok(page))
3333}
Modified lib/space/src/handlers/list_dir_group_overwrites.rs lib/space/src/handlers/list_dir_group_overwrites.rs +2 −2 View lib/space/src/handlers/list_dir_group_overwrites.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::dir::{DirPath, GroupOverwriteDto};
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 get,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<DirPath>,
2727) -> Result<AppResponseData<Vec<GroupOverwriteDto>>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 let list = service
3030 .list_dir_group_overwrites(uid, &path.space_name, path.dir_id)
3131 .await?;
Modified lib/space/src/handlers/list_dir_user_overwrites.rs lib/space/src/handlers/list_dir_user_overwrites.rs +2 −2 View lib/space/src/handlers/list_dir_user_overwrites.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::dir::{DirPath, UserOverwriteDto};
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 get,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<DirPath>,
2727) -> Result<AppResponseData<Vec<UserOverwriteDto>>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 let list = service
3030 .list_dir_user_overwrites(uid, &path.space_name, path.dir_id)
3131 .await?;
Modified lib/space/src/handlers/list_groups.rs lib/space/src/handlers/list_groups.rs +2 −2 View lib/space/src/handlers/list_groups.rs
@@ -6,7 +6,7 @@
66use crate::services::groups::GroupPage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -27,7 +27,7 @@
2727 Path(path): Path<SpaceNamePath>,
2828 Query(query): Query<PageQuery>,
2929) -> Result<AppResponseData<GroupPage>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 let page = service.list_groups(uid, &path.space_name, query).await?;
3232 Ok(AppResponseData::ok(page))
3333}
Modified lib/space/src/handlers/list_invites.rs lib/space/src/handlers/list_invites.rs +2 −2 View lib/space/src/handlers/list_invites.rs
@@ -6,7 +6,7 @@
66use crate::services::invites::InvitePage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -27,7 +27,7 @@
2727 Path(path): Path<SpaceNamePath>,
2828 Query(query): Query<PageQuery>,
2929) -> Result<AppResponseData<InvitePage>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 let page = service.list_invites(uid, &path.space_name, query).await?;
3232 Ok(AppResponseData::ok(page))
3333}
Modified lib/space/src/handlers/list_join_rules.rs lib/space/src/handlers/list_join_rules.rs +2 −2 View lib/space/src/handlers/list_join_rules.rs
@@ -6,7 +6,7 @@
66use crate::services::join_rules::JoinRuleDto;
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Path(path): Path<SpaceNamePath>,
2828) -> Result<AppResponseData<Vec<JoinRuleDto>>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let rules = service.list_join_rules(uid, &path.space_name).await?;
3131 Ok(AppResponseData::ok(rules))
3232}
Modified lib/space/src/handlers/list_members.rs lib/space/src/handlers/list_members.rs +2 −2 View lib/space/src/handlers/list_members.rs
@@ -6,7 +6,7 @@
66use crate::services::members::MemberPage;
77use crate::services::service::SpaceService;
88use crate::services::spaces::{PageQuery, SpaceNamePath};
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -27,7 +27,7 @@
2727 Path(path): Path<SpaceNamePath>,
2828 Query(query): Query<PageQuery>,
2929) -> Result<AppResponseData<MemberPage>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 let page = service.list_members(uid, &path.space_name, query).await?;
3232 Ok(AppResponseData::ok(page))
3333}
Modified lib/space/src/handlers/list_spaces.rs lib/space/src/handlers/list_spaces.rs +2 −2 View lib/space/src/handlers/list_spaces.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::{PageQuery, SpacePage};
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 get,
@@ -24,7 +24,7 @@
2424 session: Session,
2525 Query(query): Query<PageQuery>,
2626) -> Result<AppResponseData<SpacePage>, ApiError> {
27 let uid = require_uid(&session)?;
27 let uid = session::require_uid(&session)?;
2828 let page = service.list_spaces(uid, query).await?;
2929 Ok(AppResponseData::ok(page))
3030}
Modified lib/space/src/handlers/move_dir_node.rs lib/space/src/handlers/move_dir_node.rs +2 −2 View lib/space/src/handlers/move_dir_node.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::dir::{DirNodeDto, DirPath, MoveDirCmd};
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 patch,
@@ -28,7 +28,7 @@
2828 Path(path): Path<DirPath>,
2929 Json(cmd): Json<MoveDirCmd>,
3030) -> Result<AppResponseData<DirNodeDto>, ApiError> {
31 let uid = require_uid(&session)?;
31 let uid = session::require_uid(&session)?;
3232 let node = service
3333 .move_dir_node(uid, &path.space_name, path.dir_id, cmd)
3434 .await?;
Modified lib/space/src/handlers/reject_invite.rs lib/space/src/handlers/reject_invite.rs +2 −2 View lib/space/src/handlers/reject_invite.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::invites::AcceptInviteCmd;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 post,
@@ -27,7 +27,7 @@
2727 session: Session,
2828 Json(cmd): Json<AcceptInviteCmd>,
2929) -> Result<AppResponseData<NoData>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 service.reject_invite(uid, &cmd.code).await?;
3232 Ok(AppResponseData::empty())
3333}
Modified lib/space/src/handlers/remove_dir_group_overwrite.rs lib/space/src/handlers/remove_dir_group_overwrite.rs +2 −2 View lib/space/src/handlers/remove_dir_group_overwrite.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::handlers::set_dir_group_overwrite::DirGroupPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<DirGroupPath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service
3030 .remove_dir_group_overwrite(uid, &path.space_name, path.dir_id, path.group_id)
3131 .await?;
Modified lib/space/src/handlers/remove_dir_user_overwrite.rs lib/space/src/handlers/remove_dir_user_overwrite.rs +2 −2 View lib/space/src/handlers/remove_dir_user_overwrite.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::handlers::set_dir_user_overwrite::DirUserPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<DirUserPath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service
3030 .remove_dir_user_overwrite(uid, &path.space_name, path.dir_id, path.user_id)
3131 .await?;
Modified lib/space/src/handlers/remove_member.rs lib/space/src/handlers/remove_member.rs +2 −2 View lib/space/src/handlers/remove_member.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Path(path): Path<MemberPath>,
2828) -> Result<AppResponseData<NoData>, ApiError> {
29 let caller = require_uid(&session)?;
29 let caller = session::require_uid(&session)?;
3030 service
3131 .remove_member(caller, &path.space_name, path.user_id)
3232 .await?;
Modified lib/space/src/handlers/repair_dir_parents.rs lib/space/src/handlers/repair_dir_parents.rs +2 −2 View lib/space/src/handlers/repair_dir_parents.rs
@@ -6,7 +6,7 @@
66use crate::services::dir::RepairDirResp;
77use crate::services::service::SpaceService;
88use crate::services::spaces::SpaceNamePath;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -27,7 +27,7 @@
2727 session: Session,
2828 Path(path): Path<SpaceNamePath>,
2929) -> Result<AppResponseData<RepairDirResp>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 let resp = service.repair_dir_parents(uid, &path.space_name).await?;
3232 Ok(AppResponseData::ok(resp))
3333}
Modified lib/space/src/handlers/revoke_invite.rs lib/space/src/handlers/revoke_invite.rs +3 −3 View lib/space/src/handlers/revoke_invite.rs
@@ -1,14 +1,14 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::invites::InviteDto;
1010use crate::services::service::SpaceService;
11use jwt::share::session::require_uid;
11use jwt::share::session;
1212
1313#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1414pub struct InvitePath {
@@ -34,7 +34,7 @@
3434 session: Session,
3535 Path(path): Path<InvitePath>,
3636) -> Result<AppResponseData<InviteDto>, ApiError> {
37 let uid = require_uid(&session)?;
37 let uid = session::require_uid(&session)?;
3838 let invite = service
3939 .revoke_invite(uid, &path.space_name, path.invite_id)
4040 .await?;
Modified lib/space/src/handlers/self_member.rs lib/space/src/handlers/self_member.rs +3 −3 View lib/space/src/handlers/self_member.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::members::{MemberDto, UpdateMemberCmd};
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 patch,
@@ -27,7 +27,7 @@
2727 Path(space_name): Path<String>,
2828 Json(cmd): Json<UpdateMemberCmd>,
2929) -> Result<AppResponseData<MemberDto>, ApiError> {
30 let caller = require_uid(&session)?;
30 let caller = session::require_uid(&session)?;
3131 let member = service
3232 .update_member(caller, &space_name, caller, cmd)
3333 .await?;
@@ -52,7 +52,7 @@
5252 session: Session,
5353 Path(space_name): Path<String>,
5454) -> Result<AppResponseData<NoData>, ApiError> {
55 let caller = require_uid(&session)?;
55 let caller = session::require_uid(&session)?;
5656 service.leave_space(caller, &space_name).await?;
5757 Ok(AppResponseData::empty())
5858}
Modified lib/space/src/handlers/set_dir_group_overwrite.rs lib/space/src/handlers/set_dir_group_overwrite.rs +3 −3 View lib/space/src/handlers/set_dir_group_overwrite.rs
@@ -1,14 +1,14 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::dir::{GroupOverwriteDto, SetOverwriteCmd};
1010use crate::services::service::SpaceService;
11use jwt::share::session::require_uid;
11use jwt::share::session;
1212
1313#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1414pub struct DirGroupPath {
@@ -38,7 +38,7 @@
3838 Path(path): Path<DirGroupPath>,
3939 Json(cmd): Json<SetOverwriteCmd>,
4040) -> Result<AppResponseData<GroupOverwriteDto>, ApiError> {
41 let uid = require_uid(&session)?;
41 let uid = session::require_uid(&session)?;
4242 let dto = service
4343 .set_dir_group_overwrite(uid, &path.space_name, path.dir_id, path.group_id, cmd)
4444 .await?;
Modified lib/space/src/handlers/set_dir_user_overwrite.rs lib/space/src/handlers/set_dir_user_overwrite.rs +3 −3 View lib/space/src/handlers/set_dir_user_overwrite.rs
@@ -1,14 +1,14 @@
11use axum::extract::{Json, Path, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::dir::{SetOverwriteCmd, UserOverwriteDto};
1010use crate::services::service::SpaceService;
11use jwt::share::session::require_uid;
11use jwt::share::session;
1212
1313#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1414pub struct DirUserPath {
@@ -38,7 +38,7 @@
3838 Path(path): Path<DirUserPath>,
3939 Json(cmd): Json<SetOverwriteCmd>,
4040) -> Result<AppResponseData<UserOverwriteDto>, ApiError> {
41 let uid = require_uid(&session)?;
41 let uid = session::require_uid(&session)?;
4242 let dto = service
4343 .set_dir_user_overwrite(uid, &path.space_name, path.dir_id, path.user_id, cmd)
4444 .await?;
Modified lib/space/src/handlers/unassign_group.rs lib/space/src/handlers/unassign_group.rs +3 −3 View lib/space/src/handlers/unassign_group.rs
@@ -1,13 +1,13 @@
11use axum::extract::{Path, State};
22use export::rest::{AppResponseData, NoData};
3use jwt::Session;
34use serde::Deserialize;
4use jwt::Session;
55use utoipa::{IntoParams, ToSchema};
66use uuid::Uuid;
77
88use crate::errors::ApiError;
99use crate::services::service::SpaceService;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
1313pub struct MemberGroupPath {
@@ -34,7 +34,7 @@
3434 session: Session,
3535 Path(path): Path<MemberGroupPath>,
3636) -> Result<AppResponseData<NoData>, ApiError> {
37 let caller = require_uid(&session)?;
37 let caller = session::require_uid(&session)?;
3838 service
3939 .unassign_group(caller, &path.space_name, path.user_id, path.group_id)
4040 .await?;
Modified lib/space/src/handlers/unban_user.rs lib/space/src/handlers/unban_user.rs +2 −2 View lib/space/src/handlers/unban_user.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::handlers::get_member::MemberPath;
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(path): Path<MemberPath>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let caller = require_uid(&session)?;
28 let caller = session::require_uid(&session)?;
2929 service
3030 .unban_user(caller, &path.space_name, path.user_id)
3131 .await?;
Modified lib/space/src/handlers/update_ban.rs lib/space/src/handlers/update_ban.rs +2 −2 View lib/space/src/handlers/update_ban.rs
@@ -6,7 +6,7 @@
66use crate::handlers::get_member::MemberPath;
77use crate::services::bans::{BanDto, UpdateBanCmd};
88use crate::services::service::SpaceService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 patch,
@@ -29,7 +29,7 @@
2929 Path(path): Path<MemberPath>,
3030 Json(cmd): Json<UpdateBanCmd>,
3131) -> Result<AppResponseData<BanDto>, ApiError> {
32 let caller = require_uid(&session)?;
32 let caller = session::require_uid(&session)?;
3333 let ban = service
3434 .update_ban(caller, &path.space_name, path.user_id, cmd)
3535 .await?;
Modified lib/space/src/handlers/update_dir_node.rs lib/space/src/handlers/update_dir_node.rs +2 −2 View lib/space/src/handlers/update_dir_node.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::dir::{DirNodeDto, DirPath, UpdateDirCmd};
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 patch,
@@ -28,7 +28,7 @@
2828 Path(path): Path<DirPath>,
2929 Json(cmd): Json<UpdateDirCmd>,
3030) -> Result<AppResponseData<DirNodeDto>, ApiError> {
31 let uid = require_uid(&session)?;
31 let uid = session::require_uid(&session)?;
3232 let node = service
3333 .update_dir_node(uid, &path.space_name, path.dir_id, cmd)
3434 .await?;
Modified lib/space/src/handlers/update_group.rs lib/space/src/handlers/update_group.rs +2 −2 View lib/space/src/handlers/update_group.rs
@@ -6,7 +6,7 @@
66use crate::handlers::get_group::GroupPath;
77use crate::services::groups::{GroupDto, UpdateGroupCmd};
88use crate::services::service::SpaceService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 patch,
@@ -30,7 +30,7 @@
3030 Path(path): Path<GroupPath>,
3131 Json(cmd): Json<UpdateGroupCmd>,
3232) -> Result<AppResponseData<GroupDto>, ApiError> {
33 let uid = require_uid(&session)?;
33 let uid = session::require_uid(&session)?;
3434 let group = service
3535 .update_group(uid, &path.space_name, path.group_id, cmd)
3636 .await?;
Modified lib/space/src/handlers/update_join_rule.rs lib/space/src/handlers/update_join_rule.rs +2 −2 View lib/space/src/handlers/update_join_rule.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::join_rules::{JoinRuleDto, JoinRulePath, UpdateJoinRuleCmd};
77use crate::services::service::SpaceService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 patch,
@@ -29,7 +29,7 @@
2929 Path(path): Path<JoinRulePath>,
3030 Json(cmd): Json<UpdateJoinRuleCmd>,
3131) -> Result<AppResponseData<JoinRuleDto>, ApiError> {
32 let uid = require_uid(&session)?;
32 let uid = session::require_uid(&session)?;
3333 let dto = service
3434 .update_join_rule(uid, &path.space_name, path.rule_id, cmd)
3535 .await?;
Modified lib/space/src/handlers/update_member.rs lib/space/src/handlers/update_member.rs +2 −2 View lib/space/src/handlers/update_member.rs
@@ -6,7 +6,7 @@
66use crate::handlers::get_member::MemberPath;
77use crate::services::members::{MemberDto, UpdateMemberCmd};
88use crate::services::service::SpaceService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 patch,
@@ -29,7 +29,7 @@
2929 Path(path): Path<MemberPath>,
3030 Json(cmd): Json<UpdateMemberCmd>,
3131) -> Result<AppResponseData<MemberDto>, ApiError> {
32 let caller = require_uid(&session)?;
32 let caller = session::require_uid(&session)?;
3333 let member = service
3434 .update_member(caller, &path.space_name, path.user_id, cmd)
3535 .await?;
Modified lib/space/src/handlers/update_space.rs lib/space/src/handlers/update_space.rs +2 −2 View lib/space/src/handlers/update_space.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::service::SpaceService;
77use crate::services::spaces::{SpaceDto, SpaceNamePath, UpdateSpaceCmd};
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 patch,
@@ -29,7 +29,7 @@
2929 Path(path): Path<SpaceNamePath>,
3030 Json(cmd): Json<UpdateSpaceCmd>,
3131) -> Result<AppResponseData<SpaceDto>, ApiError> {
32 let uid = require_uid(&session)?;
32 let uid = session::require_uid(&session)?;
3333 let space = service.update_space(uid, &path.space_name, cmd).await?;
3434 Ok(AppResponseData::ok(space))
3535}
Modified lib/space/src/handlers/upload_space_image.rs lib/space/src/handlers/upload_space_image.rs +2 −2 View lib/space/src/handlers/upload_space_image.rs
@@ -8,7 +8,7 @@
88use crate::errors::ApiError;
99use crate::services::images::{SpaceImageDto, SpaceImageKindPath, SpaceImageUploadQuery};
1010use crate::services::service::SpaceService;
11use jwt::share::session::require_uid;
11use jwt::share::session;
1212
1313#[utoipa::path(
1414 put,
@@ -37,7 +37,7 @@
3737 headers: HeaderMap,
3838 body: Bytes,
3939) -> Result<AppResponseData<SpaceImageDto>, ApiError> {
40 let uid = require_uid(&session)?;
40 let uid = session::require_uid(&session)?;
4141 let content_type = headers
4242 .get(CONTENT_TYPE)
4343 .and_then(|v| v.to_str().ok())
Modified lib/space/src/services/bans.rs lib/space/src/services/bans.rs +7 −10 View lib/space/src/services/bans.rs
@@ -1,9 +1,6 @@
11use std::collections::HashMap;
22
3use models::space::space_bans;
4use models::space::space_member_groups;
5use models::space::space_members::{self, MemberStatus};
6use models::space::spaces;
3use models::space::{space_bans, space_member_groups};
74use models::users::user;
85use sea_orm::{
96 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
@@ -18,7 +15,7 @@
1815use crate::services::service::SpaceService;
1916use crate::services::spaces::{PageQuery, UserDto};
2017use crate::share::authz::{MANAGE_BANS, require_perm};
21use crate::share::lookup::lookup_space_by_name;
18use crate::share::lookup;
2219
2320#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
2421pub struct BanDto {
@@ -86,7 +83,7 @@
8683 space_name: &str,
8784 cmd: BanUserCmd,
8885 ) -> Result<BanDto, SpaceError> {
89 let space = lookup_space_by_name(self, caller, space_name).await?;
86 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
9087 require_perm(self, &space, caller, MANAGE_BANS).await?;
9188
9289 user::Entity::find_by_id(cmd.user_id)
@@ -192,7 +189,7 @@
192189 space_name: &str,
193190 uid: i64,
194191 ) -> Result<BanDto, SpaceError> {
195 let space = lookup_space_by_name(self, caller, space_name).await?;
192 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
196193 require_perm(self, &space, caller, MANAGE_BANS).await?;
197194
198195 let ban = space_bans::Entity::find_by_id((space.id, uid))
@@ -227,7 +224,7 @@
227224 uid: i64,
228225 cmd: UpdateBanCmd,
229226 ) -> Result<BanDto, SpaceError> {
230 let space = lookup_space_by_name(self, caller, space_name).await?;
227 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
231228 require_perm(self, &space, caller, MANAGE_BANS).await?;
232229
233230 let ban = space_bans::Entity::find_by_id((space.id, uid))
@@ -303,7 +300,7 @@
303300 space_name: &str,
304301 uid: i64,
305302 ) -> Result<(), SpaceError> {
306 let space = lookup_space_by_name(self, caller, space_name).await?;
303 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
307304 require_perm(self, &space, caller, MANAGE_BANS).await?;
308305
309306 let client = self
@@ -330,7 +327,7 @@
330327 space_name: &str,
331328 q: PageQuery,
332329 ) -> Result<BanPage, SpaceError> {
333 let space = lookup_space_by_name(self, caller, space_name).await?;
330 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
334331 require_perm(self, &space, caller, MANAGE_BANS).await?;
335332
336333 let max_pagination = self.config().space.max_pagination;
Modified lib/space/src/services/dir.rs lib/space/src/services/dir.rs +14 −17 View lib/space/src/services/dir.rs
@@ -1,11 +1,8 @@
11use std::collections::{HashMap, HashSet};
22
3use models::dir::dir_overwrite_group;
4use models::dir::dir_overwrite_users;
53use models::dir::dirs::{self, DirKind};
6use models::space::space_groups;
7use models::space::space_member_groups;
8use models::space::space_members::{self, MemberStatus};
4use models::dir::{dir_overwrite_group, dir_overwrite_users};
5use models::space::{space_groups, space_member_groups};
96use sea_orm::{
107 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder, Set,
118 TransactionTrait,
@@ -22,7 +19,7 @@
2219use crate::share::authz::{
2320 MANAGE_CHANNELS, MANAGE_OVERWRITES, effective_permissions, require_perm,
2421};
25use crate::share::lookup::lookup_space_by_name;
22use crate::share::lookup;
2623
2724pub const MAX_DIR_NODE_NAME: usize = 255;
2825pub const PERM_DIR_VISIBLE: i64 = 1 << 0;
@@ -180,7 +177,7 @@
180177 space_name: &str,
181178 cmd: CreateDirCmd,
182179 ) -> Result<DirNodeDto, SpaceError> {
183 let space = lookup_space_by_name(self, caller, space_name).await?;
180 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
184181 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
185182
186183 let name = cmd.name.trim();
@@ -249,7 +246,7 @@
249246 space_name: &str,
250247 parent_id: Option<Uuid>,
251248 ) -> Result<Vec<DirNodeDto>, SpaceError> {
252 let space = lookup_space_by_name(self, caller, space_name).await?;
249 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
253250 let perms = effective_permissions(&self.state, &space, caller).await?;
254251
255252 let can_manage = perms.has(MANAGE_CHANNELS);
@@ -412,7 +409,7 @@
412409 dir_id: Uuid,
413410 cmd: UpdateDirCmd,
414411 ) -> Result<DirNodeDto, SpaceError> {
415 let space = lookup_space_by_name(self, caller, space_name).await?;
412 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
416413 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
417414
418415 let node: dirs::Model = self.dir_in_space(space.id, dir_id).await?;
@@ -440,7 +437,7 @@
440437 dir_id: Uuid,
441438 cmd: MoveDirCmd,
442439 ) -> Result<DirNodeDto, SpaceError> {
443 let space = lookup_space_by_name(self, caller, space_name).await?;
440 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
444441 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
445442
446443 let node = self.dir_in_space(space.id, dir_id).await?;
@@ -515,7 +512,7 @@
515512 caller: i64,
516513 space_name: &str,
517514 ) -> Result<RepairDirResp, SpaceError> {
518 let space = lookup_space_by_name(self, caller, space_name).await?;
515 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
519516 if space.owner_id != caller {
520517 return Err(SpaceError::Forbidden);
521518 }
@@ -605,7 +602,7 @@
605602 space_name: &str,
606603 dir_id: Uuid,
607604 ) -> Result<Vec<GroupOverwriteDto>, SpaceError> {
608 let space = lookup_space_by_name(self, caller, space_name).await?;
605 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
609606 require_perm(self, &space, caller, MANAGE_OVERWRITES).await?;
610607 self.dir_in_space(space.id, dir_id).await?;
611608
@@ -634,7 +631,7 @@
634631 group_id: Uuid,
635632 cmd: SetOverwriteCmd,
636633 ) -> Result<GroupOverwriteDto, SpaceError> {
637 let space = lookup_space_by_name(self, caller, space_name).await?;
634 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
638635 require_perm(self, &space, caller, MANAGE_OVERWRITES).await?;
639636 self.dir_in_space(space.id, dir_id).await?;
640637
@@ -690,7 +687,7 @@
690687 dir_id: Uuid,
691688 group_id: Uuid,
692689 ) -> Result<(), SpaceError> {
693 let space = lookup_space_by_name(self, caller, space_name).await?;
690 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
694691 require_perm(self, &space, caller, MANAGE_OVERWRITES).await?;
695692 self.dir_in_space(space.id, dir_id).await?;
696693
@@ -712,7 +709,7 @@
712709 space_name: &str,
713710 dir_id: Uuid,
714711 ) -> Result<Vec<UserOverwriteDto>, SpaceError> {
715 let space = lookup_space_by_name(self, caller, space_name).await?;
712 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
716713 require_perm(self, &space, caller, MANAGE_OVERWRITES).await?;
717714 self.dir_in_space(space.id, dir_id).await?;
718715
@@ -748,7 +745,7 @@
748745 user_id: i64,
749746 cmd: SetOverwriteCmd,
750747 ) -> Result<UserOverwriteDto, SpaceError> {
751 let space = lookup_space_by_name(self, caller, space_name).await?;
748 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
752749 require_perm(self, &space, caller, MANAGE_OVERWRITES).await?;
753750 self.dir_in_space(space.id, dir_id).await?;
754751
@@ -809,7 +806,7 @@
809806 dir_id: Uuid,
810807 user_id: i64,
811808 ) -> Result<(), SpaceError> {
812 let space = lookup_space_by_name(self, caller, space_name).await?;
809 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
813810 require_perm(self, &space, caller, MANAGE_OVERWRITES).await?;
814811 self.dir_in_space(space.id, dir_id).await?;
815812
Modified lib/space/src/services/groups.rs lib/space/src/services/groups.rs +11 −14 View lib/space/src/services/groups.rs
@@ -1,9 +1,6 @@
11use std::collections::HashMap;
22
3use models::space::space_group_permissions;
4use models::space::space_groups;
5use models::space::space_member_groups;
6use models::space::space_members;
3use models::space::{space_group_permissions, space_groups, space_member_groups};
74use sea_orm::{
85 ActiveModelTrait, ColumnTrait, ConnectionTrait, EntityTrait, PaginatorTrait, QueryFilter,
96 QueryOrder, QuerySelect, Set, TransactionTrait,
@@ -20,7 +17,7 @@
2017use crate::share::authz::{
2118 ALL_PERMISSIONS, MANAGE_ROLES, VIEW_SPACE, effective_permissions, require_perm,
2219};
23use crate::share::lookup::lookup_space_by_name;
20use crate::share::lookup;
2421
2522#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
2623pub struct GroupDto {
@@ -152,7 +149,7 @@
152149 space_name: &str,
153150 cmd: CreateGroupCmd,
154151 ) -> Result<GroupDto, SpaceError> {
155 let space = lookup_space_by_name(self, caller, space_name).await?;
152 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
156153 require_perm(self, &space, caller, MANAGE_ROLES).await?;
157154
158155 let name = cmd.name.trim();
@@ -248,7 +245,7 @@
248245 space_name: &str,
249246 group_id: Uuid,
250247 ) -> Result<GroupDto, SpaceError> {
251 let space = lookup_space_by_name(self, caller.unwrap_or(0), space_name).await?;
248 let space = lookup::lookup_space_by_name(self, caller.unwrap_or(0), space_name).await?;
252249 if !space.is_active {
253250 return Err(SpaceError::NotFound);
254251 }
@@ -303,7 +300,7 @@
303300 group_id: Uuid,
304301 cmd: UpdateGroupCmd,
305302 ) -> Result<GroupDto, SpaceError> {
306 let space = lookup_space_by_name(self, caller, space_name).await?;
303 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
307304 require_perm(self, &space, caller, MANAGE_ROLES).await?;
308305
309306 let group = space_groups::Entity::find_by_id(group_id)
@@ -440,7 +437,7 @@
440437 space_name: &str,
441438 group_id: Uuid,
442439 ) -> Result<(), SpaceError> {
443 let space = lookup_space_by_name(self, caller, space_name).await?;
440 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
444441 require_perm(self, &space, caller, MANAGE_ROLES).await?;
445442
446443 let group = space_groups::Entity::find_by_id(group_id)
@@ -490,7 +487,7 @@
490487 space_name: &str,
491488 q: PageQuery,
492489 ) -> Result<GroupPage, SpaceError> {
493 let space = lookup_space_by_name(self, caller, space_name).await?;
490 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
494491 require_perm(self, &space, caller, MANAGE_ROLES).await?;
495492
496493 let max_pagination = self.config().space.max_pagination;
@@ -568,7 +565,7 @@
568565 uid: i64,
569566 cmd: AssignGroupCmd,
570567 ) -> Result<(), SpaceError> {
571 let space = lookup_space_by_name(self, caller, space_name).await?;
568 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
572569 require_perm(self, &space, caller, MANAGE_ROLES).await?;
573570
574571 space_groups::Entity::find_by_id(cmd.group_id)
@@ -614,7 +611,7 @@
614611 uid: i64,
615612 group_id: Uuid,
616613 ) -> Result<(), SpaceError> {
617 let space = lookup_space_by_name(self, caller, space_name).await?;
614 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
618615 require_perm(self, &space, caller, MANAGE_ROLES).await?;
619616
620617 let client = self
@@ -642,7 +639,7 @@
642639 space_name: &str,
643640 group_id: Uuid,
644641 ) -> Result<(), SpaceError> {
645 let space = lookup_space_by_name(self, caller, space_name).await?;
642 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
646643 effective_permissions(&self.state, &space, caller).await?;
647644
648645 if !self.config().space.allow_self_join_groups {
@@ -689,7 +686,7 @@
689686 space_name: &str,
690687 group_id: Uuid,
691688 ) -> Result<(), SpaceError> {
692 let space = lookup_space_by_name(self, caller, space_name).await?;
689 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
693690 effective_permissions(&self.state, &space, caller).await?;
694691
695692 let client = self
Modified lib/space/src/services/images.rs lib/space/src/services/images.rs +4 −5 View lib/space/src/services/images.rs
@@ -1,7 +1,6 @@
11use imaging::layout::{ImageVariant, PreviewState};
22use imaging::preset::PreviewPreset;
33use models::space::spaces;
4use sea_orm::{ActiveModelTrait, Set};
54use serde::{Deserialize, Serialize};
65use time::OffsetDateTime;
76use utoipa::{IntoParams, ToSchema};
@@ -10,7 +9,7 @@
109use crate::errors::SpaceError;
1110use crate::services::service::SpaceService;
1211use crate::share::authz::{MANAGE_CHANNELS, effective_permissions, require_perm};
13use crate::share::lookup::lookup_space_by_name;
12use crate::share::lookup;
1413
1514pub const MAX_SPACE_IMAGE_BYTES: usize = 5 * 1024 * 1024;
1615pub const SPACE_IMAGE_PREFIX: &str = "space-images";
@@ -389,7 +388,7 @@
389388 caller: Option<i64>,
390389 space_name: &str,
391390 ) -> Result<spaces::Model, SpaceError> {
392 let space = lookup_space_by_name(self, caller.unwrap_or(0), space_name).await?;
391 let space = lookup::lookup_space_by_name(self, caller.unwrap_or(0), space_name).await?;
393392 if !space.is_active {
394393 return Err(SpaceError::NotFound);
395394 }
@@ -417,7 +416,7 @@
417416 dims: SpaceImageUploadQuery,
418417 ) -> Result<SpaceImageDto, SpaceError> {
419418 let SpaceImageUploadQuery { width, height } = dims;
420 let space = lookup_space_by_name(self, caller, space_name).await?;
419 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
421420 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
422421
423422 let fmt = AvatarFormat::from_content_type(content_type).ok_or_else(|| {
@@ -532,7 +531,7 @@
532531 space_name: &str,
533532 kind: SpaceImageKind,
534533 ) -> Result<(), SpaceError> {
535 let space = lookup_space_by_name(self, caller, space_name).await?;
534 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
536535 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
537536
538537 let space_id = space.id;
Modified lib/space/src/services/invites.rs lib/space/src/services/invites.rs +8 −12 View lib/space/src/services/invites.rs
@@ -1,13 +1,9 @@
11use std::collections::HashMap;
22
3use models::space::space_group_permissions;
4use models::space::space_groups;
5use models::space::space_invite;
6use models::space::space_invite_groups;
7use models::space::space_member_groups;
8use models::space::space_members::{self, MemberStatus, MessageNotifications};
9use models::space::spaces;
10use models::users::user;
3use models::space::space_members::MemberStatus;
4use models::space::{
5 space_group_permissions, space_groups, space_invite, space_invite_groups, space_member_groups,
6};
117use models::users::user_notifications;
128use models::users::user_notifications::NotificationType;
139use sea_orm::sea_query::Expr;
@@ -24,7 +20,7 @@
2420use crate::services::service::SpaceService;
2521use crate::services::spaces::{PageQuery, UserDto};
2622use crate::share::authz::{MANAGE_INVITES, assert_not_banned, effective_permissions, require_perm};
27use crate::share::lookup::lookup_space_by_name;
23use crate::share::lookup;
2824
2925#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
3026pub struct InviteDto {
@@ -90,7 +86,7 @@
9086 space_name: &str,
9187 cmd: CreateInviteCmd,
9288 ) -> Result<InviteDto, SpaceError> {
93 let space = lookup_space_by_name(self, caller, space_name).await?;
89 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
9490 require_perm(self, &space, caller, MANAGE_INVITES).await?;
9591
9692 let email_norm = cmd
@@ -342,7 +338,7 @@
342338 space_name: &str,
343339 invite_id: Uuid,
344340 ) -> Result<InviteDto, SpaceError> {
345 let space = lookup_space_by_name(self, caller, space_name).await?;
341 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
346342 require_perm(self, &space, caller, MANAGE_INVITES).await?;
347343
348344 let invite = space_invite::Entity::find_by_id(invite_id)
@@ -569,7 +565,7 @@
569565 space_name: &str,
570566 q: PageQuery,
571567 ) -> Result<InvitePage, SpaceError> {
572 let space = lookup_space_by_name(self, caller, space_name).await?;
568 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
573569 require_perm(self, &space, caller, MANAGE_INVITES).await?;
574570
575571 let max_pagination = self.config().space.max_pagination;
Modified lib/space/src/services/join_requests.rs lib/space/src/services/join_requests.rs +9 −11 View lib/space/src/services/join_requests.rs
@@ -1,15 +1,13 @@
11use std::collections::{HashMap, HashSet};
22
3use models::space::space_group_permissions;
43use models::space::space_join_request::{self, SpaceJoinRequestStatus};
5use models::space::space_member_groups;
6use models::space::space_members::{self, MemberStatus};
4use models::space::space_members::MemberStatus;
75use models::space::spaces::{self, AllowJoinLevel};
8use models::users::user;
6use models::space::{space_group_permissions, space_member_groups};
97use models::users::user_notifications::{self, NotificationType};
108use sea_orm::sea_query::Expr;
119use sea_orm::{
12 ActiveModelTrait, ColumnTrait, Condition, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
10 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder,
1311 QuerySelect, Set, TransactionTrait,
1412};
1513use serde::{Deserialize, Serialize};
@@ -21,7 +19,7 @@
2119use crate::services::service::SpaceService;
2220use crate::services::spaces::{UserDto, resolve_space_image_url};
2321use crate::share::authz::{MANAGE_MEMBERS, assert_not_banned, require_perm};
24use crate::share::lookup::lookup_space_by_name;
22use crate::share::lookup;
2523
2624pub const MAX_JOIN_REQUEST_NOTE_LEN: usize = 512;
2725
@@ -364,7 +362,7 @@
364362 "join request quota exceeded, retry tomorrow".to_string(),
365363 ));
366364 }
367 let space = lookup_space_by_name(self, caller, space_name).await?;
365 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
368366 if space.is_private || !space.allow_join {
369367 return Err(SpaceError::JoinNotAllowed(
370368 "this space does not accept join requests".to_string(),
@@ -497,7 +495,7 @@
497495 space_name: &str,
498496 request_id: Uuid,
499497 ) -> Result<(), SpaceError> {
500 let space = lookup_space_by_name(self, caller, space_name).await?;
498 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
501499 let request = space_join_request::Entity::find_by_id(request_id)
502500 .filter(space_join_request::Column::SpaceId.eq(space.id))
503501 .one(self.db().read())
@@ -549,7 +547,7 @@
549547 space_name: &str,
550548 query: ListJoinRequestsQuery,
551549 ) -> Result<JoinRequestPage, SpaceError> {
552 let space = lookup_space_by_name(self, caller, space_name).await?;
550 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
553551 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
554552
555553 let max_pagination = self.config().space.max_pagination;
@@ -599,7 +597,7 @@
599597 request_id: Uuid,
600598 approve: bool,
601599 ) -> Result<JoinRequestDto, SpaceError> {
602 let space = lookup_space_by_name(self, caller, space_name).await?;
600 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
603601 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
604602
605603 let request = space_join_request::Entity::find_by_id(request_id)
@@ -627,7 +625,7 @@
627625 .kenauth
628626 .as_ref()
629627 .ok_or_else(|| SpaceError::Internal("kenoauth is not configured".to_string()))?;
630 let decided_member = if approve {
628 let _decided_member = if approve {
631629 let (_, member) = client
632630 .approve_join_request(caller, &space.id.to_string(), &request_id.to_string())
633631 .await?;
Modified lib/space/src/services/join_rules.rs lib/space/src/services/join_rules.rs +8 −12 View lib/space/src/services/join_rules.rs
@@ -1,21 +1,17 @@
1use sea_orm::{
2 ActiveModelTrait, ColumnTrait, Condition, ConnectionTrait, EntityTrait, QueryFilter, Set,
3};
1use sea_orm::{ActiveModelTrait, ColumnTrait, Condition, EntityTrait, QueryFilter, Set};
42use serde::{Deserialize, Serialize};
53use time::OffsetDateTime;
64use utoipa::{IntoParams, ToSchema};
75use uuid::Uuid;
86
9use models::space::space_bans;
10use models::space::space_groups;
117use models::space::space_join_rule::{self, SpaceJoinTrigger};
12use models::space::space_member_groups;
13use models::space::space_members::{self, MemberStatus};
8use models::space::space_members::MemberStatus;
9use models::space::{space_bans, space_groups, space_member_groups};
1410
1511use crate::errors::{SpaceError, is_unique_violation};
1612use crate::services::service::SpaceService;
1713use crate::share::authz::{MANAGE_ROLES, effective_permissions, require_perm};
18use crate::share::lookup::lookup_space_by_name;
14use crate::share::lookup;
1915
2016pub const MAX_JOIN_RULE_MATCHER_LEN: usize = 64;
2117
@@ -184,7 +180,7 @@
184180 space_name: &str,
185181 cmd: CreateJoinRuleCmd,
186182 ) -> Result<JoinRuleDto, SpaceError> {
187 let space = lookup_space_by_name(self, caller, space_name).await?;
183 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
188184 require_perm(self, &space, caller, MANAGE_ROLES).await?;
189185 let matcher = normalize_matcher(&cmd.matcher)?;
190186
@@ -234,7 +230,7 @@
234230 rule_id: Uuid,
235231 cmd: UpdateJoinRuleCmd,
236232 ) -> Result<JoinRuleDto, SpaceError> {
237 let space = lookup_space_by_name(self, caller, space_name).await?;
233 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
238234 require_perm(self, &space, caller, MANAGE_ROLES).await?;
239235 let Some(row) = space_join_rule::Entity::find_by_id(rule_id)
240236 .filter(space_join_rule::Column::SpaceId.eq(space.id))
@@ -285,7 +281,7 @@
285281 space_name: &str,
286282 rule_id: Uuid,
287283 ) -> Result<(), SpaceError> {
288 let space = lookup_space_by_name(self, caller, space_name).await?;
284 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
289285 require_perm(self, &space, caller, MANAGE_ROLES).await?;
290286 let client = self
291287 .state
@@ -312,7 +308,7 @@
312308 caller: i64,
313309 space_name: &str,
314310 ) -> Result<Vec<JoinRuleDto>, SpaceError> {
315 let space = lookup_space_by_name(self, caller, space_name).await?;
311 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
316312 effective_permissions(&self.state, &space, caller).await?;
317313 let rows = space_join_rule::Entity::find()
318314 .filter(space_join_rule::Column::SpaceId.eq(space.id))
Modified lib/space/src/services/members.rs lib/space/src/services/members.rs +8 −14 View lib/space/src/services/members.rs
@@ -2,13 +2,7 @@
22
33use models::space::space_member_groups;
44use models::space::space_members::{self, MemberStatus, MessageNotifications};
5use models::space::spaces;
6use models::users::user;
7use sea_orm::sea_query::Expr;
8use sea_orm::{
9 ActiveModelTrait, ColumnTrait, ConnectionTrait, EntityTrait, PaginatorTrait, QueryFilter,
10 QueryOrder, QuerySelect, Set, TransactionTrait,
11};
5use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set};
126use serde::{Deserialize, Serialize};
137use time::OffsetDateTime;
148use utoipa::ToSchema;
@@ -19,7 +13,7 @@
1913use crate::services::service::SpaceService;
2014use crate::services::spaces::{PageQuery, UserDto};
2115use crate::share::authz::{MANAGE_MEMBERS, assert_not_banned, require_perm};
22use crate::share::lookup::lookup_space_by_name;
16use crate::share::lookup;
2317
2418#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
2519pub struct MemberDto {
@@ -180,7 +174,7 @@
180174 space_name: &str,
181175 cmd: AddMemberCmd,
182176 ) -> Result<MemberDto, SpaceError> {
183 let space = lookup_space_by_name(self, caller, space_name).await?;
177 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
184178 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
185179
186180 assert_not_banned(&self.state, space.id, cmd.user_id).await?;
@@ -250,7 +244,7 @@
250244 space_name: &str,
251245 uid: i64,
252246 ) -> Result<MemberDto, SpaceError> {
253 let space = lookup_space_by_name(self, caller, space_name).await?;
247 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
254248 if caller != uid {
255249 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
256250 }
@@ -275,7 +269,7 @@
275269 uid: i64,
276270 cmd: UpdateMemberCmd,
277271 ) -> Result<MemberDto, SpaceError> {
278 let space = lookup_space_by_name(self, caller, space_name).await?;
272 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
279273 if caller != uid {
280274 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
281275 }
@@ -323,7 +317,7 @@
323317
324318 #[tracing::instrument(name = "space.leave_space", skip_all, fields(caller = %caller, space = %space_name))]
325319 pub async fn leave_space(&self, caller: i64, space_name: &str) -> Result<(), SpaceError> {
326 let space = lookup_space_by_name(self, caller, space_name).await?;
320 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
327321 if space.owner_id == caller {
328322 return Err(SpaceError::BadRequest(
329323 "space owner cannot leave; delete the space instead".to_string(),
@@ -352,7 +346,7 @@
352346 space_name: &str,
353347 uid: i64,
354348 ) -> Result<(), SpaceError> {
355 let space = lookup_space_by_name(self, caller, space_name).await?;
349 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
356350 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
357351 if caller == uid {
358352 return Err(SpaceError::BadRequest(
@@ -384,7 +378,7 @@
384378 space_name: &str,
385379 q: PageQuery,
386380 ) -> Result<MemberPage, SpaceError> {
387 let space = lookup_space_by_name(self, caller, space_name).await?;
381 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
388382 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
389383
390384 let max_pagination = self.config().space.max_pagination;
Modified lib/space/src/services/rooms.rs lib/space/src/services/rooms.rs +2 −4 View lib/space/src/services/rooms.rs
@@ -1,7 +1,5 @@
11use models::room::room_members;
22use models::room::rooms::{self, RoomKind};
3use models::space::space_members::{self, MemberStatus};
4use models::space::spaces;
53use sea_orm::{
64 ActiveModelTrait, ColumnTrait, EntityTrait, ExprTrait, QueryFilter, QuerySelect, Set,
75 TransactionTrait,
@@ -15,7 +13,7 @@
1513use crate::errors::SpaceError;
1614use crate::services::service::SpaceService;
1715use crate::share::authz::{MANAGE_CHANNELS, require_perm};
18use crate::share::lookup::lookup_space_by_name;
16use crate::share::lookup;
1917
2018#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
2119pub struct CreateRoomCmd {
@@ -106,7 +104,7 @@
106104 "room creation quota exceeded, retry tomorrow".to_string(),
107105 ));
108106 }
109 let space = lookup_space_by_name(self, caller, space_name).await?;
107 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
110108 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
111109 if !space.is_active {
112110 return Err(SpaceError::NotFound);
Modified lib/space/src/services/service.rs lib/space/src/services/service.rs +0 −1 View lib/space/src/services/service.rs
@@ -3,7 +3,6 @@
33use config::AppConfig;
44use export::{AppDatabase, AppState, AppStorage};
55
6
76use crate::errors::SpaceError;
87
98#[derive(Clone)]
Modified lib/space/src/services/spaces.rs lib/space/src/services/spaces.rs +4 −7 View lib/space/src/services/spaces.rs
@@ -1,8 +1,6 @@
11use std::collections::HashMap;
22
33use models::space::spaces::{self, AllowJoinLevel};
4use models::users::user;
5use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
64use serde::{Deserialize, Serialize};
75use time::OffsetDateTime;
86use utoipa::{IntoParams, ToSchema};
@@ -11,8 +9,7 @@
119use crate::authority;
1210use crate::errors::SpaceError;
1311use crate::services::service::SpaceService;
14use crate::share::authz::effective_permissions;
15use crate::share::lookup::lookup_space_by_name;
12use crate::share::{authz, lookup};
1613
1714fn default_true() -> bool {
1815 true
@@ -282,7 +279,7 @@
282279 space_name: &str,
283280 ) -> Result<SpaceDto, SpaceError> {
284281 let actor = caller.unwrap_or(0);
285 let space = lookup_space_by_name(self, actor, space_name).await?;
282 let space = lookup::lookup_space_by_name(self, actor, space_name).await?;
286283 if !space.is_active {
287284 return Err(SpaceError::NotFound);
288285 }
@@ -291,7 +288,7 @@
291288 let Some(uid) = caller else {
292289 return Err(SpaceError::NotFound);
293290 };
294 match effective_permissions(&self.state, &space, uid).await {
291 match authz::effective_permissions(&self.state, &space, uid).await {
295292 Ok(_) => {}
296293 Err(SpaceError::Forbidden) => return Err(SpaceError::NotFound),
297294 Err(e) => return Err(e),
@@ -311,7 +308,7 @@
311308 space_name: &str,
312309 cmd: UpdateSpaceCmd,
313310 ) -> Result<SpaceDto, SpaceError> {
314 let space = lookup_space_by_name(self, caller, space_name).await?;
311 let space = lookup::lookup_space_by_name(self, caller, space_name).await?;
315312 if space.owner_id != caller {
316313 return Err(SpaceError::Forbidden);
317314 }
Modified lib/space/src/share/dir_visibility.rs lib/space/src/share/dir_visibility.rs +3 −7 View lib/space/src/share/dir_visibility.rs
@@ -1,11 +1,7 @@
1use std::collections::HashMap;
2use std::collections::HashSet;
1use std::collections::{HashMap, HashSet};
32
4use models::dir::dir_overwrite_group;
5use models::dir::dir_overwrite_users;
6use models::dir::dirs;
7use models::space::space_member_groups;
8use models::space::spaces;
3use models::dir::{dir_overwrite_group, dir_overwrite_users, dirs};
4use models::space::{space_member_groups, spaces};
95use sea_orm::{ColumnTrait, ConnectionTrait, EntityTrait, QueryFilter};
106use uuid::Uuid;
117
Modified lib/space/src/errors.rs lib/space/src/errors.rs +3 −3 View lib/space/src/errors.rs
@@ -52,7 +52,6 @@
5252 }
5353}
5454
55
5655impl From<kenauth::KenAuthError> for SpaceError {
5756 fn from(error: kenauth::KenAuthError) -> Self {
5857 match error {
@@ -71,8 +70,9 @@
7170 Self::BadRequest(message)
7271 }
7372 }
74 kenauth::KenAuthError::Config(message)
75 | kenauth::KenAuthError::Internal(message) => Self::Internal(message),
73 kenauth::KenAuthError::Config(message) | kenauth::KenAuthError::Internal(message) => {
74 Self::Internal(message)
75 }
7676 }
7777 }
7878}
Modified lib/space/src/routes.rs lib/space/src/routes.rs +1 −2 View lib/space/src/routes.rs
@@ -14,9 +14,8 @@
1414use crate::handlers::delete_join_rule::delete_join_rule;
1515use crate::handlers::delete_space::{delete_space, restore_space};
1616use crate::handlers::delete_space_image::delete_space_image;
17use crate::handlers::explore_spaces::explore_spaces;
1817use crate::handlers::explore_spaces::{
19 approve_join_request, list_join_requests, reject_join_request,
18 approve_join_request, explore_spaces, list_join_requests, reject_join_request,
2019};
2120use crate::handlers::get_ban::get_ban;
2221use crate::handlers::get_group::get_group;
Modified lib/user/src/handlers/create_meme.rs lib/user/src/handlers/create_meme.rs +2 −2 View lib/user/src/handlers/create_meme.rs
@@ -6,7 +6,7 @@
66use crate::errors::ApiError;
77use crate::services::profile::{MemeDto, UpsertMemeCmd};
88use crate::services::service::UserService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Json(cmd): Json<UpsertMemeCmd>,
2828) -> Result<AppResponseData<MemeDto>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let meme = service.create_meme(uid, cmd).await?;
3131 Ok(AppResponseData::ok(meme))
3232}
Modified lib/user/src/handlers/delete_avatar.rs lib/user/src/handlers/delete_avatar.rs +2 −2 View lib/user/src/handlers/delete_avatar.rs
@@ -4,7 +4,7 @@
44
55use crate::errors::ApiError;
66use crate::services::service::UserService;
7use jwt::share::session::require_uid;
7use jwt::share::session;
88
99#[utoipa::path(
1010 delete,
@@ -20,7 +20,7 @@
2020 State(service): State<UserService>,
2121 session: Session,
2222) -> Result<AppResponseData<NoData>, ApiError> {
23 let uid = require_uid(&session)?;
23 let uid = session::require_uid(&session)?;
2424 service.delete_avatar(uid).await?;
2525 Ok(AppResponseData::empty())
2626}
Modified lib/user/src/handlers/delete_meme.rs lib/user/src/handlers/delete_meme.rs +2 −2 View lib/user/src/handlers/delete_meme.rs
@@ -5,7 +5,7 @@
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(meme_id): Path<Uuid>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service.delete_meme(uid, meme_id).await?;
3030 Ok(AppResponseData::empty())
3131}
Modified lib/user/src/handlers/delete_push_subscription.rs lib/user/src/handlers/delete_push_subscription.rs +2 −2 View lib/user/src/handlers/delete_push_subscription.rs
@@ -5,7 +5,7 @@
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(push_id): Path<Uuid>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service.delete_push_subscription(uid, push_id).await?;
3030 Ok(AppResponseData::empty())
3131}
Modified lib/user/src/handlers/get_avatar.rs lib/user/src/handlers/get_avatar.rs +2 −2 View lib/user/src/handlers/get_avatar.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::avatar::AvatarDto;
77use crate::services::service::UserService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 get,
@@ -22,7 +22,7 @@
2222 State(service): State<UserService>,
2323 session: Session,
2424) -> Result<AppResponseData<Option<AvatarDto>>, ApiError> {
25 let uid = require_uid(&session)?;
25 let uid = session::require_uid(&session)?;
2626 let avatar = service.current_avatar(uid).await?;
2727 Ok(AppResponseData::ok(avatar))
2828}
Modified lib/user/src/handlers/get_user_avatar.rs lib/user/src/handlers/get_user_avatar.rs +3 −3 View lib/user/src/handlers/get_user_avatar.rs
@@ -2,9 +2,9 @@
22use axum::http::{StatusCode, header};
33use axum::response::Response;
44use imaging::layout::ImageVariant;
5use serde::Deserialize;
65use jwt::Session;
7use jwt::share::session::require_uid;
6use jwt::share::session;
7use serde::Deserialize;
88use utoipa::{IntoParams, ToSchema};
99
1010use crate::errors::ApiError;
@@ -38,7 +38,7 @@
3838) -> Result<Response, ApiError> {
3939 // A session is still required to reach the endpoint at all; what is
4040 // deliberately *not* checked is who the caller is relative to the target.
41 require_uid(&session).map_err(|_| ApiError::unauthorized())?;
41 session::require_uid(&session).map_err(|_| ApiError::unauthorized())?;
4242 let url = service
4343 .avatar_redirect_url(user_id, query.variant.unwrap_or(ImageVariant::Preview))
4444 .await?;
Modified lib/user/src/handlers/list_memes.rs lib/user/src/handlers/list_memes.rs +2 −2 View lib/user/src/handlers/list_memes.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::profile::{ListLimitQuery, MemeDto};
77use crate::services::service::UserService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 get,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Query(query): Query<ListLimitQuery>,
2828) -> Result<AppResponseData<Vec<MemeDto>>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let memes = service.list_memes(uid, query.limit).await?;
3131 Ok(AppResponseData::ok(memes))
3232}
Modified lib/user/src/handlers/list_push_subscriptions.rs lib/user/src/handlers/list_push_subscriptions.rs +2 −2 View lib/user/src/handlers/list_push_subscriptions.rs
@@ -6,7 +6,7 @@
66use crate::services::push_subscriptions::PushSubscriptionDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Query(query): Query<PageQuery>,
2727) -> Result<AppResponseData<Vec<PushSubscriptionDto>>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 let list = service.list_push_subscriptions(uid, query).await?;
3030 Ok(AppResponseData::ok(list))
3131}
Modified lib/user/src/handlers/list_saved_messages.rs lib/user/src/handlers/list_saved_messages.rs +2 −2 View lib/user/src/handlers/list_saved_messages.rs
@@ -6,7 +6,7 @@
66use crate::services::notifications::SavedMessageDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Query(query): Query<PageQuery>,
2727) -> Result<AppResponseData<Vec<SavedMessageDto>>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 let list = service.list_saved_messages(uid, query).await?;
3030 Ok(AppResponseData::ok(list))
3131}
Modified lib/user/src/handlers/mod.rs lib/user/src/handlers/mod.rs +1 −1 View lib/user/src/handlers/mod.rs
@@ -17,4 +17,4 @@
1717pub mod unsave_message;
1818pub mod update_meme;
1919pub mod upload_avatar;
20pub mod upsert_push_subscription;
No newline at end of file
20pub mod upsert_push_subscription;
Modified lib/user/src/handlers/my_reports.rs lib/user/src/handlers/my_reports.rs +2 −2 View lib/user/src/handlers/my_reports.rs
@@ -6,7 +6,7 @@
66use crate::services::notifications::UserReportDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Query(query): Query<PageQuery>,
2727) -> Result<AppResponseData<Vec<UserReportDto>>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 let reports = service.my_reports(uid, query).await?;
3030 Ok(AppResponseData::ok(reports))
3131}
Modified lib/user/src/handlers/my_spaces.rs lib/user/src/handlers/my_spaces.rs +2 −2 View lib/user/src/handlers/my_spaces.rs
@@ -6,7 +6,7 @@
66use crate::services::profile::MySpaceDto;
77use crate::services::service::UserService;
88use crate::share::page::PageQuery;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Query(query): Query<PageQuery>,
2727) -> Result<AppResponseData<Vec<MySpaceDto>>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 let spaces = service.my_spaces(uid, query).await?;
3030 Ok(AppResponseData::ok(spaces))
3131}
Modified lib/user/src/handlers/my_suspensions.rs lib/user/src/handlers/my_suspensions.rs +2 −2 View lib/user/src/handlers/my_suspensions.rs
@@ -5,7 +5,7 @@
55use crate::errors::ApiError;
66use crate::services::service::UserService;
77use crate::services::suspensions::{IncludeRevokedQuery, SuspensionDto};
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 get,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Query(query): Query<IncludeRevokedQuery>,
2828) -> Result<AppResponseData<Vec<SuspensionDto>>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let list = service.my_suspensions(uid, query).await?;
3131 Ok(AppResponseData::ok(list))
3232}
Modified lib/user/src/handlers/recent_mentions.rs lib/user/src/handlers/recent_mentions.rs +2 −2 View lib/user/src/handlers/recent_mentions.rs
@@ -6,7 +6,7 @@
66use crate::services::notifications::RecentMentionDto;
77use crate::services::profile::ListLimitQuery;
88use crate::services::service::UserService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 get,
@@ -27,7 +27,7 @@
2727 session: Session,
2828 Query(query): Query<ListLimitQuery>,
2929) -> Result<AppResponseData<Vec<RecentMentionDto>>, ApiError> {
30 let uid = require_uid(&session)?;
30 let uid = session::require_uid(&session)?;
3131 let mentions = service.recent_mentions(uid, query.limit).await?;
3232 Ok(AppResponseData::ok(mentions))
3333}
Modified lib/user/src/handlers/save_message.rs lib/user/src/handlers/save_message.rs +2 −2 View lib/user/src/handlers/save_message.rs
@@ -6,7 +6,7 @@
66use crate::errors::ApiError;
77use crate::services::notifications::{SaveMessageCmd, SavedMessageDto};
88use crate::services::service::UserService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Json(cmd): Json<SaveMessageCmd>,
2828) -> Result<AppResponseData<SavedMessageDto>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let saved = service.save_message(uid, cmd).await?;
3131 Ok(AppResponseData::ok(saved))
3232}
Modified lib/user/src/handlers/unsave_message.rs lib/user/src/handlers/unsave_message.rs +2 −2 View lib/user/src/handlers/unsave_message.rs
@@ -5,7 +5,7 @@
55
66use crate::errors::ApiError;
77use crate::services::service::UserService;
8use jwt::share::session::require_uid;
8use jwt::share::session;
99
1010#[utoipa::path(
1111 delete,
@@ -25,7 +25,7 @@
2525 session: Session,
2626 Path(message_id): Path<Uuid>,
2727) -> Result<AppResponseData<NoData>, ApiError> {
28 let uid = require_uid(&session)?;
28 let uid = session::require_uid(&session)?;
2929 service.unsave_message(uid, message_id).await?;
3030 Ok(AppResponseData::empty())
3131}
Modified lib/user/src/handlers/update_meme.rs lib/user/src/handlers/update_meme.rs +2 −2 View lib/user/src/handlers/update_meme.rs
@@ -7,7 +7,7 @@
77use crate::errors::ApiError;
88use crate::services::profile::{MemeDto, UpsertMemeCmd};
99use crate::services::service::UserService;
10use jwt::share::session::require_uid;
10use jwt::share::session;
1111
1212#[utoipa::path(
1313 put,
@@ -29,7 +29,7 @@
2929 Path(meme_id): Path<Uuid>,
3030 Json(cmd): Json<UpsertMemeCmd>,
3131) -> Result<AppResponseData<MemeDto>, ApiError> {
32 let uid = require_uid(&session)?;
32 let uid = session::require_uid(&session)?;
3333 let meme = service.update_meme(uid, meme_id, cmd).await?;
3434 Ok(AppResponseData::ok(meme))
3535}
Modified lib/user/src/handlers/upload_avatar.rs lib/user/src/handlers/upload_avatar.rs +2 −2 View lib/user/src/handlers/upload_avatar.rs
@@ -8,7 +8,7 @@
88use crate::errors::ApiError;
99use crate::services::avatar::AvatarDto;
1010use crate::services::service::UserService;
11use jwt::share::session::require_uid;
11use jwt::share::session;
1212
1313#[utoipa::path(
1414 put,
@@ -32,7 +32,7 @@
3232 headers: HeaderMap,
3333 body: Bytes,
3434) -> Result<AppResponseData<AvatarDto>, ApiError> {
35 let uid = require_uid(&session)?;
35 let uid = session::require_uid(&session)?;
3636 let content_type = headers
3737 .get(CONTENT_TYPE)
3838 .and_then(|v| v.to_str().ok())
Modified lib/user/src/handlers/upsert_push_subscription.rs lib/user/src/handlers/upsert_push_subscription.rs +2 −2 View lib/user/src/handlers/upsert_push_subscription.rs
@@ -6,7 +6,7 @@
66use crate::errors::ApiError;
77use crate::services::push_subscriptions::{PushSubscriptionDto, UpsertPushCmd};
88use crate::services::service::UserService;
9use jwt::share::session::require_uid;
9use jwt::share::session;
1010
1111#[utoipa::path(
1212 post,
@@ -26,7 +26,7 @@
2626 session: Session,
2727 Json(cmd): Json<UpsertPushCmd>,
2828) -> Result<AppResponseData<PushSubscriptionDto>, ApiError> {
29 let uid = require_uid(&session)?;
29 let uid = session::require_uid(&session)?;
3030 let sub = service.upsert_push_subscription(uid, cmd).await?;
3131 Ok(AppResponseData::ok(sub))
3232}
Modified lib/user/src/services/mod.rs lib/user/src/services/mod.rs +1 −1 View lib/user/src/services/mod.rs
@@ -3,4 +3,4 @@
33pub mod profile;
44pub mod push_subscriptions;
55pub mod service;
6pub mod suspensions;
No newline at end of file
6pub mod suspensions;
Modified lib/user/src/services/notifications.rs lib/user/src/services/notifications.rs +1 −2 View lib/user/src/services/notifications.rs
@@ -1,6 +1,5 @@
1use models::users::user_recent_mentions;
21use models::users::user_reports::{self, ReportStatus};
3use models::users::user_saved_messages;
2use models::users::{user_recent_mentions, user_saved_messages};
43use sea_orm::{
54 ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, Set,
65};
Modified lib/user/src/services/profile.rs lib/user/src/services/profile.rs +0 −1 View lib/user/src/services/profile.rs
@@ -1,4 +1,3 @@
1use models::space::{space_group_permissions, space_member_groups, space_members, spaces};
21use models::users::user::{self, ProfileVisibility};
32use models::users::{user_favorite_memes, user_profiles};
43use sea_orm::{
Modified lib/user/src/services/push_subscriptions.rs lib/user/src/services/push_subscriptions.rs +1 −5 View lib/user/src/services/push_subscriptions.rs
@@ -109,11 +109,7 @@
109109 skip_all,
110110 fields(uid = %uid, push_id = %push_id)
111111 )]
112 pub async fn delete_push_subscription(
113 &self,
114 uid: i64,
115 push_id: Uuid,
116 ) -> Result<(), UserError> {
112 pub async fn delete_push_subscription(&self, uid: i64, push_id: Uuid) -> Result<(), UserError> {
117113 let row = user_push_subscriptions::Entity::find_by_id(push_id)
118114 .one(self.db().read())
119115 .await?
Modified lib/user/src/services/service.rs lib/user/src/services/service.rs +0 −2 View lib/user/src/services/service.rs
@@ -17,7 +17,6 @@
1717 &self.state.config
1818 }
1919
20
2120 pub fn db(&self) -> &Arc<AppDatabase> {
2221 &self.state.database
2322 }
@@ -26,4 +25,3 @@
2625 &self.state.storage
2726 }
2827}
29
Modified lib/user/src/openapi.rs lib/user/src/openapi.rs +1 −1 View lib/user/src/openapi.rs
@@ -68,4 +68,4 @@
6868 SuspensionType,
6969 ))
7070)]
71pub struct UserApiDoc;
No newline at end of file
71pub struct UserApiDoc;
Modified lib/user/src/routes.rs lib/user/src/routes.rs +1 −1 View lib/user/src/routes.rs
@@ -68,4 +68,4 @@
6868 ));
6969
7070 public.merge(protected)
71}
No newline at end of file
71}
Modified lib/webapi/src/cleanup.rs lib/webapi/src/cleanup.rs +10 −10 View lib/webapi/src/cleanup.rs
@@ -14,14 +14,14 @@
1414use axum::{Json, Router};
1515use export::rest::{AppResponseData, NoData};
1616use jwt::Session;
17use jwt::share::session::require_uid;
17use jwt::share::session;
1818use models::dir::{dir_overwrite_group, dir_overwrite_users, dirs};
1919use models::issue::issues as boards;
2020use models::repo::repos;
2121use models::room::rooms;
22use sea_orm::ActiveValue::Set;
2223use sea_orm::{
23 ActiveModelTrait, ActiveValue::Set, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter,
24 TransactionTrait,
24 ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, TransactionTrait,
2525};
2626use serde::{Deserialize, Serialize};
2727use utoipa::{OpenApi, ToSchema};
@@ -31,7 +31,7 @@
3131use issues::services::service::IssueService;
3232use space::errors::SpaceError;
3333use space::services::service::SpaceService;
34use space::share::lookup::lookup_space_by_name;
34use space::share::lookup;
3535
3636export::api_error! {
3737 log: "cleanup",
@@ -147,7 +147,7 @@
147147 space_name: &str,
148148 uid: i64,
149149) -> Result<models::space::spaces::Model, ApiError> {
150 let space = lookup_space_by_name(&state.space, uid, space_name)
150 let space = lookup::lookup_space_by_name(&state.space, uid, space_name)
151151 .await
152152 .map_err(map_space)?;
153153 if space.owner_id != uid {
@@ -238,7 +238,7 @@
238238 session: Session,
239239 Path(space_name): Path<String>,
240240) -> Result<AppResponseData<Vec<CleanupObjectDto>>, ApiError> {
241 let uid = require_uid(&session)?;
241 let uid = session::require_uid(&session)?;
242242 let space = require_owner(&state, &space_name, uid).await?;
243243 let db = state.space.db();
244244
@@ -388,7 +388,7 @@
388388 Path((space_name, kind, object_id)): Path<(String, String, Uuid)>,
389389 Json(cmd): Json<SetCleanupVisibilityCmd>,
390390) -> Result<AppResponseData<NoData>, ApiError> {
391 let uid = require_uid(&session)?;
391 let uid = session::require_uid(&session)?;
392392 let space = require_owner(&state, &space_name, uid).await?;
393393 let db = state.space.db();
394394
@@ -445,7 +445,7 @@
445445 Path((space_name, kind, object_id)): Path<(String, String, Uuid)>,
446446 Json(cmd): Json<SetRepoArchivedCmd>,
447447) -> Result<AppResponseData<NoData>, ApiError> {
448 let uid = require_uid(&session)?;
448 let uid = session::require_uid(&session)?;
449449 require_owner(&state, &space_name, uid).await?;
450450 if kind != "repo" {
451451 return Err(ApiError::bad_request("only repositories support archiving"));
@@ -476,7 +476,7 @@
476476 session: Session,
477477 Path((space_name, kind, object_id)): Path<(String, String, Uuid)>,
478478) -> Result<AppResponseData<NoData>, ApiError> {
479 let uid = require_uid(&session)?;
479 let uid = session::require_uid(&session)?;
480480 let space = require_owner(&state, &space_name, uid).await?;
481481 let db = state.space.db();
482482
@@ -598,7 +598,7 @@
598598 session: Session,
599599 Path((space_name, kind, object_id)): Path<(String, String, Uuid)>,
600600) -> Result<AppResponseData<NoData>, ApiError> {
601 let uid = require_uid(&session)?;
601 let uid = session::require_uid(&session)?;
602602 let space = require_owner(&state, &space_name, uid).await?;
603603 if !matches!(kind.as_str(), "dir" | "object" | "repo" | "board") {
604604 return Err(ApiError::bad_request(
Modified .dockerignore .dockerignore +2 −2 View .dockerignore
@@ -13,6 +13,6 @@
1313Dockerfile
1414.dockerignore
1515
16lib/identity/node_modules
17lib/identity/view/dist
16node_modules
17view/dist
1818config/api/keys
Modified .gitignore .gitignore +2 −2 View .gitignore
@@ -13,6 +13,6 @@
1313sagent-plan.md
1414.playwright-mcp
1515.codanna
16lib/identity/node_modules
17lib/identity/view/dist
16node_modules
17view/dist
1818config/api/keys/
Modified Cargo.lock Cargo.lock +219 −11 View Cargo.lock
@@ -3,6 +3,18 @@
33version = 4
44
55[[package]]
6name = "accounts"
7version = "1.0.0"
8dependencies = [
9 "chrono",
10 "proto",
11 "sea-orm",
12 "serde",
13 "utoipa 6.0.0",
14 "uuid",
15]
16
17[[package]]
618name = "actix-codec"
719version = "0.5.4"
820source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1465,11 +1477,14 @@
14651477name = "config"
14661478version = "1.0.0"
14671479dependencies = [
1480 "accounts",
14681481 "base64 0.23.1",
1482 "chrono",
14691483 "dotenvy",
14701484 "figment",
14711485 "sea-orm",
14721486 "serde",
1487 "serde_json",
14731488 "thiserror 2.0.21",
14741489 "tracing",
14751490 "url 2.5.8",
@@ -1680,6 +1695,20 @@
16801695checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
16811696
16821697[[package]]
1698name = "crypt"
1699version = "1.0.0"
1700dependencies = [
1701 "aes-gcm 0.11.1",
1702 "base64 0.23.1",
1703 "bytes",
1704 "config 1.0.0",
1705 "rand_core 0.6.4",
1706 "rsa",
1707 "sha2 0.10.9",
1708 "thiserror 2.0.21",
1709]
1710
1711[[package]]
16831712name = "crypto-bigint"
16841713version = "0.5.5"
16851714source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1830,6 +1859,18 @@
18301859checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06"
18311860
18321861[[package]]
1862name = "db"
1863version = "1.0.0"
1864dependencies = [
1865 "async-trait",
1866 "config 1.0.0",
1867 "sea-orm",
1868 "sqlparser",
1869 "thiserror 2.0.21",
1870 "tracing",
1871]
1872
1873[[package]]
18331874name = "deadpool"
18341875version = "0.13.1"
18351876source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2201,6 +2242,32 @@
22012242]
22022243
22032244[[package]]
2245name = "email"
2246version = "1.0.0"
2247dependencies = [
2248 "async-trait",
2249 "base64 0.23.1",
2250 "bytes",
2251 "chrono",
2252 "config 1.0.0",
2253 "db",
2254 "envelope",
2255 "events",
2256 "futures-util",
2257 "http 1.5.0",
2258 "lettre",
2259 "maud",
2260 "queue",
2261 "serde",
2262 "serde_json",
2263 "thiserror 2.0.21",
2264 "tokio",
2265 "tokio-util",
2266 "tracing",
2267 "uuid",
2268]
2269
2270[[package]]
22042271name = "email-encoding"
22052272version = "0.4.2"
22062273source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2231,6 +2298,23 @@
22312298]
22322299
22332300[[package]]
2301name = "envelope"
2302version = "1.0.0"
2303dependencies = [
2304 "actix-web",
2305 "bytes",
2306 "config 1.0.0",
2307 "futures-util",
2308 "serde",
2309 "serde_json",
2310 "session",
2311 "tokio",
2312 "tracing",
2313 "utoipa 6.0.0",
2314 "uuid",
2315]
2316
2317[[package]]
22342318name = "equivalent"
22352319version = "1.0.3"
22362320source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2297,6 +2381,28 @@
22972381]
22982382
22992383[[package]]
2384name = "events"
2385version = "1.0.0"
2386dependencies = [
2387 "accounts",
2388 "chrono",
2389 "config 1.0.0",
2390 "db",
2391 "envelope",
2392 "futures-util",
2393 "opentelemetry",
2394 "queue",
2395 "sea-orm",
2396 "serde",
2397 "serde_json",
2398 "thiserror 2.0.21",
2399 "tokio",
2400 "tokio-util",
2401 "tracing",
2402 "uuid",
2403]
2404
2405[[package]]
23002406name = "export"
23012407version = "1.0.0"
23022408dependencies = [
@@ -3834,23 +3940,14 @@
38343940name = "kenauth"
38353941version = "1.0.0"
38363942dependencies = [
3837 "config 1.0.0",
38383943 "kenoauth",
3839 "prost 0.14.4",
3840 "prost-types 0.14.4",
3841 "thiserror 2.0.21",
3842 "tokio",
3843 "tonic",
3844 "tonic-health",
3845 "tonic-prost",
3846 "tracing",
3847 "uuid",
38483944]
38493945
38503946[[package]]
38513947name = "kenoauth"
38523948version = "1.0.0"
38533949dependencies = [
3950 "accounts",
38543951 "actix-web",
38553952 "aes-gcm 0.11.1",
38563953 "anyhow",
@@ -3859,15 +3956,23 @@
38593956 "base64 0.23.1",
38603957 "bytes",
38613958 "chrono",
3959 "config 1.0.0",
3960 "crypt",
3961 "db",
38623962 "deadpool-redis",
38633963 "ed25519-dalek",
3964 "email",
3965 "envelope",
3966 "events",
38643967 "figment",
38653968 "futures-util",
38663969 "hmac 0.12.1",
38673970 "http 1.5.0",
38683971 "http-body 1.1.0",
3972 "kvcache",
38693973 "lettre",
38703974 "maud",
3975 "oltp",
38713976 "opentelemetry",
38723977 "opentelemetry-appender-tracing",
38733978 "opentelemetry-otlp",
@@ -3875,6 +3980,8 @@
38753980 "percent-encoding 2.3.2",
38763981 "prost 0.14.4",
38773982 "prost-types 0.14.4",
3983 "proto",
3984 "queue",
38783985 "rand 0.10.3",
38793986 "rand_core 0.6.4",
38803987 "reqwest 0.13.5",
@@ -3884,17 +3991,18 @@
38843991 "sea-orm",
38853992 "serde",
38863993 "serde_json",
3994 "session",
38873995 "sha1 0.10.7",
38883996 "sha2 0.10.9",
38893997 "sqlparser",
38903998 "thiserror 2.0.21",
3999 "token",
38914000 "tokio",
38924001 "tokio-stream",
38934002 "tokio-util",
38944003 "tonic",
38954004 "tonic-health",
38964005 "tonic-prost",
3897 "tonic-prost-build",
38984006 "tonic-reflection",
38994007 "tower",
39004008 "tracing",
@@ -3932,6 +4040,22 @@
39324040]
39334041
39344042[[package]]
4043name = "kvcache"
4044version = "1.0.0"
4045dependencies = [
4046 "bytes",
4047 "config 1.0.0",
4048 "deadpool-redis",
4049 "futures-util",
4050 "serde",
4051 "serde_json",
4052 "thiserror 2.0.21",
4053 "tokio",
4054 "tracing",
4055 "uuid",
4056]
4057
4058[[package]]
39354059name = "language-tags"
39364060version = "0.2.2"
39374061source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4838,6 +4962,30 @@
48384962]
48394963
48404964[[package]]
4965name = "oltp"
4966version = "1.0.0"
4967dependencies = [
4968 "actix-web",
4969 "bytes",
4970 "envelope",
4971 "http 1.5.0",
4972 "http-body 1.1.0",
4973 "opentelemetry",
4974 "opentelemetry-appender-tracing",
4975 "opentelemetry-otlp",
4976 "opentelemetry_sdk",
4977 "session",
4978 "thiserror 2.0.21",
4979 "tokio",
4980 "tonic",
4981 "tower",
4982 "tracing",
4983 "tracing-opentelemetry",
4984 "tracing-subscriber",
4985 "uuid",
4986]
4987
4988[[package]]
48414989name = "once_cell"
48424990version = "1.21.4"
48434991source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5707,6 +5855,21 @@
57075855]
57085856
57095857[[package]]
5858name = "proto"
5859version = "1.0.0"
5860dependencies = [
5861 "chrono",
5862 "prost 0.14.4",
5863 "prost-types 0.14.4",
5864 "serde",
5865 "serde_json",
5866 "tonic",
5867 "tonic-prost",
5868 "tonic-prost-build",
5869 "utoipa 6.0.0",
5870]
5871
5872[[package]]
57105873name = "pulldown-cmark"
57115874version = "0.13.5"
57125875source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5786,13 +5949,16 @@
57865949name = "queue"
57875950version = "1.0.0"
57885951dependencies = [
5952 "async-trait",
57895953 "bytes",
5954 "chrono",
57905955 "config 1.0.0",
57915956 "rocketmq-client-rust",
57925957 "rocketmq-common",
57935958 "sea-orm",
57945959 "serde",
57955960 "serde_json",
5961 "thiserror 2.0.21",
57965962 "time 0.3.55",
57975963 "tokio",
57985964 "tokio-util",
@@ -7025,6 +7191,22 @@
70257191]
70267192
70277193[[package]]
7194name = "session"
7195version = "1.0.0"
7196dependencies = [
7197 "actix-web",
7198 "bytes",
7199 "config 1.0.0",
7200 "kvcache",
7201 "rand 0.10.3",
7202 "serde",
7203 "serde_json",
7204 "thiserror 2.0.21",
7205 "tokio",
7206 "uuid",
7207]
7208
7209[[package]]
70287210name = "sha1"
70297211version = "0.10.7"
70307212source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -7799,6 +7981,32 @@
77997981checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee"
78007982
78017983[[package]]
7984name = "token"
7985version = "1.0.0"
7986dependencies = [
7987 "actix-web",
7988 "async-trait",
7989 "base64 0.23.1",
7990 "bytes",
7991 "chrono",
7992 "config 1.0.0",
7993 "crypt",
7994 "ed25519-dalek",
7995 "envelope",
7996 "http 1.5.0",
7997 "prost-types 0.14.4",
7998 "proto",
7999 "reqwest 0.13.5",
8000 "serde",
8001 "serde_json",
8002 "sha2 0.10.9",
8003 "thiserror 2.0.21",
8004 "tokio",
8005 "tonic",
8006 "tracing",
8007]
8008
8009[[package]]
78028010name = "tokio"
78038011version = "1.54.1"
78048012source = "registry+https://github.com/rust-lang/crates.io-index"
Modified Cargo.toml Cargo.toml +11 −0 View Cargo.toml
@@ -13,6 +13,7 @@
1313
1414
1515[workspace.dependencies]
16accounts = { path = "lib/accounts" }
1617auth = { path = "lib/auth" }
1718cache = { path = "lib/cache" }
1819chat = { path = "lib/chat" }
@@ -30,6 +31,16 @@
3031imaging = { path = "lib/imaging" }
3132kenauth = { path = "lib/kenauth" }
3233kenoauth = { path = "lib/identity" }
34crypt = { path = "lib/crypt" }
35db = { path = "lib/db" }
36email = { path = "lib/email" }
37envelope = { path = "lib/envelope" }
38events = { path = "lib/events" }
39kvcache = { path = "lib/kvcache" }
40oltp = { path = "lib/oltp" }
41proto = { path = "lib/proto" }
42session = { path = "lib/session" }
43token = { path = "lib/token" }
3344kenshell = { path = "lib/kenshell" }
3445jwt = { path = "lib/jwt" }
3546webapi = { path = "lib/webapi" }
Modified Dockerfile Dockerfile +5 −3 View Dockerfile
@@ -19,9 +19,11 @@
1919
2020FROM node:26-bookworm-slim AS identity-web
2121WORKDIR /web
22COPY lib/identity/package.json lib/identity/package-lock.json ./
22COPY package.json package-lock.json ./
2323RUN npm ci
24COPY lib/identity/ ./
24COPY view ./view
25COPY vite.config.ts tsconfig.json tsconfig.app.json tsconfig.node.json \
26 orval.config.ts steiger.config.ts biome.json ./
2527RUN npm run build
2628
2729# ---------------------------------------------------------------------------
@@ -58,7 +60,7 @@
5860COPY Cargo.toml Cargo.lock ./
5961COPY lib ./lib
6062COPY app ./app
61COPY --from=identity-web /web/view/dist ./lib/identity/view/dist
63COPY --from=identity-web /web/view/dist ./view/dist
6264
6365RUN --mount=type=cache,id=kenapi-cargo-registry,target=/usr/local/cargo/registry \
6466 --mount=type=cache,id=kenapi-cargo-git,target=/usr/local/cargo/git \
Modified justfile justfile +2 −2 View justfile
@@ -116,10 +116,10 @@
116116 @cargo clean
117117# 登录前端随 kenapi 发布。
118118identity-web-build:
119 cd lib/identity && npm ci && npm run build
119 npm ci && npm run build
120120
121121identity-web-dev:
122 cd lib/identity && npm run dev
122 npm run dev
123123
124124identity-openapi:
125125 cargo run -p kenapi -- identity-openapi