This commit is contained in:
2026-08-02 11:09:50 +02:00
parent 659fd0f304
commit aa486be6e5
8 changed files with 221 additions and 60 deletions
+6
View File
@@ -70,3 +70,9 @@ pub struct ChannelRolePermissionResponse {
pub role_id: Uuid,
pub permissions: u64,
}
#[derive(Debug, Serialize, ToSchema)]
pub struct ChannelPermissionsResponse {
pub users: Vec<ChannelUserPermissionResponse>,
pub roles: Vec<ChannelRolePermissionResponse>,
}
+20
View File
@@ -59,6 +59,16 @@ impl ChannelRepository {
.await?)
}
pub async fn list_user_permissions(
&self,
channel_id: Uuid,
) -> AnyResult<Vec<channel_user_permission::Model>> {
Ok(channel_user_permission::Entity::find()
.filter(channel_user_permission::Column::ChannelId.eq(channel_id))
.all(&self.context.db)
.await?)
}
pub async fn set_user_permission(
&self,
channel_id: Uuid,
@@ -109,6 +119,16 @@ impl ChannelRepository {
.await?)
}
pub async fn list_role_permissions(
&self,
channel_id: Uuid,
) -> AnyResult<Vec<channel_role_permission::Model>> {
Ok(channel_role_permission::Entity::find()
.filter(channel_role_permission::Column::ChannelId.eq(channel_id))
.all(&self.context.db)
.await?)
}
pub async fn set_role_permission(
&self,
channel_id: Uuid,
+21 -1
View File
@@ -2,7 +2,7 @@ use crate::core::state::AppState;
use crate::http::context::Superuser;
use crate::http::error::HTTPError;
use crate::domain::dto::channel::{
ChannelQueryParams, ChannelResponse, ChannelRolePermissionResponse,
ChannelQueryParams, ChannelResponse, ChannelPermissionsResponse, ChannelRolePermissionResponse,
ChannelUserPermissionResponse, CreateChannelRequest, SetChannelPermissionRequest,
UpdateChannelRequest,
};
@@ -69,6 +69,26 @@ pub async fn get_by_id(
Ok(Json(mapper::channel_model_to_channel_response(channel)))
}
/// Liste les permissions directes configurées pour un canal.
#[utoipa::path(
get,
path = "/channels/{channel_id}/permissions",
params(("channel_id" = Uuid, Path, description = "ID du canal")),
responses((status = 200, body = ChannelPermissionsResponse), (status = 404, description = "Canal non trouvé")),
tag = "Channel Permissions"
)]
pub async fn list_permissions(
State(state): State<AppState>,
Path(channel_id): Path<Uuid>,
) -> Result<Json<ChannelPermissionsResponse>, HTTPError> {
state.repositories.channel.get_by_id(channel_id).await?.ok_or(HTTPError::NotFound)?;
let (users, roles) = tokio::try_join!(
state.repositories.channel.list_user_permissions(channel_id),
state.repositories.channel.list_role_permissions(channel_id),
)?;
Ok(Json(mapper::channel_permissions_to_response(users, roles)))
}
/// Crée un nouveau channel
#[utoipa::path(
post,
+11 -1
View File
@@ -1,5 +1,5 @@
use crate::domain::dto::channel::{
ChannelQueryParams, ChannelResponse, ChannelRolePermissionResponse,
ChannelPermissionsResponse, ChannelQueryParams, ChannelResponse, ChannelRolePermissionResponse,
ChannelUserPermissionResponse, CreateChannelRequest, UpdateChannelRequest,
};
use crate::models::{channel, channel_role_permission, channel_user_permission};
@@ -71,6 +71,16 @@ pub fn channel_role_permission_to_response(
}
}
pub fn channel_permissions_to_response(
users: Vec<channel_user_permission::Model>,
roles: Vec<channel_role_permission::Model>,
) -> ChannelPermissionsResponse {
ChannelPermissionsResponse {
users: users.into_iter().map(channel_user_permission_to_response).collect(),
roles: roles.into_iter().map(channel_role_permission_to_response).collect(),
}
}
pub fn query_params_to_channel_filter(params: ChannelQueryParams) -> ChannelFilter {
ChannelFilter {
server_id: params.server_id,
+4
View File
@@ -11,6 +11,10 @@ pub fn router() -> Router<AppState> {
.put(handlers::update)
.delete(handlers::delete),
)
.route(
"/channels/{channel_id}/permissions",
get(handlers::list_permissions),
)
.route(
"/channels/{channel_id}/permissions/users/{user_id}",
get(handlers::get_user_permission)