09985f8a95
this implements first version (manageable only by admin right now)
routes:
GET /api/groups
List subject groups (paginated). Admin-only.
POST /api/groups
Create a new ReBAC subject group. Admin-only. The name must match the RFC 5321 local-part shape and be globally unique (case-insensitive).
GET /api/groups/search
Search non-virtual groups by name substring. Authenticated only (no admin role required) — backs the share-dialog recipient autocomplete.
GET /api/groups/{id}
Fetch a single group's details. Admin-only.
DELETE /api/groups/{id}
Delete a group. Cascades to `subject_group_members` (FK) and to `access_grants` rows referencing this group as a subject. Admin-only.
PATCH /api/groups/{id}
Update a group's metadata. Admin-only. v1 only persists name renames.
GET /api/groups/{id}/effective-members
List every user transitively reached through this group (members of members of members, etc.). Used by admin / audit tooling. Admin-only.
GET /api/groups/{id}/members
List the *direct* members of a group (one level only). Admin-only.
POST /api/groups/{id}/members
Add a member to a group. Exactly one of `user_id` / `group_id` must be provided. Adding a group-member runs a write-time cycle check and a nesting-depth check (max 8). Admin-only.
DELETE /api/groups/{id}/members/group/{gid}
Remove a nested group-member from a group. Admin-only.
DELETE /api/groups/{id}/members/user/{uid}
Remove a user-member from a group. Admin-only.
fix hurl
groups
round
groups
67 lines
2.6 KiB
Rust
67 lines
2.6 KiB
Rust
mod address_book_pg_repository;
|
|
mod app_password_pg_repository;
|
|
mod calendar_event_pg_repository;
|
|
mod calendar_pg_repository;
|
|
mod contact_group_pg_repository;
|
|
mod contact_persistence_dto;
|
|
mod contact_pg_repository;
|
|
mod device_code_pg_repository;
|
|
mod favorites_pg_repository;
|
|
pub mod file_metadata_repository;
|
|
mod nextcloud_object_id_repository;
|
|
pub mod playlist_pg_repository;
|
|
mod recent_items_pg_repository;
|
|
mod session_pg_repository;
|
|
mod settings_pg_repository;
|
|
mod share_pg_repository;
|
|
mod subject_group_pg_repository;
|
|
mod transaction_utils;
|
|
mod user_pg_repository;
|
|
|
|
// ── Blob-storage repositories ──
|
|
pub mod file_blob_read_repository;
|
|
pub mod file_blob_write_repository;
|
|
pub mod folder_db_repository;
|
|
pub mod trash_db_repository;
|
|
|
|
pub use address_book_pg_repository::AddressBookPgRepository;
|
|
pub use app_password_pg_repository::AppPasswordPgRepository;
|
|
pub use calendar_event_pg_repository::CalendarEventPgRepository;
|
|
pub use calendar_pg_repository::CalendarPgRepository;
|
|
pub use contact_group_pg_repository::ContactGroupPgRepository;
|
|
pub use contact_persistence_dto::*;
|
|
pub use contact_pg_repository::ContactPgRepository;
|
|
pub use device_code_pg_repository::DeviceCodePgRepository;
|
|
pub use favorites_pg_repository::FavoritesPgRepository;
|
|
pub use file_blob_read_repository::FileBlobReadRepository;
|
|
pub use file_blob_write_repository::FileBlobWriteRepository;
|
|
pub use file_metadata_repository::FileMetadataRepository;
|
|
pub use folder_db_repository::FolderDbRepository;
|
|
pub use nextcloud_object_id_repository::NextcloudObjectIdRepository;
|
|
pub use playlist_pg_repository::{
|
|
AudioMetadataPgRepository, PlaylistItemPgRepository, PlaylistPgRepository,
|
|
};
|
|
pub use recent_items_pg_repository::RecentItemsPgRepository;
|
|
pub use session_pg_repository::SessionPgRepository;
|
|
pub use settings_pg_repository::SettingsPgRepository;
|
|
pub use share_pg_repository::SharePgRepository;
|
|
pub use subject_group_pg_repository::SubjectGroupPgRepository;
|
|
pub use trash_db_repository::TrashDbRepository;
|
|
pub use user_pg_repository::UserPgRepository;
|
|
|
|
// ── SQL helpers ─────────────────────────────────────────────────────────────
|
|
|
|
/// Escape SQL `LIKE` / `ILIKE` wildcard characters (`%` and `_`) in user
|
|
/// input and wrap the result in `%…%` for a contains-match.
|
|
///
|
|
/// Without this, a user searching for `100%` would match *every* row because
|
|
/// `%` is a wildcard in LIKE patterns.
|
|
#[inline]
|
|
pub fn like_escape(raw: &str) -> String {
|
|
let escaped = raw
|
|
.replace('\\', "\\\\")
|
|
.replace('%', "\\%")
|
|
.replace('_', "\\_");
|
|
format!("%{escaped}%")
|
|
}
|