Skip to content
Clone
db73d56
159 lines 6.9 KB Rust
use serde_json::Value;
pub const USER_ID: &str = "user_id";
pub const ACTOR_USER_ID: &str = "actor_user_id";
pub const ORGANIZATION_ID: &str = "organization_id";
pub const REQUEST_ID: &str = "request_id";
pub const GUILD_ID: &str = "guild_id";
pub const REPOSITORY_ID: &str = "repository_id";
pub const PULL_REQUEST_ID: &str = "pull_request_id";
pub const ISSUE_ID: &str = "issue_id";
pub const BOARD_ID: &str = "board_id";
pub const CHANNEL_ID: &str = "channel_id";
pub const ROOM_ID: &str = "room_id";
pub const ORDERING_KEY: &str = "ordering_key";
pub const AUTH_REGISTER_CREATE: &str = "auth.register.create";
pub const AUTH_LOGIN_CREATE: &str = "auth.login.create";
pub const AUTH_LOGOUT_DELETE: &str = "auth.logout.delete";
pub const AUTH_VERIFICATION_TOKEN_CREATE: &str = "auth.verification_token.create";
pub const AUTH_PASSWORD_CREATE: &str = "auth.password.create";
pub const AUTH_PASSWORD_UPDATE: &str = "auth.password.update";
pub const AUTH_SSH_KEY_CREATE: &str = "auth.ssh_key.create";
pub const AUTH_SSH_KEY_DELETE: &str = "auth.ssh_key.delete";
pub const AUTH_ACCESS_KEY_CREATE: &str = "auth.access_key.create";
pub const AUTH_ACCESS_KEY_DELETE: &str = "auth.access_key.delete";
pub const AUTH_ACCESS_KEY_USED: &str = "auth.access_key.used";
pub const AUTH_APP_TOKEN_CREATE: &str = "auth.app_token.create";
pub const AUTH_TOKEN_CREATE: &str = "auth.token.create";
pub const AUTH_CHALLENGE_CREATE: &str = "auth.challenge.create";
pub const AUTH_CHALLENGE_USED: &str = "auth.challenge.used";
pub const ORGANIZATION_LIFE_CYCLE_CREATE: &str = "organization.life_cycle.create";
pub const ORGANIZATION_LIFE_CYCLE_UPDATE: &str = "organization.life_cycle.update";
pub const ORGANIZATION_LIFE_CYCLE_DELETE: &str = "organization.life_cycle.delete";
pub const ORGANIZATION_INVITE_CREATE: &str = "organization.invite.create";
pub const ORGANIZATION_MEMBER_UPDATE: &str = "organization.member.update";
pub const ORGANIZATION_ROLE_UPDATE: &str = "organization.role.update";
pub const EMAIL_DELIVERY_CREATE: &str = "email.delivery.create";
pub const EMAIL_FAILURE_CREATE: &str = "email.failure.create";
pub const REGISTER: &str = "register";
pub const SEND_CODE: &str = "send-code";
pub const LOGIN: &str = "login";
pub const LOGOUT: &str = "logout";
pub const REQUEST_RESET: &str = "request-reset";
pub const RESET_PASSWORD: &str = "reset-password";
pub const ADD_SSH_KEY: &str = "add-sshkey";
pub const DELETE_SSH_KEY: &str = "delete-sshkey";
pub const CREATE_ACCESS_KEY: &str = "create-accesskey";
pub const ROTATE_ACCESS_KEY: &str = "rotate-accesskey";
pub const DELETE_ACCESS_KEY: &str = "delete-accesskey";
pub const USE_ACCESS_KEY: &str = "use-accesskey";
pub const CHALLENGE: &str = "challenge";
pub const VERIFY_CHALLENGE: &str = "verify-challenge";
pub const ISSUE_TOKEN: &str = "issue-token";
pub const DELIVERY: &str = "delivery";
pub const FAILURE: &str = "failure";
pub const CREATE: &str = "create";
pub const UPDATE: &str = "update";
pub const DELETE: &str = "delete";
pub const ARCHIVE: &str = "archive";
pub const RESTORE: &str = "restore";
pub const INVITE: &str = "invite";
pub const REVOKE_INVITE: &str = "revoke-invite";
pub const REDEEM_INVITE: &str = "redeem-invite";
pub const JOIN: &str = "join";
pub const LEAVE: &str = "leave";
pub const ADD_MEMBER: &str = "add-member";
pub const REMOVE_MEMBER: &str = "remove-member";
pub const SET_ROLE: &str = "set-role";
pub const BAN: &str = "ban";
pub const UNBAN: &str = "unban";
pub const UPDATE_BAN: &str = "update-ban";
pub const TRANSFER_OWNER: &str = "transfer-owner";
pub const UPDATE_MEMBER: &str = "update-member";
pub const CREATE_ROLE: &str = "create-role";
pub const SET_PERMISSIONS: &str = "set-permissions";
pub const UPDATE_ROLE: &str = "update-role";
pub const DELETE_ROLE: &str = "delete-role";
pub const ASSIGN_ROLE: &str = "assign-role";
pub const UNASSIGN_ROLE: &str = "unassign-role";
pub const GRANT: &str = "grant";
pub fn tag<'a>(kind: &'a str, payload: Option<&Value>) -> &'a str {
let mut parts = kind.split('.');
let domain = parts.next().unwrap_or_default();
let name = parts.next().unwrap_or_default();
let operate = parts.next().unwrap_or_default();
let action = payload
.and_then(|value| value.get("action"))
.and_then(Value::as_str);
match (domain, name, operate) {
("auth", "register", "create") => {
if has_field(payload, "expires_in_secs") {
SEND_CODE
} else {
REGISTER
}
}
("auth", "login", "create") => LOGIN,
("auth", "logout", "delete") => LOGOUT,
("auth", "verification_token", "create") => SEND_CODE,
("auth", "password", "create") => REQUEST_RESET,
("auth", "password", "update") => RESET_PASSWORD,
("auth", "ssh_key", "create") => ADD_SSH_KEY,
("auth", "ssh_key", "delete") => DELETE_SSH_KEY,
("auth", "access_key", "create") => {
if has_field(payload, "rotated") {
ROTATE_ACCESS_KEY
} else {
CREATE_ACCESS_KEY
}
}
("auth", "access_key", "delete") => DELETE_ACCESS_KEY,
("auth", "access_key", "used") => USE_ACCESS_KEY,
("auth", "challenge", "create") => CHALLENGE,
("auth", "challenge", "used") => VERIFY_CHALLENGE,
("auth", "app_token", "create") | ("auth", "token", "create") => ISSUE_TOKEN,
("email", "delivery", _) => DELIVERY,
("email", "failure", _) => FAILURE,
("organization", "life_cycle", "create") => CREATE,
("organization", "life_cycle", "update") => match action {
Some("archive") => ARCHIVE,
Some("restore") => RESTORE,
_ => UPDATE,
},
("organization", "life_cycle", "delete") => DELETE,
("organization", "invite", "create") => match action {
Some("revoke") => REVOKE_INVITE,
Some("redeem") => REDEEM_INVITE,
_ => INVITE,
},
("organization", "member", "update") => match action {
Some("join_role") => JOIN,
Some("leave_role") => LEAVE,
Some("add") => ADD_MEMBER,
Some("remove") => REMOVE_MEMBER,
Some("set_role") => SET_ROLE,
Some("ban") => BAN,
Some("unban") => UNBAN,
Some("update_ban") => UPDATE_BAN,
Some("transfer_ownership") => TRANSFER_OWNER,
_ => UPDATE_MEMBER,
},
("organization", "role", "update") => match action {
Some("create") => CREATE_ROLE,
Some("set_permissions") => SET_PERMISSIONS,
Some("update") => UPDATE_ROLE,
Some("delete") => DELETE_ROLE,
Some("assign") => ASSIGN_ROLE,
Some("unassign") => UNASSIGN_ROLE,
_ => GRANT,
},
(_, _, operate) => operate,
}
}
fn has_field(payload: Option<&Value>, key: &str) -> bool {
payload.is_some_and(|value| value.get(key).is_some())
}