use alloc::vec::Vec;
use musli_core02::{Decode, Encode};
#[cfg(doc)]
use crate::AuthError;
use crate::{
CloudflareConfig, CreatedUser, Link, NewUser, PasswordChange, UserChange, UserEntry, UserId,
UserInfo,
};
pub const FIRST_ID: u16 = 32000;
pub const LAST_ID: u16 = 32255;
pub fn is_watchword_id(id: musli_web05::api::MessageId) -> bool {
(FIRST_ID..=LAST_ID).contains(&id.get())
}
musli_web05::api::define! {
#![musli(crate = musli_web05)]
#[musli(id = 32000)]
pub type Me;
impl Endpoint for Me {
impl Request for MeRequest;
type Response<'de> = UserInfo;
}
#[musli(id = 32001)]
pub type UpdateAccount;
impl Endpoint for UpdateAccount {
impl Request for UserChange;
type Response<'de> = UserInfo;
}
#[musli(id = 32002)]
pub type ChangePassword;
impl Endpoint for ChangePassword {
impl Request for PasswordChange;
type Response<'de> = UserInfo;
}
#[musli(id = 32003)]
pub type Users;
impl Endpoint for Users {
impl Request for UsersRequest;
type Response<'de> = Vec<UserEntry>;
}
#[musli(id = 32004)]
pub type CreateUser;
impl Endpoint for CreateUser {
impl Request for NewUser;
type Response<'de> = CreatedUser;
}
#[musli(id = 32005)]
pub type UpdateUser;
impl Endpoint for UpdateUser {
impl Request for UserUpdate;
type Response<'de> = UserInfo;
}
#[musli(id = 32006)]
pub type DeleteUser;
impl Endpoint for DeleteUser {
impl Request for DeleteUserRequest;
type Response<'de> = ();
}
#[musli(id = 32007)]
pub type IssueLink;
impl Endpoint for IssueLink {
impl Request for IssueLinkRequest;
type Response<'de> = Link;
}
#[musli(id = 32008)]
pub type RevokeLink;
impl Endpoint for RevokeLink {
impl Request for RevokeLinkRequest;
type Response<'de> = ();
}
#[musli(id = 32009)]
pub type SignOutUser;
impl Endpoint for SignOutUser {
impl Request for SignOutUserRequest;
type Response<'de> = ();
}
#[musli(id = 32010)]
pub type RevokeAccess;
impl Endpoint for RevokeAccess {
impl Request for RevokeAccessRequest;
type Response<'de> = UserInfo;
}
#[musli(id = 32011)]
pub type Cloudflare;
impl Endpoint for Cloudflare {
impl Request for CloudflareRequest;
type Response<'de> = CloudflareConfig;
}
#[musli(id = 32012)]
pub type SetCloudflare;
impl Endpoint for SetCloudflare {
impl Request for CloudflareConfig;
type Response<'de> = CloudflareConfig;
}
#[musli(id = 32100)]
pub type AuthBroadcast;
impl Broadcast for AuthBroadcast {
impl Event for AuthUpdate;
}
}
#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)]
#[musli(crate = musli_core02)]
pub enum AuthUpdate {
Me(UserInfo),
UserCreated(UserInfo),
UserChanged(UserInfo),
UserDeleted(UserId),
Resync(UserInfo),
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Encode, Decode)]
#[musli(crate = musli_core02)]
pub struct MeRequest;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Encode, Decode)]
#[musli(crate = musli_core02)]
pub struct UsersRequest;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Encode, Decode)]
#[musli(crate = musli_core02)]
pub struct CloudflareRequest;
#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)]
#[musli(crate = musli_core02)]
pub struct UserUpdate {
pub id: UserId,
pub change: UserChange,
}
macro_rules! user_requests {
($($name:ident => $endpoint:ident),* $(,)?) => {
$(
#[doc = concat!("The request of [`", stringify!($endpoint), "`]: the user it acts on.")]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Encode, Decode)]
#[musli(crate = musli_core02)]
pub struct $name {
/// The user.
pub id: UserId,
}
)*
};
}
user_requests! {
DeleteUserRequest => DeleteUser,
IssueLinkRequest => IssueLink,
RevokeLinkRequest => RevokeLink,
SignOutUserRequest => SignOutUser,
RevokeAccessRequest => RevokeAccess,
}