use super::structs::*; use crate::ForgejoError; use std::collections::BTreeMap; impl crate::Forgejo { /// Returns the instance's Actor pub async fn activitypub_instance_actor(&self) -> Result { let request = self.get("activitypub/actor").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Send to the inbox pub async fn activitypub_instance_actor_inbox(&self) -> Result<(), ForgejoError> { let request = self.post("activitypub/actor/inbox").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns the Repository actor for a repo /// /// - `repository-id`: repository ID of the repo pub async fn activitypub_repository( &self, repository_id: u32, ) -> Result { let request = self .get(&format!("activitypub/repository-id/{repository_id}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Send to the inbox /// /// - `repository-id`: repository ID of the repo /// - `body`: See [`ForgeLike`] pub async fn activitypub_repository_inbox( &self, repository_id: u32, body: ForgeLike, ) -> Result<(), ForgejoError> { let request = self .post(&format!("activitypub/repository-id/{repository_id}/inbox")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns the Person actor for a user /// /// - `user-id`: user ID of the user pub async fn activitypub_person(&self, user_id: u32) -> Result { let request = self .get(&format!("activitypub/user-id/{user_id}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Send to the inbox /// /// - `user-id`: user ID of the user pub async fn activitypub_person_inbox(&self, user_id: u32) -> Result<(), ForgejoError> { let request = self .post(&format!("activitypub/user-id/{user_id}/inbox")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List cron tasks /// pub async fn admin_cron_list( &self, query: AdminCronListQuery, ) -> Result<(CronListHeaders, Vec), ForgejoError> { let request = self.get(&format!("admin/cron?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Run cron task /// /// - `task`: task to run pub async fn admin_cron_run(&self, task: &str) -> Result<(), ForgejoError> { let request = self.post(&format!("admin/cron/{task}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List all emails /// pub async fn admin_get_all_emails( &self, query: AdminGetAllEmailsQuery, ) -> Result, ForgejoError> { let request = self.get(&format!("admin/emails?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Search all emails /// pub async fn admin_search_emails( &self, query: AdminSearchEmailsQuery, ) -> Result, ForgejoError> { let request = self.get(&format!("admin/emails/search?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List system's webhooks /// pub async fn admin_list_hooks( &self, query: AdminListHooksQuery, ) -> Result<(HookListHeaders, Vec), ForgejoError> { let request = self.get(&format!("admin/hooks?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create a hook /// /// - `body`: See [`CreateHookOption`] pub async fn admin_create_hook(&self, body: CreateHookOption) -> Result { let request = self.post("admin/hooks").json(&body).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get a hook /// /// - `id`: id of the hook to get pub async fn admin_get_hook(&self, id: u64) -> Result { let request = self.get(&format!("admin/hooks/{id}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete a hook /// /// - `id`: id of the hook to delete pub async fn admin_delete_hook(&self, id: u64) -> Result<(), ForgejoError> { let request = self.delete(&format!("admin/hooks/{id}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Update a hook /// /// - `id`: id of the hook to update /// - `body`: See [`EditHookOption`] pub async fn admin_edit_hook( &self, id: u64, body: EditHookOption, ) -> Result { let request = self .patch(&format!("admin/hooks/{id}")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List all organizations /// pub async fn admin_get_all_orgs( &self, query: AdminGetAllOrgsQuery, ) -> Result<(OrganizationListHeaders, Vec), ForgejoError> { let request = self.get(&format!("admin/orgs?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List the available quota groups pub async fn admin_list_quota_groups( &self, ) -> Result<(QuotaGroupListHeaders, Vec), ForgejoError> { let request = self.get("admin/quota/groups").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create a new quota group /// /// - `group`: Definition of the quota group /// See [`CreateQuotaGroupOptions`] pub async fn admin_create_quota_group( &self, group: CreateQuotaGroupOptions, ) -> Result { let request = self.post("admin/quota/groups").json(&group).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get information about the quota group /// /// - `quotagroup`: quota group to query pub async fn admin_get_quota_group( &self, quotagroup: &str, ) -> Result { let request = self .get(&format!("admin/quota/groups/{quotagroup}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete a quota group /// /// - `quotagroup`: quota group to delete pub async fn admin_delete_quota_group(&self, quotagroup: &str) -> Result<(), ForgejoError> { let request = self .delete(&format!("admin/quota/groups/{quotagroup}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Adds a rule to a quota group /// /// - `quotagroup`: quota group to add a rule to /// - `quotarule`: the name of the quota rule to add to the group pub async fn admin_add_rule_to_quota_group( &self, quotagroup: &str, quotarule: &str, ) -> Result<(), ForgejoError> { let request = self .put(&format!( "admin/quota/groups/{quotagroup}/rules/{quotarule}" )) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Removes a rule from a quota group /// /// - `quotagroup`: quota group to remove a rule from /// - `quotarule`: the name of the quota rule to remove from the group pub async fn admin_remove_rule_from_quota_group( &self, quotagroup: &str, quotarule: &str, ) -> Result<(), ForgejoError> { let request = self .delete(&format!( "admin/quota/groups/{quotagroup}/rules/{quotarule}" )) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List users in a quota group /// /// - `quotagroup`: quota group to list members of pub async fn admin_list_users_in_quota_group( &self, quotagroup: &str, ) -> Result<(UserListHeaders, Vec), ForgejoError> { let request = self .get(&format!("admin/quota/groups/{quotagroup}/users")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Add a user to a quota group /// /// - `quotagroup`: quota group to add the user to /// - `username`: username of the user to add to the quota group pub async fn admin_add_user_to_quota_group( &self, quotagroup: &str, username: &str, ) -> Result<(), ForgejoError> { let request = self .put(&format!("admin/quota/groups/{quotagroup}/users/{username}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Remove a user from a quota group /// /// - `quotagroup`: quota group to remove a user from /// - `username`: username of the user to remove from the quota group pub async fn admin_remove_user_from_quota_group( &self, quotagroup: &str, username: &str, ) -> Result<(), ForgejoError> { let request = self .delete(&format!("admin/quota/groups/{quotagroup}/users/{username}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List the available quota rules pub async fn admin_list_quota_rules( &self, ) -> Result<(QuotaRuleInfoListHeaders, Vec), ForgejoError> { let request = self.get("admin/quota/rules").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create a new quota rule /// /// - `rule`: Definition of the quota rule /// See [`CreateQuotaRuleOptions`] pub async fn admin_create_quota_rule( &self, rule: CreateQuotaRuleOptions, ) -> Result { let request = self.post("admin/quota/rules").json(&rule).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get information about a quota rule /// /// - `quotarule`: quota rule to query pub async fn admin_get_quota_rule( &self, quotarule: &str, ) -> Result { let request = self .get(&format!("admin/quota/rules/{quotarule}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Deletes a quota rule /// /// - `quotarule`: quota rule to delete pub async fn admin_delete_quota_rule(&self, quotarule: &str) -> Result<(), ForgejoError> { let request = self .delete(&format!("admin/quota/rules/{quotarule}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Change an existing quota rule /// /// - `quotarule`: Quota rule to change /// - `rule`: See [`EditQuotaRuleOptions`] pub async fn admin_edit_quota_rule( &self, quotarule: &str, rule: EditQuotaRuleOptions, ) -> Result { let request = self .patch(&format!("admin/quota/rules/{quotarule}")) .json(&rule) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get an global actions runner registration token pub async fn admin_get_runner_registration_token( &self, ) -> Result { let request = self.get("admin/runners/registration-token").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.headers().try_into()?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List unadopted repositories /// pub async fn admin_unadopted_list( &self, query: AdminUnadoptedListQuery, ) -> Result, ForgejoError> { let request = self.get(&format!("admin/unadopted?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Adopt unadopted files as a repository /// /// - `owner`: owner of the repo /// - `repo`: name of the repo pub async fn admin_adopt_repository( &self, owner: &str, repo: &str, ) -> Result<(), ForgejoError> { let request = self .post(&format!("admin/unadopted/{owner}/{repo}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete unadopted files /// /// - `owner`: owner of the repo /// - `repo`: name of the repo pub async fn admin_delete_unadopted_repository( &self, owner: &str, repo: &str, ) -> Result<(), ForgejoError> { let request = self .delete(&format!("admin/unadopted/{owner}/{repo}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Search users according filter conditions /// pub async fn admin_search_users( &self, query: AdminSearchUsersQuery, ) -> Result<(UserListHeaders, Vec), ForgejoError> { let request = self.get(&format!("admin/users?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create a user /// /// - `body`: See [`CreateUserOption`] pub async fn admin_create_user(&self, body: CreateUserOption) -> Result { let request = self.post("admin/users").json(&body).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete a user /// /// - `username`: username of user to delete pub async fn admin_delete_user( &self, username: &str, query: AdminDeleteUserQuery, ) -> Result<(), ForgejoError> { let request = self .delete(&format!("admin/users/{username}?{query}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Edit an existing user /// /// - `username`: username of user to edit /// - `body`: See [`EditUserOption`] pub async fn admin_edit_user( &self, username: &str, body: EditUserOption, ) -> Result { let request = self .patch(&format!("admin/users/{username}")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Add a public key on behalf of a user /// /// - `username`: username of the user /// - `key`: See [`CreateKeyOption`] pub async fn admin_create_public_key( &self, username: &str, key: CreateKeyOption, ) -> Result { let request = self .post(&format!("admin/users/{username}/keys")) .json(&key) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete a user's public key /// /// - `username`: username of user /// - `id`: id of the key to delete pub async fn admin_delete_user_public_key( &self, username: &str, id: u64, ) -> Result<(), ForgejoError> { let request = self .delete(&format!("admin/users/{username}/keys/{id}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create an organization /// /// - `username`: username of the user that will own the created organization /// - `organization`: See [`CreateOrgOption`] pub async fn admin_create_org( &self, username: &str, organization: CreateOrgOption, ) -> Result { let request = self .post(&format!("admin/users/{username}/orgs")) .json(&organization) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get the user's quota info /// /// - `username`: username of user to query pub async fn admin_get_user_quota(&self, username: &str) -> Result { let request = self.get(&format!("admin/users/{username}/quota")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Set the user's quota groups to a given list. /// /// - `username`: username of the user to modify the quota groups from /// - `groups`: list of groups that the user should be a member of /// See [`SetUserQuotaGroupsOptions`] pub async fn admin_set_user_quota_groups( &self, username: &str, groups: SetUserQuotaGroupsOptions, ) -> Result<(), ForgejoError> { let request = self .post(&format!("admin/users/{username}/quota/groups")) .json(&groups) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Rename a user /// /// - `username`: existing username of user /// - `body`: See [`RenameUserOption`] pub async fn admin_rename_user( &self, username: &str, body: RenameUserOption, ) -> Result<(), ForgejoError> { let request = self .post(&format!("admin/users/{username}/rename")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create a repository on behalf of a user /// /// - `username`: username of the user. This user will own the created repository /// - `repository`: See [`CreateRepoOption`] pub async fn admin_create_repo( &self, username: &str, repository: CreateRepoOption, ) -> Result { let request = self .post(&format!("admin/users/{username}/repos")) .json(&repository) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns a list of all gitignore templates pub async fn list_gitignores_templates(&self) -> Result, ForgejoError> { let request = self.get("gitignore/templates").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns information about a gitignore template /// /// - `name`: name of the template pub async fn get_gitignore_template_info( &self, name: &str, ) -> Result { let request = self.get(&format!("gitignore/templates/{name}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns a list of all label templates pub async fn list_label_templates(&self) -> Result, ForgejoError> { let request = self.get("label/templates").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns all labels in a template /// /// - `name`: name of the template pub async fn get_label_template_info( &self, name: &str, ) -> Result, ForgejoError> { let request = self.get(&format!("label/templates/{name}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns a list of all license templates pub async fn list_license_templates( &self, ) -> Result, ForgejoError> { let request = self.get("licenses").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns information about a license template /// /// - `name`: name of the license pub async fn get_license_template_info( &self, name: &str, ) -> Result { let request = self.get(&format!("licenses/{name}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Render a markdown document as HTML /// /// - `body`: See [`MarkdownOption`] pub async fn render_markdown(&self, body: MarkdownOption) -> Result { let request = self.post("markdown").json(&body).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.text().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Render raw markdown as HTML /// /// - `body`: Request body to render /// See [`String`] pub async fn render_markdown_raw(&self, body: String) -> Result { let request = self.post("markdown/raw").body(body).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.text().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Render a markup document as HTML /// /// - `body`: See [`MarkupOption`] pub async fn render_markup(&self, body: MarkupOption) -> Result { let request = self.post("markup").json(&body).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.text().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Returns the nodeinfo of the Forgejo application pub async fn get_node_info(&self) -> Result { let request = self.get("nodeinfo").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List users's notification threads /// pub async fn notify_get_list( &self, query: NotifyGetListQuery, ) -> Result<(NotificationThreadListHeaders, Vec), ForgejoError> { let request = self.get(&format!("notifications?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Mark notification threads as read, pinned or unread /// pub async fn notify_read_list( &self, query: NotifyReadListQuery, ) -> Result<(NotificationThreadListHeaders, Vec), ForgejoError> { let request = self.put(&format!("notifications?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 205 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Check if unread notifications exist pub async fn notify_new_available(&self) -> Result { let request = self.get("notifications/new").build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get notification thread by ID /// /// - `id`: id of notification thread pub async fn notify_get_thread(&self, id: &str) -> Result { let request = self.get(&format!("notifications/threads/{id}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Mark notification thread as read by ID /// /// - `id`: id of notification thread pub async fn notify_read_thread( &self, id: &str, query: NotifyReadThreadQuery, ) -> Result { let request = self .patch(&format!("notifications/threads/{id}?{query}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 205 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create a repository in an organization /// /// - `org`: name of organization /// - `body`: See [`CreateRepoOption`] pub async fn create_org_repo_deprecated( &self, org: &str, body: CreateRepoOption, ) -> Result { let request = self.post(&format!("org/{org}/repos")).json(&body).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get list of organizations /// pub async fn org_get_all( &self, query: OrgGetAllQuery, ) -> Result<(OrganizationListHeaders, Vec), ForgejoError> { let request = self.get(&format!("orgs?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create an organization /// /// - `organization`: See [`CreateOrgOption`] pub async fn org_create( &self, organization: CreateOrgOption, ) -> Result { let request = self.post("orgs").json(&organization).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get an organization /// /// - `org`: name of the organization to get pub async fn org_get(&self, org: &str) -> Result { let request = self.get(&format!("orgs/{org}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete an organization /// /// - `org`: organization that is to be deleted pub async fn org_delete(&self, org: &str) -> Result<(), ForgejoError> { let request = self.delete(&format!("orgs/{org}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Edit an organization /// /// - `org`: name of the organization to edit /// - `body`: See [`EditOrgOption`] pub async fn org_edit( &self, org: &str, body: EditOrgOption, ) -> Result { let request = self.patch(&format!("orgs/{org}")).json(&body).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get an organization's actions runner registration token /// /// - `org`: name of the organization pub async fn org_get_runner_registration_token( &self, org: &str, ) -> Result { let request = self .get(&format!("orgs/{org}/actions/runners/registration-token")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.headers().try_into()?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List an organization's actions secrets /// /// - `org`: name of the organization pub async fn org_list_actions_secrets( &self, org: &str, query: OrgListActionsSecretsQuery, ) -> Result<(SecretListHeaders, Vec), ForgejoError> { let request = self .get(&format!("orgs/{org}/actions/secrets?{query}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create or Update a secret value in an organization /// /// - `org`: name of organization /// - `secretname`: name of the secret /// - `body`: See [`CreateOrUpdateSecretOption`] pub async fn update_org_secret( &self, org: &str, secretname: &str, body: CreateOrUpdateSecretOption, ) -> Result<(), ForgejoError> { let request = self .put(&format!("orgs/{org}/actions/secrets/{secretname}")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(()), 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete a secret in an organization /// /// - `org`: name of organization /// - `secretname`: name of the secret pub async fn delete_org_secret(&self, org: &str, secretname: &str) -> Result<(), ForgejoError> { let request = self .delete(&format!("orgs/{org}/actions/secrets/{secretname}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get an org-level variables list /// /// - `org`: name of the organization pub async fn get_org_variables_list( &self, org: &str, query: GetOrgVariablesListQuery, ) -> Result<(VariableListHeaders, Vec), ForgejoError> { let request = self .get(&format!("orgs/{org}/actions/variables?{query}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get an org-level variable /// /// - `org`: name of the organization /// - `variablename`: name of the variable pub async fn get_org_variable( &self, org: &str, variablename: &str, ) -> Result { let request = self .get(&format!("orgs/{org}/actions/variables/{variablename}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Update an org-level variable /// /// - `org`: name of the organization /// - `variablename`: name of the variable /// - `body`: See [`UpdateVariableOption`] pub async fn update_org_variable( &self, org: &str, variablename: &str, body: UpdateVariableOption, ) -> Result<(), ForgejoError> { let request = self .put(&format!("orgs/{org}/actions/variables/{variablename}")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(()), 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create an org-level variable /// /// - `org`: name of the organization /// - `variablename`: name of the variable /// - `body`: See [`CreateVariableOption`] pub async fn create_org_variable( &self, org: &str, variablename: &str, body: CreateVariableOption, ) -> Result<(), ForgejoError> { let request = self .post(&format!("orgs/{org}/actions/variables/{variablename}")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(()), 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete an org-level variable /// /// - `org`: name of the organization /// - `variablename`: name of the variable pub async fn delete_org_variable( &self, org: &str, variablename: &str, ) -> Result, ForgejoError> { let request = self .delete(&format!("orgs/{org}/actions/variables/{variablename}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(Some(response.json().await?)), 201 => Ok(None), 204 => Ok(None), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List an organization's activity feeds /// /// - `org`: name of the org pub async fn org_list_activity_feeds( &self, org: &str, query: OrgListActivityFeedsQuery, ) -> Result<(ActivityFeedsListHeaders, Vec), ForgejoError> { let request = self .get(&format!("orgs/{org}/activities/feeds?{query}")) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Update Avatar /// /// - `org`: name of the organization /// - `body`: See [`UpdateUserAvatarOption`] pub async fn org_update_avatar( &self, org: &str, body: UpdateUserAvatarOption, ) -> Result<(), ForgejoError> { let request = self .post(&format!("orgs/{org}/avatar")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete Avatar /// /// - `org`: name of the organization pub async fn org_delete_avatar(&self, org: &str) -> Result<(), ForgejoError> { let request = self.delete(&format!("orgs/{org}/avatar")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Blocks a user from the organization /// /// - `org`: name of the org /// - `username`: username of the user pub async fn org_block_user(&self, org: &str, username: &str) -> Result<(), ForgejoError> { let request = self.put(&format!("orgs/{org}/block/{username}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List an organization's webhooks /// /// - `org`: name of the organization pub async fn org_list_hooks( &self, org: &str, query: OrgListHooksQuery, ) -> Result<(HookListHeaders, Vec), ForgejoError> { let request = self.get(&format!("orgs/{org}/hooks?{query}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok((response.headers().try_into()?, response.json().await?)), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Create a hook /// /// - `org`: name of the organization /// - `body`: See [`CreateHookOption`] pub async fn org_create_hook( &self, org: &str, body: CreateHookOption, ) -> Result { let request = self .post(&format!("orgs/{org}/hooks")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 201 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Get a hook /// /// - `org`: name of the organization /// - `id`: id of the hook to get pub async fn org_get_hook(&self, org: &str, id: u64) -> Result { let request = self.get(&format!("orgs/{org}/hooks/{id}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Delete a hook /// /// - `org`: name of the organization /// - `id`: id of the hook to delete pub async fn org_delete_hook(&self, org: &str, id: u64) -> Result<(), ForgejoError> { let request = self.delete(&format!("orgs/{org}/hooks/{id}")).build()?; let response = self.execute(request).await?; match response.status().as_u16() { 204 => Ok(()), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// Update a hook /// /// - `org`: name of the organization /// - `id`: id of the hook to update /// - `body`: See [`EditHookOption`] pub async fn org_edit_hook( &self, org: &str, id: u64, body: EditHookOption, ) -> Result { let request = self .patch(&format!("orgs/{org}/hooks/{id}")) .json(&body) .build()?; let response = self.execute(request).await?; match response.status().as_u16() { 200 => Ok(response.json().await?), _ => Err(ForgejoError::UnexpectedStatusCode(response.status())), } } /// List an organization's labels /// /// - `org`: name of the organization pub async fn org_list_labels( &self, org: &str, query: OrgListLabelsQuery, ) -> Result<(LabelListHeaders, Vec